【问题标题】:MFC Serial Port WriteFile() CrashMFC 串口 WriteFile() 崩溃
【发布时间】: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 看看是否可行...

标签: visual-c++ mfc serial-port


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

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