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

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 #MATLAB仿真#车辆换道路径规划
  • ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
  • ¥15 数据可视化Python
  • ¥15 要给毕业设计添加扫码登录的功能!!有偿
  • ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
  • ¥15 微信公众号自制会员卡没有收款渠道啊
  • ¥100 Jenkins自动化部署—悬赏100元
  • ¥15 关于#python#的问题:求帮写python代码
  • ¥20 MATLAB画图图形出现上下震荡的线条
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘