【问题标题】:Can't open COM1 from application launched at startup无法从启动时启动的应用程序打开 COM1
【发布时间】:2011-11-20 09:32:31
【问题描述】:

我正在使用WinLIRC,IR 接收器连接到 Windows 7 x64 上的串行端口 COM1。 WinLIRC 被添加到启动文件夹(开始->所有应用程序->启动),所以它在我每次登录时都会启动。我经常(但不是一直)看到来自 WinLIRC 的初始化错误消息,这些消息会持续一段时间时间(几分钟),如果我重试初始化,并且在重试几次后它会正确初始化并且工作正常。如果我将它从 Startup 中删除并在其他任何时候手动启动,它就会毫无错误地启动。

我已经下载了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;
}

我看到消息框显示“CreateFile(COM1) failed with 5”,并且 5 是根据 this link 的“访问被拒绝”错误的错误代码。

所以问题是为什么在启动 Windows 后打开 COM 端口会失败并出现此类错误,并在几秒钟或几分钟后正常继续?

更新:COM端口是真实的。

Update2:关于WinLIRC之前打开串口的其他应用程序。我做了以下事情:我把Process Explorer 放到了启动文件夹中,所以它也在登录时启动,然后重新启动。进程资源管理器一启动,我就运行“查找句柄或 Dll”对话框,将“Serial0”放入输入并点击“搜索”。到那时 WinLIRC 已经显示消息框说“CreateFile(COM1) failed with 5”。然后我等到进程资源管理器搜索结束,看到它什么也没找到,然后尝试重新初始化 WinLIRC,它又失败了。所以我建议不是串口被其他应用程序打开的情况。如果有人可以提出更好的检查方法,我会很乐意重新检查。

当我在 WinLIRC 运行时在进程资源管理器中搜索“Serial0”时,它会找到 winlirc.exe 进程,因此它看起来是正确的搜索词。

Update3:关于串口鼠标驱动。它没有在设备管理器中列出,所以我无法在那里禁用它,但是我找到了关于如何禁用 sermouse 服务的 this 说明,但它没有帮助。

Update4:还有一件事我忘了说。仅当我在启动 PC 后不久登录时才会发生这种情况。如果我让窗口在登录屏幕上停留几分钟然后再登录,那么 WinLIRC 的初始化总是没有任何问题。

Update5:很遗憾,我无法访问出现此问题的计算机,因此无法再进行实验。

【问题讨论】:

  • 还有一个进程先打开端口。应该是服务吧。禁用它。
  • 您的 COM 端口是真正的物理 COM 端口,还是 USB 串行适配器?
  • @HansPassant,这是个好主意,我正在研究它。
  • @HansPassant,好像不是这样,看我的更新。
  • 也许 Windows 正在探测端口以寻找串行鼠标。尝试从控制面板/设备中禁用“串行鼠标”驱动程序。

标签: winapi serial-port createfile


【解决方案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;

    }

这将返回您的串行端口列表。检查它的状态并将其显示在消息框上。 制作此代码并在启动时运行。你会找到根本原因。

【讨论】:

    【解决方案2】:

    在进入 Windows 中串行编程的神奇世界之前,必须访问一些链接 :)

    Windows下串口编程详解:

    http://www.codeguru.com/cpp/i-n/network/serialcommunications/article.php/c5425/Serial-Communication-in-Windows.htm

    有点过时(网站声明 1999-2003 所以是的,它已经过时了)但绝对有用:

    http://www.flounder.com/serial.htm

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 2014-12-25
      • 1970-01-01
      • 2021-07-08
      • 2011-11-28
      • 2019-04-08
      相关资源
      最近更新 更多