我正在与使用二进制串行通信的一项旧技术进行通信。 该协议基于同步的主/从协议,通过发送请求消息和接收响应来进行。
在使用ASCII数据之前,我已经使用串口通信很多次了。使用ReadLine对ASCII数据可以观察到串行端口的读取超时,但是似乎没有观察到使用Read命令,而是只要接收到任何数据,该函数就会返回。
请参见下面的基本示例
SerialPort comport;
public void SetupSerial()
{
comport = new SerialPort("COM1");
comport.BaudRate = 9600;
comport.Parity = Parity.None;
comport.DataBits = 8;
comport.StopBits = StopBits.One;
comport.DataReceived += Comport_DataReceived;
comport.ReadTimeout = 5000;
comport.Open();
}
private void Comport_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
byte[] buffer = new byte[1024];
int bytesRead = 0;
try
{
bytesRead = comport.Read(buffer, 0, 6);
}
catch(TimeoutException tex)
{
Console.WriteLine("Timeout Exception!");
}
Console.WriteLine(bytesRead.ToString() + " Bytes Read!");
}
现在,据我了解,该怎么办?
comport.Read(buffer,0,6)
它应该等待6个字节或抛出TimeoutException,如果超时期间未发生。但这似乎没有发生,如果没有数据接收,我只会得到一个TimeoutException。该函数在读取任何数据时都会返回,因此有时我会收到6个字节,有时会收到1个字节,等等。
现在,如果我一直期望6个字节,我就可以做到
if(comport.BytesToRead <6)return;
但是我收到的消息可以根据前2个字节的内容而定长度。