同时从两个串口读取

fal*_*psy 2 c# serial-port

我有一个C#程序,可以同时从两个串口读取.串口设备是一个Prolific USD到4串口适配器,我将两个硬件插在适配器的不同端口上.问题是当我从每个端口一次读取一个,一切正常,但当我尝试同时从两个端口读取时,其中一个端口没有响应.为了解决这个问题,我启动了两个应用程序实例,并且能够一次从两个端口读取(每个应用程序实例一个).有谁知道如何同时从一个应用程序中的两个独立串口读取?谢谢.

添加一些代码:

端口1:

//按钮开始或停止从端口1读取.因为硬件要求我在读取响应之前写入它,所以写入在定时器中完成

    private void buttonPort1_Click(object sender, EventArgs e)
    {
        if (buttonPort1.Text == "Start Recording")
        {
            if (!port1.IsOpen)
            {
                port1.Open();
            }
            timerPort1.Start();                
            buttonPort1.Text = "Stop Recording";
        }
        else
        {
            timerPort1.Stop();
            buttonPort1.Text = "Start Recording";
        }
    }
Run Code Online (Sandbox Code Playgroud)

//每次向硬件写入"D"以接收响应

    private void timerPort1_Tick(object sender, EventArgs e)
    {               
            port1.Write("D");
    }


void port1_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
        try
        {
            string result = port1.ReadLine();
            oneParamDelegate dg = PHandCondResult;  // send back the result to the main thread
            this.Invoke(dg, result);
        }
        catch
        {
        }

    }
Run Code Online (Sandbox Code Playgroud)

港口2

第二个端口的代码与上面的代码类似,区别在于不同的端口,datareceived事件和计时器.

我将尝试Grant Thomas建议的多线程选项:我之前没有尝试过,因为我认为串口已经在单独的线程上工作:datareceived事件不会阻塞主线程而你无法访问创建的控件在主线程上,但我仍然会使用后台工作程序,并稍后恢复.谢谢大家的快速回复.

Gra*_*mas 5

你需要做一些阅读,特别是线程阅读.

例如,如果你有一些看起来像这样的代码:

ReadDataFromSomePort();
ReadDataFromSomeOtherPort();
Run Code Online (Sandbox Code Playgroud)

然后第一个将同步执行(阻塞),然后执行后者.这发生在同一个线程,主应用程序线程上.当你想做异步事情时,包括在保持UI交互/响应的同时做一件事,那么你需要将工作委托给其他线程.

所以,你最终得到这样的东西:

var thread1 = new Thread(ReadDataFromSomePort);
var thread2 = new Thread(ReadDataFromSomeOtherPort);

thread1.Start();
thread2.Start();
Run Code Online (Sandbox Code Playgroud)

还有更多的东西,请放心,所以我建议在继续之前对这个概念进行一些研究.

MSDN有一个教程/编程参考,可以帮助您入门.

  • 使用两名后台工作人员解决了我的问题。它并不完全如上所述,但这足以为我指明正确的方向,所以我接受这个答案。非常感谢。 (2认同)