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标签显示 提示“线程间操作无效”
求高手指点,在线等
{
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标签显示 提示“线程间操作无效”
求高手指点,在线等
CheckForIllegalCrossThreadCalls = false;
改成
this.label17.Text += builder.ToString();
在赋值this.label17.Text = builder.ToString(); 这样就只赋一个值
或
每次写个动态创建label控件,这样每次接受一个值
如果 this.label.text += builder.toString() 就会显示出来完整的卡号,再刷一张卡 那么卡号会在这个值的基础上继续累加!
我现在就是想 用这个标签来接收 串口的数据。而且每次刷卡显示的是该卡的卡号。
是不是窗体主线程和这个串口的线程没法同步啊?
用委托
this.invoke(new evnethan..(del..
{
label1.text=..
}
我传了个这个例子:http://download.csdn.net/source/1649363
数据是流的形式来的。如果你无法判断数据的完整性。可以从串口本身的机制处理,例如当你第一次进入dataReceived,你就写个循环,连续读取,间隔一定时间没数据认为读取完毕,再显示。
System.Threading.Thread.Sleep(20);
this.label17.Text = builder.ToString();
System.Threading.Thread.Sleep(20);
selectReadCard();
然后在调用方法 能解决我的问题。请问这样做有什么后果!目前测试还没发现?我不理解这样做的意思。但是效果实现了。谁能帮小弟解释下吗???不胜感激!
int n = comm.BytesToRead
if (n < 17)
{
return;
} else
{.....}
这样也能显示。这个的意思是 如果读到n<17的数据我就直接丢掉不要了。
这样做可以吗?
http://blog.csdn.net/xiage/article/details/4294725
因此你无法解决问题.
this.Invoke(new Action(()=>this.label1.text="数据"));
comm.Read(buf, 0, n);//读取缓冲数据
这个方法读串口本来就是一位一位的接收的,断点调试相当于你在断点位置做了一个等待,此时把剩下的数据也接收过来了,你看到的就是完整的字符串了。而你不加断点的时候只显示了最后一次接收的字符。
换做ReadLine,等待所以输出一次显示就OK了
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; }为什么你不直接读成字符串?一次性读玩就不会出来数据断开了。