C # Тайм-аут последовательного порта не наблюдается при чтении двоичных данных - PullRequest
0 голосов
/ 11 апреля 2019

Я общаюсь со старой технологией, которая использует двоичную последовательную связь. Протокол работает на основе синхронного главного / подчиненного устройства с отправленным сообщением-запросом и полученным ответом.

Я использовал связь через последовательный порт довольно много раз прежде, однако это использует данные 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 (буфер, 0,6)

Он должен ждать 6 байтов или выдавать исключение TimeoutException, если этого не произошло в период ожидания. Но, похоже, этого не происходит, я получаю TimeoutException, только если данные не получены. Функция возвращает всякий раз, когда она читает какие-либо данные, поэтому иногда я получаю 6 байтов, иногда 1 и т. Д. И т. Д.

Теперь, если я всегда ожидал 6 байтов, я могу просто сделать

if (comport.BytesToRead <6) return; </p>

Но сообщения, которые я получаю, могут иметь переменную длину в зависимости от содержимого первых 2 байтов.

...