最近在做一个传感器上位机部分,用的C# 做的,做的时候遇到两个问题
1.串口无法接收信息
2.怎么样把接受的信息用波形图即时的表现出来
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等等,在这个上需要定义坐标系和原点。
把从串口接收的数据,转换成可以在你的坐标系内显示的点。
数据接受完,需要一个画布,例如picturebox,form等等,在这个上需要定义坐标系和原点。
把从串口接收的数据,转换成可以在你的坐标系内显示的点。
5
例如,你选择100个点在坐标系内显示,定义一个数组,从串口读取完数据,就更新这个数组,然后重新划线。
系统有自带的画曲线的函数,不用你一个个去画。
系统有自带的画曲线的函数,不用你一个个去画。
5
不用本人实现画波形图 网上有现成的状态波形图控件 下一个调用就可以了
20
随便看几秒钟你贴的代码,一看到第一条语句
System.Threading.Thread.Sleep(100);
以及你写的代码注释,就能想象得到你的程序将会多么“卡顿、耗费资源”了。
一个比较好一点的通讯程序,绝不会这样去 Sleep 的。写这个语句,你在有了数据必须接收的时候,反而还去“故意阻塞100毫秒),这个自相矛盾的逻辑其实就说明了设计上“不靠谱”。你 Sleep 多长时间才能保证“缓冲区里恰好收到了消息结束符”?听天有名吧!所以你选择了一个比较长的阻塞时间。
然后你又不敢选择一个较长的时间,原因是假如时间越长,程序卡得越惨。
这种自相矛盾的流程其实很可笑的,写Sleep代码其实是一种比较幼稚的代码。你应该立刻接收数据,然后判断有没有接收到消息结束符。假如没有接收到,就把接收信息保存到 List<byte> 或 MemoryStream 之类的数据结构中就行了,等以后接受到消息结束符时才统一处理。
写Sleep语句,就说明你的程序一定不流程。而占用线程、又阻塞线程的编程习惯,假如线程稍微多一些,不但会让你的CPU标高,而且还会让物理内存不够用。