在线程中通过阻塞方式读串口数据
void SerialReadBinaryProc()
{
while (IsOpen)
{
int r = -1;
try
{
r = _serial.ReadByte();
}
catch (System.TimeoutException E)
{
Debug.Log("READ BINARY PROC WARNING: [" + portName + "]" + E.Message);
}
catch (Exception E)
{
Close();
Debug.Log("READ BINARY PROC ERROR: [" + portName + "]" + E.Message);
break;
}
// print(string.Format("{0:X2}", r));
if (-1 != r)
{
// ...
}
}
}
当在主线程或者其他线程向串口写入数据时,会导致_serial.ReadByte()得到一个System.TimeoutException异常,正常逻辑进入下一次循环,调用_serial.ReadByte(),但是,异常超时以后的ReadByte函数总会丢失1子节**(不论延迟多长时间,第一个发送给上位机的数据,ReadByte总会丢失)**。
这个问题暂时不知道是什么问题造成的,目前的解决方案是给串口增加读超时,让串口在没有数据抵达时自然超时,,写入数据时不会导致TimeoutException异常,则不会导致丢失数据数据
_serial.ReadTimeout = 10;
更保险的改进方案是将读写合并到一个线程,保证在写数据时串口不会调用读函数。
void SerialReadWriteBinaryProc()
{
while (IsOpen)
{
int r = -1;
try
{
r = _serial.ReadByte();
}
catch (System.TimeoutException E)
{
Debug.Log("READ BINARY PROC WARNING: [" + portName + "]" + E.Message);
}
catch (Exception E)
{
Close();
Debug.Log("READ BINARY PROC ERROR: [" + portName + "]" + E.Message);
break;
}
// print(string.Format("{0:X2}", r));
if (-1 != r)
{
// ...
}
// write
byte[] bincmd = null;
lock (this)
{
if (writeCommands.Count > 0)
{
bincmd = writeCommands[0];
writeCommands.RemoveAt(0);
}
}
if (null != bincmd)
{
try
{
_serial.Write(bincmd, 0, bincmd.Length);
}
catch (System.Exception e)
{
Debug.Log(e.Message);
}
Thread.Sleep((int)(writeInterval * 1000.0f));
}
}
}