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标签显示 提示“线程间操作无效”
 求高手指点,在线等

解决方案 »

  1.   

    读出来的数据 已经转换为字符串类型了!lable标签显示出来的 是最后一位!调试过程中 出来个“线程间操作无效”的异常
      

  2.   

    在主窗体的Load事件中输入
    CheckForIllegalCrossThreadCalls = false;
      

  3.   

    断点调试 有的时候label的值 是串口读出来的值,有的时候是最后几位,如果不断点调试 出来就是最后一位!!
      

  4.   

    this.label17.Text = builder.ToString();
    改成
    this.label17.Text += builder.ToString();
      

  5.   

    用+= 则每刷一次卡 串口读到的数据就会累加到这个标签上,上面的文本框已经实现了这个功能,所以我想要的是 每刷一次卡 label标签显示的就是这张卡的数据 急啊!!
      

  6.   

    http://blog.csdn.net/wuyazhe/article/category/695097
      

  7.   

    先清label.text=""
    在赋值this.label17.Text = builder.ToString(); 这样就只赋一个值 

    每次写个动态创建label控件,这样每次接受一个值
      

  8.   

    怎么实现动态创建label控件呢 能指点一下吗?
      

  9.   

    文本框 append 这个属性能完整的把串口数据读出来,但是用标签就不能完整显示。这是为什么?
      

  10.   

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

  11.   

    不是这样的,比如说 this.label.text = builder.toString() 这样显示出来是 卡号的最后一位 。
    如果 this.label.text += builder.toString() 就会显示出来完整的卡号,再刷一张卡 那么卡号会在这个值的基础上继续累加!
    我现在就是想 用这个标签来接收 串口的数据。而且每次刷卡显示的是该卡的卡号。
    是不是窗体主线程和这个串口的线程没法同步啊?
      

  12.   

    线程里面不能那么写哦
    用委托
    this.invoke(new evnethan..(del..
    {
    label1.text=..
    }
    我传了个这个例子:http://download.csdn.net/source/1649363
      

  13.   


    数据是流的形式来的。如果你无法判断数据的完整性。可以从串口本身的机制处理,例如当你第一次进入dataReceived,你就写个循环,连续读取,间隔一定时间没数据认为读取完毕,再显示。
      

  14.   

    各位大侠们  我现在 在方法的最后加了一个  
    System.Threading.Thread.Sleep(20);
    this.label17.Text = builder.ToString();
    System.Threading.Thread.Sleep(20);
    selectReadCard(); 
    然后在调用方法 能解决我的问题。请问这样做有什么后果!目前测试还没发现?我不理解这样做的意思。但是效果实现了。谁能帮小弟解释下吗???不胜感激!
      

  15.   

    我有试了一个方法 就是在前面判断 
     int n = comm.BytesToRead
     if (n < 17)
    {
       return;
    } else
    {.....}
    这样也能显示。这个的意思是 如果读到n<17的数据我就直接丢掉不要了。
    这样做可以吗?
      

  16.   

    线程间访问限制,
    http://blog.csdn.net/xiage/article/details/4294725
      

  17.   

    你用comm_DataReceived事件就错了.
    因此你无法解决问题.
      

  18.   

    显示的时候要invoke
    this.Invoke(new Action(()=>this.label1.text="数据"));
      

  19.   


    comm.Read(buf, 0, n);//读取缓冲数据
    这个方法读串口本来就是一位一位的接收的,断点调试相当于你在断点位置做了一个等待,此时把剩下的数据也接收过来了,你看到的就是完整的字符串了。而你不加断点的时候只显示了最后一次接收的字符。
    换做ReadLine,等待所以输出一次显示就OK了
      

  20.   

     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;        }为什么你不直接读成字符串?一次性读玩就不会出来数据断开了。