日期:2014-05-18  浏览次数:20796 次

c#串口接收数据问题
C# code

        void com_Recived(object sender, SerialDataReceivedEventArgs e) 
        {
            int n = comm.BytesToRead;
            byte[] b = new byte[n];
            comm.Read(b, 0, n);
            builder.Append(Encoding.ASCII.GetString(b));
            String line = builder.ToString();//
            str = line.Substring(6, 4);
            this.Invoke((EventHandler)(delegate
            {
                this.richTextBox1.AppendText(str);
            }));
        }


上面是串口数据接收代码,连接的是一块称重仪表,其实我想得到的是 str
如果输出line line的数据是随着仪表数据变化而变化的
但是我输出str 只不断输出第一个数据,无论仪表怎么变化只数据第一个数据
高手请不吝赐教



------解决方案--------------------
builder.Append,没有清空builder,一直在增加,ToString()后,取line.Substring(6, 4)永远都是第一条数据的Substring(6, 4);str当然不会变了

你应该取每次 Encoding.ASCII.GetString(b) 的 Substring 而不是整个builder的Substring
------解决方案--------------------
估计richTextBox1没有刷新。AppendText之后加Refresh试试
------解决方案--------------------
是不是得用循环呀。。。
------解决方案--------------------
串口接收数据要用委托.
C# code

 public delegate void _SafeAddtrTextCall(string text);//定义一个委托
        private void safeAddtrText(string text)
        {
            if (this.InvokeRequired)
            {
                _SafeAddtrTextCall call = delegate(string s) { textBox41.Text +=s; };

                this.Invoke(call, text);

            }
            else
            {
                textBox41.Text += text;
            }
        }

private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            string tmpstr = "";
            string a = "";
            for (int i = 0; i < serialPort1.BytesToRead; i++)
            {
                a = Convert.ToString(serialPort1.ReadByte(), 16);
                tmpstr += a + " ";
            }
            tmpstr = tmpstr.ToUpper();
            safeAddtrText(tmpstr);
        }