n0r*_*0rd 8 winapi serial-port createfile
我正在使用带有IR接收器的WinLIRC连接到Windows 7 x64上的串行端口COM1.WinLIRC添加到Startup文件夹(开始 - >所有应用程序 - >启动),所以每次登录时都会启动.很多时候(但不是所有时间)我看到初始化错误消息WinLIRC,持续一段时间(几分钟)如果我重试初始化,并在一些重试后,它正确初始化并正常工作.如果我从启动中删除它并在任何其他时刻手动启动它启动没有错误.
我已经在这里和那里下载了WinLIRC源代码并添加了MessageBox调用,因此我可以看到初始化期间发生的情况并发现CreateFile调用失败:
if((hPort=CreateFile(
settings.port,GENERIC_READ | GENERIC_WRITE,
0,0,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,0))==INVALID_HANDLE_VALUE)
{
char buffer[256];
sprintf_s(buffer, "CreateFile(%s) failed with %d", settings.port, GetLastError());
MessageBox(NULL, buffer, "debug", MB_OK);
hPort=NULL;
return false;
}
Run Code Online (Sandbox Code Playgroud)
我看到消息框说"CreateFile(COM1)失败了5",5是根据此链接 "拒绝访问"错误的错误代码.
所以问题是为什么在启动Windows之后打开COM端口会出现这样的错误并在几秒钟或几分钟之后正常进行?
更新:COM端口是真实的.
Update2:关于之前打开串口的其他应用程序WinLIRC.我做了以下操作:我将Process Explorer放到Startup文件夹中,因此它也会在登录时启动,然后重新启动.一旦进程浏览器启动,我运行"查找句柄或Dll"对话框,将"Serial0"放入输入并点击"搜索".到那时,WinLIRC已经显示消息框,说"CreateFile(COM1)失败了5".然后我等到进程资源管理器搜索结束,看到它什么也没找到,然后尝试重新初始化WinLIRC并再次失败.所以我建议不是其他应用程序打开串口的情况.如果有人能提出更好的检查方法,我会很高兴地重新检查.
当我在WinLIRC运行时在进程资源管理器中搜索"Serial0"时,它会找到该winlirc.exe进程,因此看起来它是正确的搜索术语.
Update3:关于串行鼠标驱动程序.它不是在设备管理器中列出,所以我没能有禁用它,但是我发现这对如何禁用指令sermouse服务,并没有帮助.
Update4:我还忘了提一件事.只有在我启动PC后很快登录才会发生这种情况.如果我在登录屏幕上将窗口保留几分钟并稍后登录,则WinLIRC会始终初始化而不会出现任何问题.
Update5:不幸的是,我无法访问出现此问题的计算机,因此我无法再进行实验了.
初始化端口需要时间。您的应用程序将在 Windows XP 上运行得非常好。Windows7的串口是虚拟的。
您可以运行一小段代码并使用 System.IO.Ports 检查它;
private void Form1_Load(object sender, EventArgs e)
{
string[] ports = System.IO.Ports.SerialPort.GetPortNames();
comboBox1.Items.Add("None");
foreach (string port in ports)
comboBox1.Items.Add(port);
comboBox1.SelectedIndex = 0;
}
Run Code Online (Sandbox Code Playgroud)
这将返回串行端口列表。检查其状态并将其显示在消息框中。编写此代码并在启动时运行。您将找到根本原因。
| 归档时间: |
|
| 查看次数: |
4166 次 |
| 最近记录: |