2012-04-30 2 views
1

Мне нужно прочитать много (8) последовательных устройств в моем проекте. Это Pantilt, Camera, GPS, Compass и т. Д. Все они являются устройствами RS232, но они имеют разную структуру команд и поведение. например, GPS начинает отправлять данные как в ближайшее время, когда я открою порт. где PanTilt и Camera реагируют только при отправке им определенных команд.Блокировка последовательного порта Чтение

Я использую следующую среду

  • ОС: Ubuntu 11,10
  • Язык: C++
  • Framework: Qt 4,7

Для PanTilt и камеры Я хочу разработать функцию, как это.

int SendCommand(string& command, string& response) 
{ 
    port.write(command, strlen(command)); 
    while(1) 
    { 
     if(response contains '\n') break; 
     port.read(response) // Blocking Read 
    } 
    return num_of_bytes_read; 
} 

Я хочу реализовать этот способ, как эта функция будет использоваться в качестве строительного блока для более сложного алгоритма как это ...

SendCoammd("GET PAN ANGLE", &angle); 
    if(angle > 60) 
    SendCommand("STOP PAN", &stopped?); 
    if(stopped? == true) 
     SendCommand("REVERSE PAN DIRECTION", &revesed?); 
     if(reversed? == true) 
      SendCommand("START PAN", &ok); 

Чтобы сделать что-то вроде этого мне нужно строгое синхронное поведение. Кто-нибудь есть идеи, как подойти к этому?

+0

(несвязанное примечание nitpicker: передача 'string &' не является хорошей идеей, возможно, вы хотите 'const string &' или просто 'string', а также' strlen' на 'string' не имеет смысла, вы должны использовать его метод 'size') –

ответ

0

В чем проблема с использованием стандартного API файлов?

fd = open("/dev/ttyX"); 
write(fd, command.cstr(), command.size()); 
vector v(MAX_SIZE); 
read(fd,&v[0], MAX_SIZE); 
+0

Да, я могу это сделать. Я уже пробовал QextSerialPort на qt, но использовал режим SerilalPort в :: EventDriven. поэтому я должен реализовать сигнал readyRead(). Это асинхронное чтение. Но для моего приложения я считаю, что синхронная запись/чтение должны быть полезными. Как-то QextSerialPort не работает с :: Режим опроса. – newbee

+0

write and read are synchonous – Baget

0

связи низкого уровня с последовательным портом в Qt может быть установлена ​​с QExtSerialPort библиотеки, которые частично реализует интерфейс QIODevice.

Протоколы высокого уровня, которые вы должны реализовать самостоятельно.

+1

Я попробовал QextSerialPort, он работает в :: EventDriven режиме, но не в :: Опросе. Мне кажется, мне нужно создать режим SerialPort in :: Polling, поскольку мне нужно синхронное Write/Read. Это верно? Как-то опрос не работает. Я отправлю код в ближайшее время. Спасибо! – newbee

+0

@ user1366507, может быть, некоторые случаи не работают (я использую относительно старую версию этой библиотеки и не поддерживает даже события), но вы всегда можете перейти от событий к блокированию с помощью дополнительного потока. – Lol4t0

1

Я нашел этот учебник очень интересным и полезным.

Он показывает, как boost :: asio может использоваться для синхронной и асинхронной чтения/записи.

Благодарим за помощь!

+0

Это скорее комментарий к вашему вопросу (или вы можете отредактировать вопрос), а не ответ. – hlovdal

Смежные вопросы