我正在尝试设置程序以自动检测哪个COM端口连接到我的设备,为此,这是我到目前为止所做的:
我使用以下命令获取COM端口
string[] comPorts = SerialPort.GetPortNames();
一旦有了适用于我的PC的可用COM端口,就可以在foreach循环内创建一个SerialPort实例以打开,然后通过每个可用的COM端口发送字符串命令。将我的设备连接到这些COM端口之一后,它将使用另一个字符串命令进行响应,我通过SerialPort.DataReceived事件捕获了该命令。
foreach(string port in comPorts)
{
SerialPort sp = new SerialPort(port, 9600, Parity.None, 8, StopBits.One);
sp.Handshake = Handshake.None;
sp.Open();
sp.Write("<ID01>\r\n"); // this command wakes up the device. The device then sends back the string "<ID01>S" in which 'S' is the code for Success.
}
这很好,我可以成功返回成功字符串。所有这些的原因是我希望程序自动识别设备是在哪个COM端口上设置的。问题在于,当DataReceived事件返回Success字符串时,该程序已经超过了它将对我有好处的地步,因为正在运行该程序的Main线程似乎已经在前进。我以为也许可以通过执行Thread.Sleep(10000)来暂停主线程;但是它似乎暂停了SerialPort。在主线程过去之后,SerialPort.DataReceived事件仍然传递回我的数据。
所以我的问题是:有没有办法暂停主线程以允许DataReceived信息传递回来,以便我可以根据设备是否已连接到该特定COM端口来处理代码?
如果不是,那么没有人对我可能如何做到这一点有任何建议吗?
道路管理员
您的问题是您使用的是异步读取方法,而实际上您需要一个同步读取方法。
这几乎做同样的事情,但都在一个线程上:
foreach(SerialPort port in SerialPort.GetPortNames())
{
SerialPort sp = new SerialPort(port, 9600, Parity.None, 8, StopBits.One);
sp.Handshake = Handshake.None;
sp.Open();
sp.Write("<ID01>\r\n");
Thread.Sleep(250); // give it some time to respond
string response = sp.ReadExisting();
if(response == "<ID01>S")
{
found = true;
// do something useful
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句