串口确定性

时间:2010-03-18 16:14:12

标签: linux serial-port

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

示例:

  1. foo程序运行并开始编写“A_VERY_LONG_COMMAND”
  2. 用户终止程序,但程序只写了“A_VERY”
  3. 用户再次运行程序,然后重新发送命令。除此之外,设备会看到“A_VERYA_VERY_LONG_COMMAND”,这不是我们想要的。
  4. 有没有办法让这个更具确定性?由于这样的问题,串口编程感觉非常失控。

3 个答案:

答案 0 :(得分:1)

我会猜测如果你打电话给write("A_VERY_LONG_COMMAND"),然后用户按Ctrl + C而字节输出就行,那么驱动程序层应该完成发送完整的缓冲区。如果用户在调用过程中中断,驱动程序层可能会忽略整个事情。

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

您是否可以控制设备端?实现超时以使设备忽略未完成或以其他方式损坏数据包可能是有意义的。

答案 1 :(得分:1)

所需方法取决于设备。

  • 串口有额外的控制信号线和串行数据线;也许其中一个会重置设备的输入。我从未完成串口编程,但我认为ioctl()处理这个问题。
  • 可能有一个字节会重置,例如一些控制角色。
  • 可能存在基于时间的信号,例如Hayes命令集调制解调器使用“暂停+++暂停”。
  • 在固定时间后没有收到完整命令后,它可能会重置。

了解设备最初是否支持交互式使用(串行终端),程序控制或两者兼有,这可能很有用。

答案 2 :(得分:1)

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

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

或者它是这样设计的,以便您可以发送命令终止(可能是换行符等,取决于命令协议)并可能在解析其缓冲区中的乱码部分命令时生成错误,查询/清除错误,然后好好去。

连接您的客户端程序以重复发送一些运行状况/状态/错误查询,直到您收到声音响应,然后才开始发送配置或操作命令,这不是一个坏主意。除非您可以通过查询确定设备处于合适的状态,否则在配置重置(如果可用)后,您可能不想采取任何措施并从头开始配置它。