В .NET компонент SerialPort порой вызывал некоторые эмоции,
Сообщение от eddy
|
(хотя более подходящим было бы нецензурное слово)
|
Требовался прием символов ASCII (байтов в диапазоне 0x20..0xFF), использовалась функция
SerialPort.Readline(); функция блокирующая - возвращает управление при получении строки, заданной в свойстве
SerialPort.NewLine (по умолчанию это "\n").
Размер входных пакетов не превышал размеров приемного буфера.
Делалось так:
1) Все посылки извне на приемник SerialPort заканчивались символом '\n' (ну или иным, который задается в свойстве
SerialPort.NewLine). Понятно, что сам символ не должен встречаться в середине пакета.
2) Данные вычитывались как строка
в отдельном потоке, поскольку чтение - блокирующая операция.
3) После получения и/или анализа строковых данных предпринимались нужные действия (установить флаг/сгенерировать событие/отослать ответ и т.д.)
PHP код:
|
// это в отдельном потоке
...
while (true)
{
try
{
var packet = _port.ReadLine();
if (packet.StartsWith("$SY")) // наш пакет
{
// тут делаем что нужно
//_port.Write(_dataToSend, 0, _dataToSend.Length);
}
}
catch (TimeoutException)
{
// делаем что-то (или ничего не делаем)
Console.WriteLine("Timeout");
}
catch (Exception exc)
{
// сохранить Exception для внешнего мира
break;
}
}
...
|