none
使用委托接收serialport数据时出了很奇怪的问题,各位大虾指导 RRS feed

  • 问题

  •  private void serialPort1_DataReceived_1(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {

                string SDateTemp = this.serialPort1.ReadExisting();
                serialPort1.DiscardInBuffer();

                    textBox1.Invoke(
                 new MethodInvoker(
                 delegate
                 {
                     textBox1.AppendText(SDateTemp);
                     textBox1.Text += " ";
                 }
                     )
                     );

    }

    使用以上事件代码,我每次给发送的都是1234,textbox1里会出现 第一次是 1234 (是正常的),第二次就出现1234 12,第三次出现1234 12 1 4,第四次出现1234 12 1 4 1 4

    为什么每次都是第一次接收是正常的,第二次之后就不对。而且更奇怪的是,你插入断点以后每次接收的都是正常的,很神奇的东西啊

    2012年11月9日 1:55

答案

  • dear

    任何的serial都会有的缓冲区问题

    建议您了解以下的贴子,可以让您开发上更顺利

    http://www.dotblogs.com.tw/billchung/archive/2012/01/20/66860.aspx

    http://www.dotblogs.com.tw/billchung/category/5702.aspx?Show=All


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/


    2012年11月12日 4:40
  • 谢谢回复,不过最后我是这样解决的

     StringBuilder getstring = new StringBuilder();

                while (serialPort1.BytesToRead > 0)
                {
                    getstring.Append(this.serialPort1.ReadExisting()+" ");
                }
                    textBox1.Invoke(
                 new MethodInvoker(
                 delegate
                 {
                    
                     textBox1.Text += getstring.ToString();
                   
                 }
                     )
                     );

    2012年11月12日 7:07

全部回复

  • Hi qiu stone,

      你最好在每个匿名回调函数里清空缓冲,把DiscardInBuffer放在 textBox1.Text += " ";之后像下面这样:

     

    private void serialPort1_DataReceived_1(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
            {
                string SDateTemp = this.serialPort1.ReadExisting();
                serialPort1.DiscardInBuffer();
                    textBox1.Invoke(
                 new MethodInvoker(
                 delegate
                 {
                     textBox1.AppendText(SDateTemp);
                     textBox1.Text += " ";
                     serialPort1.DiscardInBuffer();
                 }
                     )
                     );
    }


    Jason Wang [MSFT]
    MSDN Community Support | Feedback to us

    2012年11月12日 3:18
    版主
  • dear

    任何的serial都会有的缓冲区问题

    建议您了解以下的贴子,可以让您开发上更顺利

    http://www.dotblogs.com.tw/billchung/archive/2012/01/20/66860.aspx

    http://www.dotblogs.com.tw/billchung/category/5702.aspx?Show=All


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/


    2012年11月12日 4:40
  • 谢谢回复,不过最后我是这样解决的

     StringBuilder getstring = new StringBuilder();

                while (serialPort1.BytesToRead > 0)
                {
                    getstring.Append(this.serialPort1.ReadExisting()+" ");
                }
                    textBox1.Invoke(
                 new MethodInvoker(
                 delegate
                 {
                    
                     textBox1.Text += getstring.ToString();
                   
                 }
                     )
                     );

    2012年11月12日 7:07