使用 Main() 中多个串行端口读取数据

本文关键字:串行端口 读取 数据 Main 使用 | 更新日期: 2023-09-27 17:55:27

我对C#编程很陌生,对串行端口知之甚少。我正在按照Microsoft提供的这种方法连续读取进入多个串行端口的信息。总的来说,我的应用程序是从多个COM端口引入数据,并对结果数据执行计算任务。

1)我想使用多个串行端口。不幸的是,我目前没有足够的USB-RS232适配器来测试多个端口。我不确定创建第二个 DataReceivedHandler 方法是否是正确的方法。这是我目前拥有的:

// Receive data on COM Port A
private static void DataReceivedHandlerA(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    string inDataA = sp.ReadExisting();
}
// Receive data on COM Port B
private static void DataReceivedHandlerB(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort spB = (SerialPort)sender;
    string inDataB = spB.ReadExisting();
}

2) 在 Main() 循环中的其他地方使用来自 DataReceivedHandler 方法中接收的数据。由于该方法是私有的,因此我无法在 Main() 循环中使用 inDataA。每当我公开这种方法时,它似乎都失败了。我希望能够在数据 B 中返回字符串。这是可能的,还是有没有其他更好的方法来做到这一点。

使用 Main() 中多个串行端口读取数据

有什么理由你不能将这两个变量作为 main 之外的全局变量,以便它们可用于所有函数?

Static String inDataA, inDataB;
// Receive data on COM Port A
private static void DataReceivedHandlerA(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort sp = (SerialPort)sender;
    inDataA = sp.ReadExisting();
    Console.Write(inDataA);
}
// Receive data on COM Port B
private static void DataReceivedHandlerB(object sender, SerialDataReceivedEventArgs e)
{
    SerialPort spB = (SerialPort)sender;
    inDataB = spB.ReadExisting();
    Console.Write(inDataB);
}

//use those variables here as well in some other functions

当您从 main 调用 Console.Write(inDataxx) 时,inDataxx 为空或空,因为事件处理程序很可能尚未触发。由于尚未创建通知事件或轮询循环,因此此打印命令将执行一次且仅执行一次。

在您提供的示例的主循环中,有三个部分。COM 端口设置、控制台设置和 COM 拆卸。这一切都是按顺序执行的,没有逻辑可以继续打印您的公共(现在是静态变量)。此示例旨在直接从事件处理程序打印。要使设计正常工作,您需要修改主循环以轮询或使用事件来打印数据。尝试像这样进行一些轮询:

int keyIn = 0;
do
{
    // Check if any key pressed, read it into while-controlling variable
    if (Console.KeyAvailable)
        keyIn = Console.Read();
    // Poll our channel A data
    if (!string.IsNullOrEmpty(inDataA))
    {
        Console.WriteLine(String.Format("Received data {0} on channel A", inDataA));
        inDataA = "";
    }
    // Poll our channel B data
    if (!string.IsNullOrEmpty(inDataB))
    {
        Console.WriteLine(String.Format("Received data {0} on channel B", inDataB));
        inDataB = "";
    }
    // Stop looping when keyIn is no longer 0
}while (keyIn == 0);

请注意,如果您打算使用此生产代码,请不要使用轮询。轮询效率非常低。