读取二进制数据时未观察到C#串行端口读取超时

时间:2019-04-11 18:18:55

标签: c# serial-port synchronous

我正在与使用二进制串行通信的一项旧技术进行通信。 该协议基于同步的主/从协议,通过发送请求消息和接收响应来进行。

在使用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个字节的内容而定长度。

0 个答案:

没有答案