【问题标题】:Reading from two serial ports at the same同时从两个串口读取
【发布时间】:2013-04-22 12:42:53
【问题描述】:

我有一个同时从两个串行端口读取的 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 事件不会阻塞主线程,你不能在主线程上创建的访问控制,但我仍然会使用后台工作人员试一试,稍后再恢复。谢谢大家的快速回复。

【问题讨论】:

  • 你能添加一些代码吗?
  • 您是使用多个线程还是只使用一个线程?
  • 您是否以这种方式实现 dataReceived 事件:msdn.microsoft.com/en-us/library/… ?对我来说,不清楚 spPH 是什么。
  • @EricSmekens,spPH 是端口 1。我重命名它是为了让人们更容易阅读。我的 port1 实际上是在读取 pH 计。我现在已经纠正了错误。谢谢。
  • 好吧,如果它解决了您的问题,您确实可以尝试使用线程。

标签: c# serial-port


【解决方案1】:

您需要阅读一些内容,特别是在Threading

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

ReadDataFromSomePort();
ReadDataFromSomeOtherPort();

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

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

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

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

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

MSDN 有一个 tutorial/programming reference for threading 可以帮助您入门。

【讨论】:

  • 使用两个后台工作人员为我解决了这个问题。这并不完全像上面所说的那样,但这足以为我指明正确的方向,所以我接受这个答案。非常感谢。
【解决方案2】:

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

【讨论】:

  • 并使用线程。可能是一次读取会阻塞所有端口的所有数据的问题。
  • @EricSmekens 我曾在单线程应用程序中使用多个串行端口。所以我认为这不是问题。
  • @falopsy 能否请您看一下代码...以便我们更好地理解。
  • @Virus:这正是我正在做的事情。请查看我的问题的编辑。
猜你喜欢
  • 1970-01-01
  • 2016-09-27
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多