唉,又是串口和线程。
是这样的:
    WinForm程序。
    用线程来扫描串口。
    创建一个线程,当串口有数据时,线程执行,来处理串口中的数据。然后线程停止。
    当串口又接受到数据时,线程继续执行,来处理串口中的数据。
    处理串口数据的方法是个死循环,一直在执行。    
    private void Form1_Load(object sender,EventArgs)
    {
       //设置串口和波特率
    }    public void testMain()  //处理串口数据的方法
    {
       while(true)
       {
           //处理串口数据
       }
       //线程停止
    }    private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)
    {
       //获取串口数据
       //线程执行
    }
    问题:大体思路是这样的,现在我不太清楚,线程该创建在什么地方,该如何控制才能完成以上的功能?  

解决方案 »

  1.   

    不需要死循环吧,每次DataReceived接收到数据,就开一个线程,处理完就退出线程
      

  2.   

    你这里得弄两个线程吧,一个用于接受,一个用于处理;接受的线程可以把数据保存在一个集合中,处理线程从集合中取出数据并加以处理;这里建议用队列吧,先进先出!记得你的两个线程工作完后得sleep下!
      

  3.   

    vc如果不用mscomm32.ocx,都要自己创建监听线程的。你不能照搬c++那套来c#的。直接用SerialPort的DataReceived事件,接收,缓存数据。然后判断数据是否完整是否正确。分析就可以了。
      

  4.   

    mscomm这个不用创建监听线程吗?
      

  5.   

    无需线程,直接在serialPort1_DataReceived事件中处理即可.
    PC机的数据处理能力远大于串口一次性传过来的数据量,别把事情想复杂了.如果你坚持用线程,也无需来一次数据开一个线程,而是在serialPort1_DataReceived事件中
    将收到的数据放入缓存,有一个已经开好的线程不停从缓存中拿数据处理,有数据则处理,无数据则Sleep.
      

  6.   

    在serialPort1_DataReceived事件中处理,出现了这样的问题:
    跨执行绪作业无效,存取控制项richTextBox时所使用的执行绪与建立控制项的执行绪不同。
    (我在richTextBox中显示处理串口数据的一些信息)
      

  7.   

    你是想往RichTextBox里将一些字符串?
    DataReceived其实是另外一个线程,在另一个线程直接操作UI线程创建的控件是不允许的,做一个Invoke操作.
                RichTextBox rtb = new RichTextBox();
                string msg = "hello world";
                this.Invoke(new Action(() => { rtb.AppendText(msg); }));
      

  8.   


    DataReceived中访问ui需要调用Invoke
    例如
    this.Invoke((EventHandler)delegate
    {
        //访问ui资源的代码
    });
      

  9.   

    1.DataReceived 事件工作在辅助线程
      

  10.   

    1.你需要以this.invoke()的方法调用不安全方法来处理缓存数据和 UI的交互
      

  11.   

    3. 
     SerialPort serialPort = null; private void Form1_Load(object sender,EventArgs)
        {
           //设置串口和波特率
            if(object.equals(serialPort, null))
           {
                serialPort = new SerialPort();
           }
        }    public void testMain()  //处理串口数据的方法
        {
           while(true)
           {
               //处理串口数据
           }
           //线程停止
        }    private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)
        {
            int _length = serialPort1.BytesToRead;
            byte[]  _byte = new byte[_length];
            int _intResult = serialPort1.Read(_byte, 0x00, _length);
            string serialData = System.Text.Encoding.Default.GetString(_byte);
            this.Invoke(new Action(() => { serialData}));
        }
           你要是仍然不明白的话  就联系下我 我给你再介绍下