嵌入式开发问题-如何从错误的串行端口打开中解脱出来? WindowsCE,C++项目下,我尝试通过“真实”串行端口和/或串行到USB包装(虚拟串行端口)连接的设备;我的问题是——当我试图打开端口时,如果出现问题,函数将永远不会返回,系统将进入非响应状态,最终必须重新启动。我需要从主线程打开端口。问题是-我怎样才能让它以可控的方式发生?? 这是开头的代码片段: std::ostringstream device_name; device_name << "\\\\.\\COM" << port; m_port = ::CreateFile(device_name.str().c_str(), GENERIC_READ | GENERIC_WRITE, 0, // exclusive access NULL, // no security OPEN_EXISTING, FILE_FLAG_OVERLAPPED, // overlapped I/O NULL); // null template std::ostringstream设备名称; device_name

嵌入式开发问题-如何从错误的串行端口打开中解脱出来? WindowsCE,C++项目下,我尝试通过“真实”串行端口和/或串行到USB包装(虚拟串行端口)连接的设备;我的问题是——当我试图打开端口时,如果出现问题,函数将永远不会返回,系统将进入非响应状态,最终必须重新启动。我需要从主线程打开端口。问题是-我怎样才能让它以可控的方式发生?? 这是开头的代码片段: std::ostringstream device_name; device_name << "\\\\.\\COM" << port; m_port = ::CreateFile(device_name.str().c_str(), GENERIC_READ | GENERIC_WRITE, 0, // exclusive access NULL, // no security OPEN_EXISTING, FILE_FLAG_OVERLAPPED, // overlapped I/O NULL); // null template std::ostringstream设备名称; device_name,c++,embedded,windows-ce,C++,Embedded,Windows Ce,免责声明:我从未使用过WinCE,我个人对使用“蓝屏死亡”家喻户晓的公司的操作系统来开发嵌入式系统持保留态度 愚蠢的第一个问题:你有没有确认没有其他人已经打开了那个特定的COM端口 你要求独占访问。如果其他人已经拥有它,我希望系统会挂起您的任务,直到其他人释放该端口。您无法保护自己免受损坏的USB设备驱动程序的攻击。挑选一个更好的。为什么不在另一个线程中执行open?没有理由在该线程中执行任何其他操作-只需打开端口,就可以在进程中的任何其他线程中使用打开端口的句柄 但是,我不确定是什么搞砸了,以

免责声明:我从未使用过WinCE,我个人对使用“蓝屏死亡”家喻户晓的公司的操作系统来开发嵌入式系统持保留态度

愚蠢的第一个问题:你有没有确认没有其他人已经打开了那个特定的COM端口


你要求独占访问。如果其他人已经拥有它,我希望系统会挂起您的任务,直到其他人释放该端口。

您无法保护自己免受损坏的USB设备驱动程序的攻击。挑选一个更好的。

为什么不在另一个线程中执行open?没有理由在该线程中执行任何其他操作-只需打开端口,就可以在进程中的任何其他线程中使用打开端口的句柄


但是,我不确定是什么搞砸了,以至于您的
CreateFile()
调用似乎挂起了-我想知道即使在另一个线程上也会发生这种情况,您的应用程序中是否仍然会保持稳定。

否,这会产生错误\u访问被拒绝,有时你没有选择OS i的权利——如果它是由其他人打开的——它会给出错误,但函数会返回;我想知道的是,如果CreateFile函数调用花费的时间太长,我是否可以从中解脱出来——但由于处于同一个线程中,我不知道如何做到这一点。如果,比方说,我把这个m_port变量传递到一个特殊的“打开”线程中,如果它太长,我可以终止它-那很好,但是-如果它成功地从那个特殊线程打开,然后退出,那么它在主线程中对我来说会是一样的吗-我的意思是,端口的句柄-它是否会像从主线程打开一样完全可操作?我不太喜欢线程…@John:CE和桌面没有共同的代码,所以可靠性无法相比。微软的桌面操作系统总是有问题(但由于需要能够处理几乎无限的硬件配置,几乎每个桌面操作系统都有问题)。我已经运行CE系统好几个月了,没有碰过它们,如果不是因为停电之类的事情,我不会惊讶于看到一个系统无限期地运行。@ctacke:我坚持我的保留意见。这可能有助于解释为什么:这的确是一个赝品,但在任务或安全关键系统上看到这样一个的前景对我来说太可怕了。在我的情况下,它也是易碎的电缆/连接器、电缆另一端不稳定的设备等等;我希望能够通过代码来处理这个问题,你的代码片段是否准确?还是挂断了ReadFile的电话?使用SetCommTimeouts()。不,是CreateFile让我感到悲伤;我以后会有SETCOMM超时我必须同意Hans的意见。如果它挂在CreateFile中,那是因为驱动程序(由OEM提供,而不是Microsoft提供)是垃圾。CreateFile是一个阻塞系统调用,所以即使将它放在单独的线程上也可能对您没有好处。总线上的任何内容都不应导致仅打开UART挂起。我正在打开端口以连接摄像头,我已经得到一些统计数据表明,当我的电缆/连接器坏了和/或特定摄像头出现问题时,我就遇到了这个问题。我的设置很复杂(至少可以这么说)-一个串行摄像头连接到一个串行/USB(FTDI)设备,而FTDI驱动程序又将其表示为一个COM端口。在不久的将来,我肯定会尝试在另一个线程中打开端口。从我这里得到的信息来看,没有人对这个想法感到震惊,所以它可能会成功