在做的项目中,主要是和串口通讯。
现在要从下位机接收数据,绘制成图形
以下是本人的代码,本人是初学者。我知道我的代码写的相当粗糙,肯定不够合理和严格,欢迎大家批评指正。
控件有1个mscomm,
现在遇到的问题是,绘图区没有图形显示,按理来说不管我从下位机发送的是什么数,都会变成二进制数发送到上位机吧,但是为什么没有显示,求大神指导。虽然有表格 但是我没用到,先不管吧。可能您有其他的方法绘图,但是我初学搞不懂,就想在我现在这个上面改进,求指导 谢谢 

解决方案 »

  1.   

    你要实时输出,应该放一个Timer控件,在Timer_time()事件里写你的输出代码。
      

  2.   

    代码是在 comEvSend 的时候调用 Draw() 的啊,也就是发送完成才绘图的。
    和你说的“接收数据,绘制成图形”根本不是一回事啊!
      

  3.   

    以二进制读取数据,需要经处理才能成为有用数据。
    你的接收代码对datatemp数组复制根本行不通。
    对接收的二进制字节处理是否符合通信协议规约要求?
      

  4.   

    1、VB的控件响应程序处理有延迟,有时在产生通讯接收事件到你提取数据时,你的串口事件里面只是接收第一、二个字节的数据,后面的数据都被你扔掉了,导致数据就这样眼睁睁的丢失了。
    2、VB串口控件的接收事件里面,你确定低字节是/256而不是x256?那样你接收到的数据都只是0~255的整数?0~255的范围画到0~3000的画布上,最大才10%的幅值?
    3、你的draw()实时绘制为啥用for循环绘图?每次只绘制出接收到的数据不就行了么?
    4、超过3000个数据后为啥要清屏?直接把画布左移不就行了么?
    5、你在控件接收事件里面做那么多其他事,那些事物处理时间如果超过你的串口中断时间,那么你可能一直在丢失数据永远无法绘制出实时数据的图形。就你这个项目来说,做法一般是这样子来:
    1、定义一个结构Data,里面有一个整数数Array组用来保存接收到的数据、一个整数用来标定当前最新数据的指针DataIndex、一个整数用来刷新显示的指针DspIndex;
    2、串口接收事件中断时,只是简单的把接收到的数据转换后放到上面的结构Data.Array(DataIndex)中,并更新最新数据指针Data.DataIndex;
    3、然后,用一个timer控件,定时值设为20,然后在定时中断事件里面绘制绘制图像。绘制时,从刷新显示指针Data.Array(DspIndex)一直绘制到Data.Array(DataIndex),然后更新DspIndex为当前绘制的右游标即可。置于画布左移,picbox控件本身就有这个方法,你可以自己搜索相关的知识。如果真正的想做到实时采集显示,建议你还是用多线程吧。开另外的一个线程用串口API异步采集数据,能最大限度的保证不丢失数据,同时还可以做处理接收数据错误时用特定数据代替,在绘图时用虚线代替错误的值来绘图更人性化。至于其他的要说的,就是人眼的视觉残留时间一般考虑为小于20ms,所以你可以考虑下位机每10ms发一次数据包,然后根据10ms产生的字节数设置中断字节数,这样减轻串口中断事件的负担。