最近在写一个串口读数据的方法
SerialPort sp= new SerialPort();这是一个实时数据接收程序。
我需要监听串口,一有数据马上做出处理  
  现在我是写了一个死循环 while(true)
{
  int PortLength = sp.BytesToRead;
                
                if (PortLength != 0)
                {
                    byte[] PortDatas = new byte[PortLength];                    for (int i = 0; i < PortLength; i++)
                    {
                        PortDatas[i] = (byte)sp.ReadByte();
                    }
                }
}
这样做也能实现功能, 只是这个循环一直在执行。  有没有这样一个方法  就像  Socket 下的 Receive  方法一样 
没有数据来的时候线程是休眠状态的 ?

解决方案 »

  1.   

    串口是自动监听数据的,发送一次,接收写在DataReceived事件里
    private void selMonitor_DataReceived(object sender, SerialDataReceivedEventArgs e)
      {for (int count = 0; count < selMonitor.BytesToRead; count++)
      {}
    }
      

  2.   

    感谢1楼的回复  问题解决了  不过在这个事件中  对FORM 中控件的调用 会出错
    线程间操作无效: 从不是创建控件“richTextBox1”的线程访问它我想把得到的数据写到  richTextBox1 中  该怎么做呢?
           private void selMonitor_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
               
                int count = 0;
                count = sp.BytesToRead;
                byte[] dates = new byte[count];
                string ss = "";
                for (int i = 0; i < count; i++)
                {
                    dates[i] = (byte)sp.ReadByte();
                    ss += dates[i];
                }            
                this.richTextBox1.Text = ss;
            }上面这个方法只是一个测试方法  得到的 byte数据需要处理的 我这里想先让它显示出来
      

  3.   

    CheckForIllegalCrossThreadCalls=false; 的话  程序会不稳定  时不时出现一些很奇怪的错误, 比如收取到的是不完整的数据  等等。。
      

  4.   

    改成这样吧:
            delegate void SendMessageDelegate(string message);         private void selMonitor_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {            int count = 0;
                count = sp.BytesToRead;
                byte[] dates = new byte[count];
                string ss = "";
                for (int i = 0; i < count; i++)
                {
                    dates[i] = (byte)sp.ReadByte();
                    ss += dates[i];
                }            this.Invoke(new SendMessageDelegate(SendMessage), new object[] { ss }); 
              
            }
            void SendMessage(string m)
            {
                this.richTextBox1.Text += m;
            }