1

我必须在我的项目中阅读许多 (8) 个串行设备。它们是 Pantilt、相机、GPS、指南针等。它们都是 RS232 设备,但它们具有不同的命令结构和行为。例如,只要我打开端口,GPS 就会开始发送数据。PanTilt 和 Camera 只有在我向它们发送特定命令时才会响应。

我使用以下环境

  • 操作系统:Ubuntu 11.10
  • 语言:C++
  • 框架:Qt 4.7

对于 PanTilt 和 Camera,我想开发这样的功能。

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);

为了做这样的事情,我需要严格的同步行为。有人知道如何解决这个问题吗?

4

3 回答 3

1

我发现本教程非常有趣且很有帮助。 http://www.webalice.it/fede.tft/serial_port/serial_port.html

它展示了 boost::asio 如何用于执行同步和异步读/写。

感谢您的帮助!

于 2012-05-02T19:07:24.533 回答
0

使用标准文件 API 有什么问题?

fd = open("/dev/ttyX");
write(fd, command.cstr(), command.size());
vector v(MAX_SIZE);
read(fd,&v[0], MAX_SIZE);
于 2012-04-30T19:45:12.477 回答
0

Qt 中与串行端口的低级通信可以通过QExtSerialPort部分实现QIODevice接口的库来建立。

您必须自己实现的高级协议。

于 2012-04-30T19:55:15.573 回答