MFC 串口 WriteFile() 崩溃

Posted

技术标签:

【中文标题】MFC 串口 WriteFile() 崩溃【英文标题】:MFC Serial Port WriteFile() Crash 【发布时间】:2011-09-22 11:00:47 【问题描述】:

我正在尝试使用 WriteFile() 函数写入串行端口,当我放置一些断点来检查它是否正在写入时,它没有。我正在尝试通过我的 COMM 端口传递一串数据。

BOOL bWriteRC = false;
DWORD iBytesWritten = 0;

//String data: "$ABCEFG,00000020,010000003F800000*##\r\n" ==> stored in a CString

CString sStore = "$ABCEFG,00000020,010000003F800000*##\r\n";

bWriteRC = WriteFile(hdl,sStore.GetBuffer(),sStore.GetLength(),&iBytesWritten,NULL); // doesn't go past this...

不知何故,每当我执行它时,程序都不会越过这个函数并停止。关于我做错了什么有什么建议吗?

我尝试减少 GetLength(),将其设为 14,它可以完美运行,但是一旦要写入的字节数增加到 14 以上,WriteFile() 就会停止前进。

提前致谢。

【问题讨论】:

你能给我们一些周边代码吗?来自调试器的任何信息?这是什么类型的崩溃? 因为它不会“崩溃”崩溃。它只是没有通过 WriteFile() 函数。周围的代码添加为编辑。 您对代码的哪一部分感兴趣?手柄和设置 comport 方面的其他一切都很好。它初始化良好。 假设文件句柄正常,串行端口 WriteFile 应该始终成功。首先,断开任何设备与 COM 端口的连接并执行此行 - 它有效吗?如果设备工作不正常,WriteFile 可能会挂起,没有设备它应该可以工作。 把你的 CString 改成 CStringA 看看是否可行... 【参考方案1】:

考虑到您的问题,WriteFile() 应该总是像 Alex 前面提到的那样成功。更好地检查您尝试写入的字符串是否正确,以及在串行端口上是否可以接受。有时,这样的小事情可能会被监督并导致大错误。除此之外,在我看来,如果它是一个简单的写操作,它应该可以工作。

【讨论】:

【参考方案2】:

如果它在 WriteFile 中挂起,则表示 COM 端口驱动程序不接受您的数据,它无法将其发送到 COM 端口。这取决于 DTR 信号状态等 COM 端口设置。您需要检查流量控制设置。

【讨论】:

WriteFile 之前工作过,并且每次我尝试写入时都更早地接受了数据。所以,我 100% 确定我的 COM 端口设置没有问题。 如果 WriteFile 崩溃,那么您的 WriteFile 参数有问题。如果它返回错误,那么您的参数或端口句柄有问题。但如果它永远挂起,那么你的 COM 端口流量控制就有问题。 我猜字符串长度有问题。我已经编辑了我的问题。 我还是觉得是流控问题,尝试用14个字符调用两次WriteFile,第二次调用必须挂掉。如果它以某种方式与字符串相关,那么您可以使用 SysInternals 的 PORTMON 跟踪发送到 COM 端口的数据。 是的,我试过了。它没有挂起,两个写函数都被执行。

以上是关于MFC 串口 WriteFile() 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

一个简单的MFC 问题

通过编写串口助手工具学习MFC过程——自动识别串口的方法

MFC串口调试工具教程

使用 WriteFile API 将 unicode CString 写入文件

通过编写串口助手工具学习MFC过程——遇到的一些问题

通过编写串口助手工具学习MFC过程——添加ComboBox组合框