我正在使用WinLIRC将IR接收器连接到Windows 7 x64上的串行端口COM1。 WinLIRC
已添加到Startup文件夹(Start-> All applications-> Startup),因此每次登录时都会启动。很多时候(但不是所有时间)我都会看到来自{{1}的初始化错误消息如果我重试初始化,它会持续一段时间(几分钟),并且在重试之后它会正确初始化并且工作正常。如果我从启动中删除它并在任何其他时刻手动启动它会启动而没有错误。
我已经下载了WinLIRC
个来源并在此处添加了WinLIRC
个调用,因此我可以看到初始化期间发生的情况,并发现MessageBox
调用失败:
CreateFile
我看到消息框说“CreateFile(COM1)失败了5”,而5是根据this link“拒绝访问”错误的错误代码。
所以问题是为什么在启动Windows之后立即打开COM端口会出现这样的错误并在几秒钟或几分钟后正常进行?
更新:COM端口是真实的。
Update2 :关于在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;
}
之前打开串口的其他应用程序。我做了以下操作:我将Process Explorer放到Startup文件夹中,以便在登录时启动,然后重新启动。一旦进程浏览器启动,我运行“查找句柄或Dll”对话框,将“Serial0”放入输入并点击“搜索”。到那时,WinLIRC已经显示消息框说“CreateFile(COM1)失败了5”。然后我等到进程资源管理器搜索结束,看到它什么也没找到,然后尝试重新初始化WinLIRC并再次失败。所以我建议不是其他应用程序打开串口的情况。如果有人能提出更好的检查方法,我会很高兴地重新检查。
当我在WinLIRC运行时在进程资源管理器中搜索“Serial0”时,它会找到WinLIRC
进程,因此看起来它是正确的搜索术语。
Update3 :关于串行鼠标驱动程序。它未在设备管理器中列出,因此我无法在那里禁用它,但是我找到了有关如何禁用winlirc.exe
服务的this说明,但它没有帮助。
Update4 :我还忘了提一件事。只有在我启动PC后很快登录才会发生这种情况。如果我将Windows保留在登录屏幕上几分钟并稍后登录,那么WinLIRC会始终初始化而没有任何问题。
Update5 :不幸的是,我无法访问重现此问题的计算机,因此我无法再进行实验。
答案 0 :(得分:1)
初始化端口需要时间。 您的应用程序将在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;
}
这将返回串口列表。检查它的状态并将其显示在消息框中。 制作此代码并在启动时运行。你会找到根本原因。
答案 1 :(得分:1)
这里有一些链接,在进入Windows的串行编程魔术世界之前必须访问:)
Windows中串行编程的详细说明:
有点过时(网站陈述1999-2003所以是的,它已经过时了)但绝对有用: