我对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。这是可能的,还是有另一种更好的方法来做到这一点。
答案 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);
请注意,如果您计划使用此产品代码,请不要使用轮询。轮询是非常低效的。