C# 串口通信接收数据的问题,求助啊

小仙女&& 2019-06-12 01:40:52
private void serialPort2_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int n = serialPort2.BytesToRead;
byte[] buf = new byte[16];//声明一个临时数组存储当前来的串口数据
serialPort2.Read(buf, 0, n);//读取缓冲数据
builder.Clear();//清除字符串构造器的内容
//因为要访问ui资源,所以需要使用invoke方式同步ui。
this.Invoke((EventHandler)(delegate
{
//判断是否是显示为16进制
//直接按ASCII规则转换成字符串
builder.Append(Encoding.ASCII.GetString(buf));
//追加的形式添加到文本框末端,并滚动到最后。
this.txtSendData.AppendText(builder.ToString());

}));

}

现在是每次接收的数据都会叠加显示在textbox里面,怎么才能只显示最新的数据呢
...全文
1550 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
vahaha2 2019-06-14
  • 打赏
  • 举报
回复
builder是如何定义的? 接收的数据想显示出来,要转成16进制
小仙女&& 2019-06-13
  • 打赏
  • 举报
回复
引用 9 楼 雪狼孤竹 的回复:
[quote=引用 8 楼 小仙女&& 的回复:] 我的意思是说,我获取到最新的值后,前面的值不显示了,只显示一行数据
那你获得最新的值后,直接赋给那个显示控件呗,就不要追加了。[/quote] 直接赋给Text没有数据
小仙女&& 2019-06-13
  • 打赏
  • 举报
回复
引用 10 楼 OrdinaryCoder 的回复:
this.txtSendData.Text=builder.ToString();这样写没有数据 this.txtSendData.AppendText(builder.ToString());这样写有数据 那么是不是可以想一个折中的办法: 先this.txtSendData.Text = “”;把之前的数据清空 再 this.txtSendData.AppendText(builder.ToString());
我这样试过不行,还是没有数据哎
OrdinaryCoder 2019-06-13
  • 打赏
  • 举报
回复
this.txtSendData.Text=builder.ToString();这样写没有数据
this.txtSendData.AppendText(builder.ToString());这样写有数据
那么是不是可以想一个折中的办法:
先this.txtSendData.Text = “”;把之前的数据清空
再 this.txtSendData.AppendText(builder.ToString());
雪狼孤竹 2019-06-13
  • 打赏
  • 举报
回复
引用 8 楼 小仙女&& 的回复:
我的意思是说,我获取到最新的值后,前面的值不显示了,只显示一行数据


那你获得最新的值后,直接赋给那个显示控件呗,就不要追加了。
小仙女&& 2019-06-13
  • 打赏
  • 举报
回复
引用 7 楼 雪狼孤竹 的回复:
//设置光标的位置到文本尾   
            txtSendData.Select(txtSendData.TextLength, 0);
            //滚动到控件光标处   
            txtSendData.ScrollToCaret();
试试看
我的意思是说,我获取到最新的值后,前面的值不显示了,只显示一行数据
雪狼孤竹 2019-06-13
  • 打赏
  • 举报
回复
//设置光标的位置到文本尾   
txtSendData.Select(txtSendData.TextLength, 0);
//滚动到控件光标处
txtSendData.ScrollToCaret();

试试看
孤独de猫 2019-06-13
  • 打赏
  • 举报
回复
你要把收到的数据 转成16进制的,如果是直接收到的字段toString()的话,有可能会收失字节是0,转成String就是截断符。
SX-C#include 2019-06-13
  • 打赏
  • 举报
回复
调试看builder有没有值
SX-C#include 2019-06-13
  • 打赏
  • 举报
回复
调试看builder有没有值
黑视 2019-06-13
  • 打赏
  • 举报
回复
this.txtSendData.Text=builder.ToString();
这样看不到数据的话,敢问你一般数据是什么内容?会不会有空白符号导致显示不出来?
你要一行的数据,干嘛不直接用
String s = serialPort2.ReadLine();
这样子获得的就是一行的数据,不需要在转换字符
雪满西京 2019-06-13
  • 打赏
  • 举报
回复
在serialPort2.Read(buf, 0, n); 这一行代码的后面,加上: sp1.DiscardInBuffer(); 另外,你接收到的数据是16进制吗,转成UTF-8格式试试? this.txtSendData.Text = new UTF8Encoding().GetString(buf);
雪狼孤竹 2019-06-13
  • 打赏
  • 举报
回复

在这个函数的最后,加上
serialPort2.DiscardInBuffer();
试试。
it_gz_xi 2019-06-12
  • 打赏
  • 举报
回复
这样写没问题的自己可以试试this.txtSendData.Text="123"; 你要学会用F11,一步步来不要急,自己学会找问题
小仙女&& 2019-06-12
  • 打赏
  • 举报
回复
引用 3 楼 懒懒懒源 的回复:
调试看builder有没有值
builder是有值的
  • 打赏
  • 举报
回复
调试看builder有没有值
小仙女&& 2019-06-12
  • 打赏
  • 举报
回复
引用 1 楼 it_gz_xi 的回复:
AppendText就是叠加的啊。不叠加你用Text
this.txtSendData.Text=builder.ToString(); 直接这样写吗,这样写textbox没有数据啊
it_gz_xi 2019-06-12
  • 打赏
  • 举报
回复
AppendText就是叠加的啊。不叠加你用Text

110,534

社区成员

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

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

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