C#接收串口数据怎么样用波形图显示出来

.Net技术 码拜 4年前 (2016-02-29) 552次浏览
最近在做一个传感器上位机部分,用的C# 做的,做的时候遇到两个问题
1.串口无法接收信息
2.怎么样把接受的信息用波形图即时的表现出来

 
  private void btnSend_Click(object sender, EventArgs e)
        {
            if (isOpen)//写串口数据
            {
                try
                {
                   
                    sp.WriteLine(tbxSendData.Text);
                }
                catch (Exception)
                {
                    MessageBox.Show("发送数据时发生错误!", "错误提示");
                    return;
                }
            }
            else
            {
                MessageBox.Show("串口未打开!", "错误提示");
                return;
            }
            if (!CheckSendData())//检测要发送的数据
            {
                MessageBox.Show("请输入要发送的数据!", "错误提示");
                return;
            }
            lblStatus.Text = "提示!";
        }
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            System.Threading.Thread.Sleep(100);//延时 100ms 等待接收完数据
                                               //this.Invoke 就是跨线程访问 ui 的方法,也是本文的范例
            this.Invoke((EventHandler)(delegate
            {
                if (isHex == false)
                {
                    tbxRecvData.Text += sp.ReadLine();
                }
                else
                {
                    Byte[] ReceivedData = new Byte[sp.BytesToRead]; //创建接收字节数组
                    sp.Read(ReceivedData, 0, ReceivedData.Length); //读取所接收到的数据
                    String RecvDataText = null;
                    for (int i = 0; i < ReceivedData.Length - 1; i++)
                    {
                        RecvDataText += ("0x" + ReceivedData[i].ToString("X2") + " ");
                    }
                    tbxRecvData.Text += RecvDataText;
                }
                sp.DiscardInBuffer();//丢弃接收缓冲区数据
            }));
        }
解决方案

5

画波形还是用gdi+本人画吧,不是很麻烦的。

5

关键功能一个都没做出来啊。
数据接受完,需要一个画布,例如picturebox,form等等,在这个上需要定义坐标系和原点。
把从串口接收的数据,转换成可以在你的坐标系内显示的点。

5

例如,你选择100个点在坐标系内显示,定义一个数组,从串口读取完数据,就更新这个数组,然后重新划线。
系统有自带的画曲线的函数,不用你一个个去画。

5

不用本人实现画波形图  网上有现成的状态波形图控件  下一个调用就可以了

20

随便看几秒钟你贴的代码,一看到第一条语句

System.Threading.Thread.Sleep(100);

以及你写的代码注释,就能想象得到你的程序将会多么“卡顿、耗费资源”了。
一个比较好一点的通讯程序,绝不会这样去 Sleep 的。写这个语句,你在有了数据必须接收的时候,反而还去“故意阻塞100毫秒),这个自相矛盾的逻辑其实就说明了设计上“不靠谱”。你 Sleep 多长时间才能保证“缓冲区里恰好收到了消息结束符”?听天有名吧!所以你选择了一个比较长的阻塞时间。
然后你又不敢选择一个较长的时间,原因是假如时间越长,程序卡得越惨。
这种自相矛盾的流程其实很可笑的,写Sleep代码其实是一种比较幼稚的代码。你应该立刻接收数据,然后判断有没有接收到消息结束符。假如没有接收到,就把接收信息保存到 List<byte> 或 MemoryStream 之类的数据结构中就行了,等以后接受到消息结束符时才统一处理。
写Sleep语句,就说明你的程序一定不流程。而占用线程、又阻塞线程的编程习惯,假如线程稍微多一些,不但会让你的CPU标高,而且还会让物理内存不够用。


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#接收串口数据怎么样用波形图显示出来
喜欢 (0)
[1034331897@qq.com]
分享 (0)