我有一个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
第二个端口的代码与上面的代码类似,区别在于不同的端口,datareceived事件和计时器。
我将尝试Grant Thomas建议的多线程选项:我之前没有尝试过,因为我认为串口已经在单独的线程上工作:datareceived事件不会阻塞主线程而你不能访问控制在主线程上创建,但我仍然会使用后台工作程序,并稍后恢复。谢谢大家的快速回复。
答案 0 :(得分:5)
你需要做一些阅读,特别是在Threading上。
如果你有一些看起来像这样的代码:
ReadDataFromSomePort();
ReadDataFromSomeOtherPort();
然后第一个将同步执行(阻塞),然后然后执行后者。这发生在同一个线程,主应用程序线程上。当你想做异步事情时,包括在保持UI交互/响应的同时做一件事,那么你需要将工作委托给其他线程。
所以,你最终得到这样的东西:
var thread1 = new Thread(ReadDataFromSomePort);
var thread2 = new Thread(ReadDataFromSomeOtherPort);
thread1.Start();
thread2.Start();
除此之外还有更多,请放心,所以我建议在继续之前对这个概念进行一些研究。
MSDN有tutorial/programming reference for threading,可以帮助您入门。
答案 1 :(得分:1)
为两者创建SerialPort
和不同DataReceived
事件的两个不同对象应该有效。