C# 串口读取数据怎么显示到lable标签上

xuwenjun116 2011-07-24 09:56:28
private void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
int n = comm.BytesToRead;
byte[] buf = new byte[n];
comm.Read(buf, 0, n);//读取缓冲数据
builder.Remove(0, builder.Length);//清除字符串构造器的内容
this.Invoke((EventHandler)(delegate
{
//直接按ASCII规则转换成字符串
builder.Append(Encoding.ASCII.GetString(buf));
this.txGet.AppendText(builder.ToString());
}));
try
{
this.label17.Text = builder.ToString();
}
catch (Exception ex)
{

MessageBox.Show(ex.Message);
}

}


现在 文本框显示出来串口读出来的数据 但是一累加的,分不开。用一个lable标签显示 提示“线程间操作无效”
求高手指点,在线等
...全文
1576 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
hahanigehapi 2011-08-29
  • 打赏
  • 举报
回复
public delegate void SetLabelTextHand(Label lb,string str);
private void SetLabelText(Label lb,string str)
{
if (lb.InvokeRequired)
{
SetLabelTextHand d = new SetLabelTextHand(SetLabelText);
this.Invoke(d, new object[] { lb,str});
}
else
lb.Text = str;

}

为什么你不直接读成字符串?一次性读玩就不会出来数据断开了。
潇洒王子 2011-07-29
  • 打赏
  • 举报
回复
继续关注
yfy_47 2011-07-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xuwenjun116 的回复:]
断点调试 有的时候label的值 是串口读出来的值,有的时候是最后几位,如果不断点调试 出来就是最后一位!!
[/Quote]

comm.Read(buf, 0, n);//读取缓冲数据
这个方法读串口本来就是一位一位的接收的,断点调试相当于你在断点位置做了一个等待,此时把剩下的数据也接收过来了,你看到的就是完整的字符串了。而你不加断点的时候只显示了最后一次接收的字符。
换做ReadLine,等待所以输出一次显示就OK了
iamwarrior 2011-07-27
  • 打赏
  • 举报
回复
显示的时候要invoke
this.Invoke(new Action(()=>this.label1.text="数据"));
zeng_xiangsheng 2011-07-27
  • 打赏
  • 举报
回复
线程访问无效可以用委托来写
dai78 2011-07-27
  • 打赏
  • 举报
回复
异步委托处理处理数据
xiage 2011-07-26
  • 打赏
  • 举报
回复
线程间访问限制,
http://blog.csdn.net/xiage/article/details/4294725
fuyonggao 2011-07-26
  • 打赏
  • 举报
回复
你用comm_DataReceived事件就错了.
因此你无法解决问题.
breeze5025 2011-07-26
  • 打赏
  • 举报
回复
控件只能在创建它的线程访问
xuwenjun116 2011-07-25
  • 打赏
  • 举报
回复
我有试了一个方法 就是在前面判断
int n = comm.BytesToRead
if (n < 17)
{
return;
} else
{.....}
这样也能显示。这个的意思是 如果读到n<17的数据我就直接丢掉不要了。
这样做可以吗?
xuwenjun116 2011-07-25
  • 打赏
  • 举报
回复
各位大侠们 我现在 在方法的最后加了一个
System.Threading.Thread.Sleep(20);
this.label17.Text = builder.ToString();
System.Threading.Thread.Sleep(20);
selectReadCard();
然后在调用方法 能解决我的问题。请问这样做有什么后果!目前测试还没发现?我不理解这样做的意思。但是效果实现了。谁能帮小弟解释下吗???不胜感激!
xuwenjun116 2011-07-25
  • 打赏
  • 举报
回复
坐等你的博客更新!! 这个问题困扰我两天了,懂的太少。不知道该怎么办!
兔子-顾问 2011-07-25
  • 打赏
  • 举报
回复
这问的不少,晚上回家写个例子,更新博客。
xuwenjun116 2011-07-25
  • 打赏
  • 举报
回复
我外层加了一个循环 加上断点调试可以显示出来。如果不调试直接运行就不显示了。怎么回事呢?
xuwenjun116 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 wuyazhe 的回复:]
引用 22 楼 xuwenjun116 的回复:

引用 21 楼 wuyazhe 的回复:
显示不出来的话可能是label太小了。你弄大一些,另外,textbox默认是自动换行的。label不会,如果没换行符收到,就一直累加到后面去了看不到。

不是这样的,比如说 this.label.text = builder.toString() 这样显示出来是 卡号的最后一位 。
如果 th……
[/Quote] 大哥 能写个简单的例子吗! 我是第一次 研究这个串口。属于小白型。谢谢 谢谢
xuwenjun116 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 lfqsy 的回复:]
线程里面不能那么写哦
用委托
this.invoke(new evnethan..(del..
{
label1.text=..
}
我传了个这个例子:http://download.csdn.net/source/1649363
[/Quote]这个例子还是用文本框 += 来显示 这个卡号的
兔子-顾问 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 xuwenjun116 的回复:]

引用 21 楼 wuyazhe 的回复:
显示不出来的话可能是label太小了。你弄大一些,另外,textbox默认是自动换行的。label不会,如果没换行符收到,就一直累加到后面去了看不到。

不是这样的,比如说 this.label.text = builder.toString() 这样显示出来是 卡号的最后一位 。
如果 this.label.text += builder.to……
[/Quote]

数据是流的形式来的。如果你无法判断数据的完整性。可以从串口本身的机制处理,例如当你第一次进入dataReceived,你就写个循环,连续读取,间隔一定时间没数据认为读取完毕,再显示。
xuwenjun116 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 lfqsy 的回复:]
线程里面不能那么写哦
用委托
this.invoke(new evnethan..(del..
{
label1.text=..
}
我传了个这个例子:http://download.csdn.net/source/1649363
[/Quote]我去看看
lfqsy 2011-07-25
  • 打赏
  • 举报
回复
线程里面不能那么写哦
用委托
this.invoke(new evnethan..(del..
{
label1.text=..
}
我传了个这个例子:http://download.csdn.net/source/1649363
xuwenjun116 2011-07-25
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 wuyazhe 的回复:]
显示不出来的话可能是label太小了。你弄大一些,另外,textbox默认是自动换行的。label不会,如果没换行符收到,就一直累加到后面去了看不到。
[/Quote]
不是这样的,比如说 this.label.text = builder.toString() 这样显示出来是 卡号的最后一位 。
如果 this.label.text += builder.toString() 就会显示出来完整的卡号,再刷一张卡 那么卡号会在这个值的基础上继续累加!
我现在就是想 用这个标签来接收 串口的数据。而且每次刷卡显示的是该卡的卡号。
是不是窗体主线程和这个串口的线程没法同步啊?
加载更多回复(21)

111,125

社区成员

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

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

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