1. 问题描述---在下拉菜单中显示目前可用的串口,首先是要检测连到PC上的串口个数,再者就是检测到的串口是否已经打开,若已经打开,则菜单项显示成灰色,即不可用。
2. 问题背景:一般PC只有一到两个串口,但是进行测试设备的时候,有一种串口线可以分出多个串口。所以有此需求。
3. 解决办法
a. 在Windows平台下,我使用了两种办法:
第一种: 对串口挨个调用CreateFile来打开进行检测, 优点:可以检测到是否已经打开. 缺点: 你不知道要枚举多少个串口号,我还不知道有没有API可以只检测个数? 对存在的串口而言,这样枚举很慢,效果就是菜单“死”在那里了。
第二种: 查找注册表,可以检测到串口的个数,但是没法检测是否已经打开,优点是速度很快,菜单不会“卡住”。
b. 在Linux平台下,直接枚举各个串口,用打开检测的方法, 缺点还是你无法知道要枚举到多少,但是速度很快,我枚举了十个串口,用时平均在0.8秒,如果用于菜单的话,基本不会出现“死”的现象。
4. 最终的解决方法,在Windows平台下,把前两者的优点结合在一起,用查询注册表的办法统计串口号,再用Linux下的打开方式检测是否已经使用(因为比较快)。
5.具体方法:
在Cygwin下写一个检测串口的exe小程序,但是用的是Linux的API, 即轮循打开,然后在Windows下调用CreateProcess打开这个小程序,最后用GetExitCodeProcess来获取那个小程序的返回值就可以了。
伪代码:
CreateProcess("xxxxxx", NULL, NULL, NULL, FALSE, 0, NULL, "xxxxxxxxx", &si, &pi))
WaitForSingleObject(pi.hProcess, INFINITE);
GetExitCodeProcess(pi.hProcess, &dwExitCode);