2

我有一个同时从两个串行端口读取的 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";
        }
    }

// 每次将“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 建议的多线程选项:我之前没有尝试过,因为我认为串行端口已经在单独的线程上工作:datareceived 事件不会阻塞主线程并且您无法访问创建的控件在主线程上,但我仍然会使用后台工作人员试一试,稍后再恢复。谢谢大家的快速回复。

4

2 回答 2

5

你需要做一些阅读,特别是关于Threading

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

ReadDataFromSomePort();
ReadDataFromSomeOtherPort();

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

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

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

thread1.Start();
thread2.Start();

放心,除此之外还有更多内容,所以我建议在继续之前对这个概念进行一些研究。

MSDN 有一个关于线程的教程/编程参考,可以帮助您入门。

于 2013-04-22T12:45:14.467 回答
1

为两者创建两个不同的对象SerialPort和不同的DataReceived事件应该可以工作。

于 2013-04-22T12:44:57.493 回答