C#接收串口数据如何用波形图显示出来?

AK_GCC 2016-05-07 09:30:18
最近在做一个传感器上位机部分,用的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();//丢弃接收缓冲区数据
}));
}
...全文
1649 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujilun_001 2017-11-22
  • 打赏
  • 举报
回复
写的都很好,学习中
mjp1234airen4385 2016-06-17
  • 打赏
  • 举报
回复
引用 9 楼 akaiyijian001 的回复:
[quote=引用 8 楼 sp1234 的回复:] 写Sleep语句,就说明你的程序一定不流程 --> 写Sleep语句,就说明你的程序一定不流畅 要提高编写通讯程序的质量,就从删除Sleep 着手吧!通过删除了这类明显是自相矛盾的语句,开始学会提高编程质量。然后你应该把那些在 Invoke 委托代码内的(注册给主线程的)所谓 sp.ReadLine 和 sp.Read 代码,放到子线程中执行,而不要用主线程去做那些本不该阻塞 UI 线程的工作,这样可以进一步改善编程。
刚开始接触C# 这些不是很懂 ,我看很多线程接收的例子都是用的sleep[/quote] 我做个错误的示范,你看下
AK_GCC 2016-05-23
  • 打赏
  • 举报
回复
引用 8 楼 sp1234 的回复:
写Sleep语句,就说明你的程序一定不流程 --> 写Sleep语句,就说明你的程序一定不流畅 要提高编写通讯程序的质量,就从删除Sleep 着手吧!通过删除了这类明显是自相矛盾的语句,开始学会提高编程质量。然后你应该把那些在 Invoke 委托代码内的(注册给主线程的)所谓 sp.ReadLine 和 sp.Read 代码,放到子线程中执行,而不要用主线程去做那些本不该阻塞 UI 线程的工作,这样可以进一步改善编程。
刚开始接触C# 这些不是很懂 ,我看很多线程接收的例子都是用的sleep
漠落雨 2016-05-11
  • 打赏
  • 举报
回复
不用自己实现画波形图 网上有现成的状态波形图控件 下一个调用就可以了
zhiming99 2016-05-11
  • 打赏
  • 举报
回复
drawline
  • 打赏
  • 举报
回复
随便看几秒钟你贴的代码,一看到第一条语句
System.Threading.Thread.Sleep(100);
以及你写的代码注释,就能想象得到你的程序将会多么“卡顿、耗费资源”了。 一个比较好一点的通讯程序,绝不会这样去 Sleep 的。写这个语句,你在有了数据必须接收的时候,反而还去“故意阻塞100毫秒),这个自相矛盾的逻辑其实就说明了设计上“不靠谱”。你 Sleep 多长时间才能保证“缓冲区里恰好收到了消息结束符”?听天有名吧!所以你选择了一个比较长的阻塞时间。 然后你又不敢选择一个较长的时间,因为如果时间越长,程序卡得越惨。 这种自相矛盾的流程其实很可笑的,写Sleep代码其实是一种比较幼稚的代码。你应该立刻接收数据,然后判断有没有接收到消息结束符。如果没有接收到,就把接收信息保存到 List<byte> 或者 MemoryStream 之类的数据结构中就行了,等以后接受到消息结束符时才统一处理。 写Sleep语句,就说明你的程序一定不流程。而占用线程、又阻塞线程的编程习惯,如果线程稍微多一些,不但会让你的CPU标高,而且还会让物理内存不够用。
  • 打赏
  • 举报
回复
写Sleep语句,就说明你的程序一定不流程 --> 写Sleep语句,就说明你的程序一定不流畅 要提高编写通讯程序的质量,就从删除Sleep 着手吧!通过删除了这类明显是自相矛盾的语句,开始学会提高编程质量。然后你应该把那些在 Invoke 委托代码内的(注册给主线程的)所谓 sp.ReadLine 和 sp.Read 代码,放到子线程中执行,而不要用主线程去做那些本不该阻塞 UI 线程的工作,这样可以进一步改善编程。
  • 打赏
  • 举报
回复
关于第二个问题,随便说几个注意点: 1. 与渲染无关的计算、通讯都应该在子线程中完成。并且是无阻塞式的异步流程。 2. 不应该过于频繁进行计算,应该批量计算。 3. 应该有一个比可见区域稍微“宽一点”的控制窗口限制。当一个点移动出控制窗口时,它的对象从数据集合里移除之后不要被轻易释放,而应该放到一个“空闲对象集合”里边。当新的点到来时,应该重复使用空闲的对象、然后加入数据集合,而不要去轻易实例化新的对象。 4. 拟合平滑算法很重要。例如用简单傻瓜式的圆弧算法来取代复杂曲线拟合算法。算法的问题很容易造成造成cpu负担过重。
mjp1234airen4385 2016-05-09
  • 打赏
  • 举报
回复
比如,你选择100个点在坐标系内显示,定义一个数组,从串口读取完数据,就更新这个数组,然后重新划线。 系统有自带的画曲线的函数,不用你一个个去画。
mjp1234airen4385 2016-05-09
  • 打赏
  • 举报
回复
关键功能一个都没做出来啊。 数据接受完,需要一个画布,比如picturebox,form等等,在这个上需要定义坐标系和原点。 把从串口接收的数据,转换成可以在你的坐标系内显示的点。
relive007 2016-05-07
  • 打赏
  • 举报
回复
画波形还是用gdi+自己画吧,不是很麻烦的。

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧