我正在尝试识别接收某个字符串的串行端口(COM)。 无论如何,如果我在每个COM上循环,C#会在某些端口(例如COM 10)上连接后锁定ReadLine。
我正在考虑在新的SerialPort
上启动.ReadLine()
Thread
,经过一段时间后我就杀了这个帖子。
无论如何,我在想是否有更多的优雅"实现相同结果的方法。
以下是代码的一部分:
String com="";
for (int i= 0; i< ports.Length; i++) //ports is an array of String, the elements are the opened COM
{
mysp= new SerialPort(ports[i], 9600);
try {
mysp.Open();
String temp = mysp.ReadLine(); //HERE INFINITE LOOP ON CERTAIN PORTS
if (temp.IndexOf("*") > -1)
{
com = ports[i]; //Set the correct COM port
i = ports.Length;
mysp.Close();
}
}catch(Exception e)
{
Console.WriteLine("Exception "+e+" on " + ports[i]);
mysp.Close();
}
}
编辑:我在评论中建议jdweng更正问题。它不会阻止.Open()
,但会阻止.ReadLine()
。
答案 0 :(得分:0)
您可以让用户配置要使用的端口,通常是这样做的。
或者打开所有可用端口,等待连接,然后关闭未使用的端口。
答案 1 :(得分:0)
您可以将呼叫包裹在具有指定超时的Task
中。
int timeout = 5000; // Cancel the task after 5 seconds
Task.Run(() => {
var temp = mysp.ReadLine(); //HERE INFINITE LOOP ON CERTAIN PORTS
if (temp.IndexOf("*") > -1)
{
com = ports[i]; //Set the correct COM port
i = ports.Length;
mysp.Close();
}
}).Wait(timeout);
还应该在异常后将mysp.Close();
移动到finally
块。