可控的疯子 2019-04-11 21:32 采纳率: 0%
浏览 848
已结题

winform 怎么解决chartcontrol控件数据更新过快导致的索引超范围的问题

本来是想用Dev的chart控件写一个实时显示数据的示波器,用的是串口通信接口,波特率是14400,在下位机端是每一毫秒发送一次数据现在实现了每次接收到串口数据,产生事件后,将数据用图表的形式显示出来,但是执行一段时间后,在main函数处就会报错图片说明

尝试过在串口接收数据时,控件更新时收异常,但是最后报错都是如上图所示,开始以为的是dev的控件本身可能有bug,所以重新换用.netbar中realtime chart控件还是会出现相同的问题,而且抛出的异常和运行的时间没有必然的关系,有时候是接收了一小段时间就抛出异常,有时候是接收了较长一段时间后才会抛出这个是串口事件的代码

        private void ssp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (closing) return;
            try
            {
                Listening = true;
                byte[] buf = new byte[ssp.BytesToRead];

                ssp.Read(buf, 0, buf.Length);
                ssp.DiscardInBuffer();
                ssp.DiscardOutBuffer();

                for (int i = 0; i < buf.Length; i++)
                {
                    ChartRefresh(0, Convert.ToDouble(buf[i]));
                    ChartRefresh(1, 200.0);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            finally
            {
                Listening = false;//我用完了,ui可以关闭串口了。  
            }
        }

ChartRefresh刷新控件是后来改的是.netbar中实例的源码

然后,我把代码改成接收到串口数据的事件后,不对串口数据进行处理(只清了缓存,不读也不写),图表随意更新10次,100次,1000次数据,结果是更加容易出现异常,所以首先感觉是数据更新太快导致了控件刷新不过来

还请大佬们看看这个怎么破,怎么看到底是哪出了问题.....

  • 写回答

1条回答 默认 最新

  • threenewbee 2019-04-12 09:55
    关注

    你这段代码加上了try catch,按理说不会丢出异常,你看下丢出异常的时候的调用堆栈,是不是别的代码触发的。

    评论

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记