Как ждать ввода от последовательного порта в середине программы - PullRequest
4 голосов
/ 12 июля 2011

Я пишу программу для управления модемом Iridium, который связывается со спутником.После того, как каждая AT-команда отправлена, модем отправляет ответ обратно (в зависимости от команды), чтобы указать, что команда была успешной.

Сейчас я реализовал ее так, что программа просто ждет 10 секунд между передачейкаждая команда для модема, но это немного рискованно, потому что не позволяет обрабатывать ошибки в случае, если команда не была успешно интерпретирована.Единственный способ, которым я знаю, как читать последовательный ввод, - это while(fgets( , ,)), поэтому мне интересно, как я смогу заставить программу ожидать ответа от модема через последовательный порт и проверить, что это такое, до того, как следующая командаотправлено вместо единой задержки.

Я использую ОС Linux.

FILE *out = fopen(portName.c_str(), "w");//sets the serial port

for(int i =0; i<(sizeof(messageArray)/sizeof(messageArray[0])); i++)
{
  //creates a string with the AT command that writes to the module
  std::string line1("AT+SBDWT=");
  line1+=convertInt( messageArray[i].numChar);
  line1+=" ";
  line1+=convertInt(messageArray[i].packetNumber);
  line1+=" ";
  line1+=messageArray[i].data;
  line1+=std::string("\r\n");

  //creates a string with the AT command that initiates the SBD session
  std::string line2("AT+SBDI");
  line2+=std::string("\r\n");

  fputs(line1.c_str(), out); //sends to serial port
  usleep(10000000);     //Pauses  between the addition of each packet.

  fputs(line2.c_str(), out); //sends to serial port

  usleep(10000000); 
}

Ответы [ 2 ]

5 голосов
/ 12 июля 2011

Используйте выберите или опрос в дескрипторе файла, соответствующем последовательному порту, который вернется, когда дескриптор будет готов к чтению.

Что-то вроде этого:

int fd = fileno(stdin);  /* If the serial port is on stdin */
fd_set fds;
FD_ZERO(&fds);
FD_SET(fd, &fds);
struct timeval timeout = { 10, 0 }; /* 10 seconds */
int ret = select(fd+1, &fds, NULL, NULL, &timeout);
/* ret == 0 means timeout, ret == 1 means descriptor is ready for reading,
   ret == -1 means error (check errno) */
2 голосов
/ 12 июля 2011

Чтобы оставаться как можно ближе к вашей модели, вы можете сделать пару вещей:

1) Использовать простой дескриптор файла (через open ()).Кроме того, тогда вы будете использовать read () и write () для связи с последовательным портом.

2) Использование 1 выше позволяет вам использовать select, чтобы увидеть, готово ли что-нибудь написать или прочитать.

Это также позволит вам перенести связь с модемом в другой поток, если есть другие вещи, которые ваша программа должна делать ...

Недавно я сделал нечто очень похожее только сМодем HF Radio и использовала библиотеку Boost ASIO для связи через последовательный порт.

Это может помочь, если это вариант.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...