多线程串口C#

时间:2014-02-26 18:52:41

标签: c# multithreading serial-port

我目前正在编写一个执行3个基本功能的应用程序:

  1. 向第三方设备发送命令
  2. 读取第三方设备的字节响应
  3. 分析响应并将分析写入RichTextBox
  4. 我的应用程序包含许多测试脚本,每个脚本都执行一系列测试,例如:

    public SerialPort comport = new SerialPort();
    
    private void RunTest()
    {
        byte[] arrayExample = { 0x00, 0x01, 0x02, 0x03 };
    
        // Perform 200 operations and analyze responses
        for(int i=0, i<200, i++)
        {
    
            // Send byte array to 3rd party device
            comport.Write(arrayExample, 0, arrayExample.length);
    
            // Receive response
            int bytes = comport.BytesToRead;            
            byte[] buffer = new byte[bytes];
            comport.Read(buffer, 0, bytes);
    
            // Check to see if the device sends back a certain byte array
            if(buffer = { 0x11, 0x22 })
            {
               // Write "test passed" to RichTextBox
               LogMessage(LogMsgType.Incoming, "Test Passed");
            }
            else
            {
               // Write "test failed" to RichTextBox
               LogMessage(LogMsgType.Incoming, "Test Failed");
            }
        }
    }
    

    在当前设置中,我的UI在测试脚本期间没有响应(通常持续2-3分钟)。

    正如您所看到的,我没有使用DataReceived事件。相反,我选择专门调出何时通过串口写入/读取。我这样做的部分原因是因为我需要在写入更多数据之前停止并分析缓冲区响应。有了这种情况,有没有办法仍然多线程这个应用程序?

1 个答案:

答案 0 :(得分:1)

您需要在另一个线程上运行它。

Thread testThread = new Thread(() => RunTest());
testThread.Start();

我假设

LogMessage();

正在访问用户界面。线程您不能直接访问UI,因此最简单的方法是匿名的。在LogMessage中,您可以执行类似

的操作
this.Invoke((MethodInvoker)delegate { richTextBox.Text = yourVar; });