Я общаюсь со старой технологией, которая использует двоичную последовательную связь.
Протокол работает на основе синхронного главного / подчиненного устройства с отправленным сообщением-запросом и полученным ответом.
Я использовал связь через последовательный порт довольно много раз прежде, однако это использует данные 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 байтов.