同时从两个串口读取数据

本文关键字:两个 串口 读取 数据 | 更新日期: 2023-09-27 18:10:23

我有一个c#程序,可以同时从两个串行端口读取。串行端口设备是一个多产的美元到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";
        }
    }

//每次向硬件写入"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
        {
        }
    }
端口2

第二个端口的代码与上面的代码类似,不同的是端口、数据接收事件和定时器不同。

我将尝试Grant Thomas建议的多个线程选项:我之前没有尝试过,因为我认为串行端口已经在单独的线程上工作:数据接收事件不会阻塞主线程,您无法访问主线程上创建的控件,但我仍然会使用后台工作器并稍后恢复。感谢大家的快速响应。

同时从两个串口读取数据

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

如果你有一些像这样的代码:

ReadDataFromSomePort();
ReadDataFromSomeOtherPort();

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

所以,你最终会得到这样的结果:

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

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

MSDN有一个关于线程的教程/编程参考,应该让你开始。

SerialPortDataReceived创建两个不同的对象应该可以工作