串口确定性

这似乎是一个简单的问题,但很难search。 我需要通过串口与设备连接。 如果我的程序(或其他)没有完成向设备写入命令,如何确保程序的下一次运行可以成功发送命令?

例:

  1. foo程序运行并开始编写“A_VERY_LONG_COMMAND”
  2. 用户终止程序,但程序只写了“A_VERY”
  3. 用户再次运行该程序,并重新发送该命令。 除了该设备看到“A_VERYA_VERY_LONG_COMMAND”,这不是我们想要的。

有没有办法让这个更具决定性? 由于这样的问题,串口编程感觉非常失控。

所需的方法取决于设备。

  • 串行端口具有附加的控制信号线以及串行数据线; 也许其中一个会重置设备的输入。 我从来没有做过串口编程,但我认为ioctl()处理这个问题。
  • 可能有一个字节会重置,例如一些控制字符。
  • 有可能是基于定时的信号,例如Hayes命令集调制解调器使用“暂停+++暂停”。
  • 它可能只是在固定的时间后没有收到完整的命令后重置。

了解设备最初是为了支持交互式使用(串行终端),程序控制还是两者兼而有之可能是有用的。

如果你调用write("A_VERY_LONG_COMMAND") ,然后用户点击Ctrl + C,当字节出去的时候,驱动程序层应该完成发送完整的缓冲区。 而如果用户在通话过程中断,驱动程序层可能会忽略整个事情。

以防万一,当你打开一个新的COM端口时,清除端口总是明智的。

你对设备端有控制吗? 实现超时可能会使设备忽略未完成或其他损坏的数据包。

应该实现嵌入式设备,以便您可以发送中止/清除/中断字符,将转储其命令缓冲区的内容,并为您的客户端应用程序启动提供一个干净的石板。

否则它应该提供一个软件重置字符,它将重置命令缓冲区和所有状态。

否则,它的设计可以让你发送一个命令终止符(可能是一个换行符等等,这取决于命令协议),并可能在解析缓冲区中出现的乱码部分命令时产生错误,查询/清除错误,然后很好去。

连接你的客户端程序,重复发送一些健康/状态/错误查询,直到你得到一个响应,然后才开始发送配置或操作命令,这不是一个坏主意。 除非可以通过查询确定设备处于合适的状态,否则可能不需要任何设置,并在配置重置(如果可用)后从零开始进行配置。