2 jilindaxuemaxiao jilindaxuemaxiao 于 2017.09.04 21:48 提问

WPF串口通信数据出队列操作得到null对象

代码:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
.
.
.
ComPort.DataReceived += new SerialDataReceivedEventHandler(ComReceive);//串口接收中断
Thread _ComRec = new Thread(new ThreadStart(ComRec)); //串口接收数据线程
_ComRec.Start();//启动线程
}

// 读串口数据,并进队列
private void ComReceive(object sender, SerialDataReceivedEventArgs e)
{
byte[] recBuffer;//接收缓冲区
try
{
recBuffer = new byte[ComPort.BytesToRead];//接收数据缓存大小
ComPort.Read(recBuffer, 0, recBuffer.Length);//读取数据
recQueue.Enqueue(recBuffer);//读取数据入列
}
catch{...}
}

//数据出队列,在数据接收线程中执行
void ComRec()
{
while (true)
{
if (recQueue.Count > 0)
{
byte[] recBuffer = (byte[])recQueue.Dequeue();//出列

                        ProcessData(recBuffer);//** 此处为出问题的地方**
              }
    }

}

问题描述:
波特率设为115200,发送端周期(10ms)性发送长度为78字节的数据。接收端运行一段时间后,ProcessData(recBuffer)出报错,此时数组recBuffer为null。
关于发送周期:115200/8 > 78/10ms,即10ms满足速率要求。当发送周期从10ms改成100ms的时候,recBuffer为null的现象似乎很少出现了。

求问:数据出队列得到null数组的原因是什么?怎样修改可以避免这个问题?

求高人指点,小弟感激不尽!

1个回答

zbbfb2001
zbbfb2001   2017.09.05 11:37

在ComPort.DataReceived事件中,注册了ComReceive()。
在ComReceive()被调用是,你往queue里面写入了数据,但同时又另一个线程子取queue里面的数据。
也就是说,意味着多个线程可能同时操作同一个queue,个人觉得需要加锁操作。
根据你问题的描述,问题时而发生,时而不发生,很有可能就是竞争问题导致的。

Csdn user default icon
上传中...
上传图片
插入图片