В моем сценарии есть один или два последовательных порта. Если настроен только один порт, этот порт может быть выделен для ПЛК или для шкалы.
ПЛК связывается только тогда, когда пользователь нажимает какую-либо кнопку на машине, а вместо этого шкала постоянно опрашивает взвешенное измеренное значение. Если настроен только один порт, проблем нет.
Когда два порта настроены, протокол связи немного меняется, если пользователь нажимает кнопку веса ПЛК, ПЛК отправляет запрос веса. Если этот запрос прослушивается при событии DataReceived, порт Scale открывается, и запрашиваемое значение восстанавливается.
Теперь я должен признать, что устаревший код, который я вставлю сюда, не является наилучшим возможным кодом, и это плохо, что он использует одно и то же событие DataReceived для обоих портов; но этот код работал довольно долго (около шести лет). Недавно Масштаб был изменен, и программа перестала работать должным образом (только в конфигурации с двумя портами), вызывая системное исключение тайм-аута. Я прослушал трафик и ничего не изменилось с протоколом или форматом данных.
Вот проблемный кусок кода:
private void SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
lock (_myLockSerialPort)
{
string source = "No Data" ;
try
{
if (sender == null)
return;
SerialPort genericPort = (SerialPort)sender;
if (genericPort.Equals(ScalePort))
{
if (genericPort.BytesToRead > 0)
{
source = "Scale" ;
string datas = string.Empty;
datas = genericPort.ReadTo(_currentConfiguration.ReadToForPese);
ReadDataFromScale(genericPort, datas);
}
}
else
{
if (genericPort.BytesToRead > 0)
{
source = "PLC" ;
string datas = string.Empty;
datas = genericPort.ReadTo(_currentConfiguration.ReadToForPlc);
ReadDataFromPlc(genericPort, datas);
}
}
}
catch (TimeoutException timeoutException)
{
//Handle Timeout
}
catch (Exception err)
{
//Handle Other Errors
}
}
}
Вопрос в том, есть ли что-то в методе ReadTo или в интервале опроса, которое может объяснить это поведение.
Я хотел бы подчеркнуть, что ничего в формате обмена данными не изменилось, поэтому символ, используемый для прекращения связи, все еще остается на месте (и присутствует в перехваченном трафике).