在串口通讯中可能会遇到一些问题,现基于工作中遇到的情况做一个总结
第一类:消息收发控制
具体描述:当发送一条消息后,在收到数据之后才能算正常流程走完,再执行其他数据的发送
这种情况可通过AutoResetEvent这个类进行控制消息发送与接收,具体用法如下:
AutoResetEvent receiveSignal = new AutoResetEvent(false);
AutoResetEvent sendSignal = new AutoResetEvent(false);
void Send(byte[] data)
{
this._serialPort.Write();
this.sendSignal .Set();
this.receiveSignal.WaitOne();
}
private void _serialPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
this.sendSignal.WaitOne();
//接收处理
this.receiveSignal.Set();
}
多线程问题
描述:当同一个串口封装类中的方法,如发送方法被多个线程同时调用时,可能导致接收的数据不正确,可以使用Lock对发送加锁
private object lockObject = new object(); // 用于锁定的对象
public void Write(string data)
{
lock (lockObject) // 锁定
{
serialPort.WriteLine(data);
}
}