我刚刚接触C#,今天想弄个串口,弄了一天,接收数据始终出不来,发送时没问题的,我用串口调试助手能收到数据,但是我自己的接收区域上就没东西,不知道哪里出了问题,请大侠们帮忙,万分感谢!下面是我接收数据的代码void com_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            try
            {
                int n = com.BytesToRead;
                byte[] buf = new byte[com.ReadBufferSize];
                
                com.Read(buf,0,n);
               
                builder.Clear();
                this.Invoke((EventHandler)(delegate
                {                    foreach (byte b in buf)       //依次的拼接出16进制字符串   
                    {
                        builder.Append(b.ToString("X2") + " ");
                    }
                    this.richTextBox1.Text += builder.ToString();
                    
                    this.richTextBox1.AppendText(builder.ToString());
                                    }));
            }
            catch
            { 
                
            }

解决方案 »

  1.   

    能触发com_DataReceived事件吗,如果能就调试看看,不能,就看看参数是否正确
      

  2.   

    com.Read(buf,0,n);这个方法带有返回值,返回的是读取的字节数,你要判断读取了多少,然后显示多少,不能全部都显示,否则将把一堆空白显示出来。
      

  3.   

    思路:在C#中串口接收数据时,触发com_DataReceived事件的次数非常不稳定。什么意思呢?比如说电脑A通过串口向电脑B发送一字符串“abcdefghij”,你在电脑B中用C#编程实现串口数据的接收。调试时你会发现一个奇怪的现象:虽然A一次性发送这个字符串,但是在B中com_DataReceived事件触发的次数可能非常“不稳定”。例如:你第一次发送这个字符串到B,触发com_DataReceived的次数可能是一次,就是一次性就把abcdefghij接收完了;但是你第二次发送这个同样的字符串到B,电脑B触发com_DataReceived的次数可能是3次:分别接收abc,defghi,j;如果你第三次发送,可能触发2次,等等。反正在C#中情况就是这么复杂------我遇到的情况。那么怎么解决呢?
    这时你就要定义一个全局的字符串变量,长度要足够长,以满足存储完整这个字符串。
    在com_DataReceived事件中,每触发这样一次事件,就把接收到的字符串添加到全局字符串变量的后面,这样不断往全局变量的后门加入数据,最后接收到的就是一条完整的信息。最后你要显示的,或者要处理的,或者要解析的信息,就从那个全局字符串变量中提取。
    呵呵,我工作也很多处理串口通信的编程,我遇到的问题和解决的手段大抵如此,不知道有没有说清楚,不知道有没有说对,欢迎高手们指正,鄙人也是菜鸟一枚,不停的学习中。如果对楼主有用,呵呵,加分时给我一点,嘿嘿黑,我的分也太少了。毕竟这么多我也是辛苦敲出来的啊。哈哈
      

  4.   

    但如果要实时处理的话,怎么判断信息什么时候发完整了呢===>>
    要看你的仪表数据格式,按照说明文档上的格式判断是否存在一条完整的记录。其实数据格式的处理时很麻烦的,接收数据倒挺简单。主要是因为数据是不断变化的。。 上次我弄一个二次表的数据显示,按照他的格式,数据全部是倒着显示,要找到一条完整的数据,判断是正数还是负数,再倒过来。。