使用Main()内多个串口的读取数据

时间:2014-03-30 05:06:18

标签: c# serial-port

我对C#编程很新,对串口知之甚少。我正在关注Microsoft提供的this method以持续读取进入多个串行端口的信息。总的来说,我的应用程序是从多个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。每当我公开这个方法时,它似乎都失败了。我希望能够返回字符串inDataB。这是可能的,还是有另一种更好的方法来做到这一点。

2 个答案:

答案 0 :(得分:0)

你有什么理由不能将这两个变量作为主要的变量,因此它们可用于所有函数吗?

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

答案 1 :(得分:0)

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

在您提供的样本的主循环中,有三个部分。 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);

请注意,如果您计划使用此产品代码,请不要使用轮询。轮询是非常低效的。