我使用UART接口连接了两个设备(不是RS-232,因此没有控制线)。 由于API和硬件访问受限,无法修改 传输方案(例如,修改奇偶校验或停止位设置)。 所以我只能在两个设备之间传输字节。
一个设备充当主设备,应该启动连接 (将其设置为已定义的状态),向响应的客户端发送命令 一个相应的答案。实际的协议取决于我,但它应该包括 几个没有参数的命令,定义长度的参数(例如3个字节) 和任意长度的二进制数据传输。
我定义了一个简单的协议,其中第一个字节包含一个命令编号以及编码为标志的参数的数量和类型,因此客户端可以实现为一个简单的状态机。
我的问题是,如果主人失去连接(例如由于崩溃), 如果客户端是,它无法重置客户端并将其带到已定义的状态 当前正在等待命令参数或二进制传输的数据。
有些人使用黑名单'例如将字节 0xFF 定义为reset 命令出现在哪里,但这会破坏我的任意要求 二进制传输(或者我必须重新编码数据)。
您是否有任何其他想法如何定义协议,以便它允许主人 重置客户端,无论它当前处于什么 state (它已经收到了什么)?
答案 0 :(得分:1)
您可以将客户端编程为在非初始状态传递一定时间后没有传入数据时自行重置。在重新启动时,主设备将在发送第一个命令之前等待稍长的时间,从而保证客户端在通信开始时处于正确的状态。您可能还希望实现在(重新)启动时发送的初始状态命令,以检查先前的传输是否超时或是否已正确接收。
如果没有共享时钟源,您可以用足够的余量测量UART位时间的超时,或者将超时设置为高于该值的几个数量级,例如1s。
无论如何简单,如果由于任何原因应用程序具有严格的时序要求,这种方法需要仔细考虑,这些时序要求会因作为主要初始化序列的一部分而执行的等待而受到影响。