jilindaxuemaxiao 2017-09-04 13:48 采纳率: 0%
浏览 1015

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 2017-09-05 03:37
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog