【问题标题】:Blocking Serial Port Read阻止串行端口读取
【发布时间】:2012-05-10 11:55:29
【问题描述】:

我必须在我的项目中读取许多 (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);

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

【问题讨论】:

  • (无关的挑剔注意:传递string & 不是一个好主意,可能你想要const string & 或只是string;另外,string 上的strlen 没有意义,你应该使用它的size 方法)

标签: c++ qt ubuntu serial-port


【解决方案1】:

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

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

【讨论】:

  • 是的,我能做到。我已经在 qt 上尝试过 QextSerialPort,但在 ::EventDriven 模式下使用了 SerilalPort。所以我必须实现 readyRead() 信号。这是异步读取。但是对于我的应用程序,我认为同步写入/读取应该很有用。不知何故,QextSerialPort 不适用于 ::Polling 模式。
【解决方案2】:

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

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

【讨论】:

  • 我试过 QextSerialPort,它在 ::EventDriven 模式下工作,但在 ::Polling 模式下不工作。我想我需要在 ::Polling 模式下创建 SerialPort,因为我需要同步写入/读取。那是对的吗?不知何故,轮询不起作用。我会尽快发布代码。谢谢!
  • @user1366507,可能在某些情况下不起作用(我使用该库的相对较旧版本,它甚至不支持事件),但您始终可以使用附加线程从事件转移到阻塞模式。
【解决方案3】:

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

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

感谢您的帮助!

【讨论】:

  • 这应该是对您的问题的评论(或者您可以编辑问题)而不是答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多