我有一个奇怪的问题。
需要使用自定义协议与串行设备通信,协议如下,我使用标准ASCII简写。
1.程序发送SOH以开始传输 2.程序发送STX + 数据 + ETX数据包(我实际上一次发送SOH和此数据包) 3.设备发送ACK以确认已接收数据包 4.现在我的程序发送EOT以表示传输结束
如果消息是需要回答的请求,则设备将发送数据。由于SerialPort.DataReceived的工作方式,我必须手动将接收到的消息拼接起来。步骤如下:
1. 设备发送SOH+ STX+数据 2. 设备发送其他字节,以ETX结尾 3. 我的程序已完全接收数据包后发送ACK 4. 设备发送EOT
这基本上是它们之间的通信方式,不考虑丢失的数据包和NAKs等情况,但我不想让程序在我正在重新拼接接收到的消息时发送新消息。
我尝试使用Monitor.Enter()和Monitor.Exit(),但接收事件在不同的线程上调用,所以行不通。
我还尝试使用Semaphore,只有一个资源,开始发送或接收时调用semaphore.WaitOne(),在发送EOT和从设备接收EOT后调用semaphore.Release()。这也不太好用。
有更好的方法吗?
需要使用自定义协议与串行设备通信,协议如下,我使用标准ASCII简写。
1.程序发送SOH以开始传输 2.程序发送STX + 数据 + ETX数据包(我实际上一次发送SOH和此数据包) 3.设备发送ACK以确认已接收数据包 4.现在我的程序发送EOT以表示传输结束
如果消息是需要回答的请求,则设备将发送数据。由于SerialPort.DataReceived的工作方式,我必须手动将接收到的消息拼接起来。步骤如下:
1. 设备发送SOH+ STX+数据 2. 设备发送其他字节,以ETX结尾 3. 我的程序已完全接收数据包后发送ACK 4. 设备发送EOT
这基本上是它们之间的通信方式,不考虑丢失的数据包和NAKs等情况,但我不想让程序在我正在重新拼接接收到的消息时发送新消息。
我尝试使用Monitor.Enter()和Monitor.Exit(),但接收事件在不同的线程上调用,所以行不通。
我还尝试使用Semaphore,只有一个资源,开始发送或接收时调用semaphore.WaitOne(),在发送EOT和从设备接收EOT后调用semaphore.Release()。这也不太好用。
有更好的方法吗?