You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ReadFile()时缓冲区出现偏移字符的问题排查

问题描述

我的需求

我正在编写一个Windows控制台程序,通过UART与ATMega2560开发板通信。需要将stringToSend中保存的字符串发送给MCU,再由MCU回传给PC,回传的字符串需保存到receivedString并输出到Windows控制台窗口。

当前代码表现

程序能正常发送字符串给MCU并收到回传,但控制台中回传字符串前会出现大量意外的'╠'字符,示例如下:

You sent:
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠Sended test string!


补充:当BUFFER_SIZE固定时,异常字符数量固定,且随BUFFER_SIZE变化:

  • 若BUFFER_SIZE = 124,则有132个该字符
  • 若BUFFER_SIZE = 1024,则有1032个该字符
  • 若BUFFER_SIZE = 1,则有9个该字符

异常现象

  • 最奇怪的是,设置断点查看receivedString时找不到stringToSend中的字符串,但它会显示在控制台中。
  • 使用Termite(串口通信控制台)发送数据后,问题消失,之后用我的控制台也能只收到正确字符串。

疑问

  • 是否需要在MCU中设置某些位/标志来避免此问题?
  • 会不会是字符串格式的问题?
  • 我是不是完全忽略了PC/MCU收发数据前后需要执行的操作?

已尝试的操作

  • 尝试在网上寻找解决方案,但毫无收获
  • 没有进行任何实验,因为我完全不清楚问题出在哪里

我非常感谢任何帮助,包括代码重构或其他编程建议。


对评论的回复

  1. 能否以十六进制打印这些值并说明数量?

输出:

ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc >ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc >ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc >ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc >ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc ffffffcc 53 65 6e 64 65 64 20 74 65 73 74 20 73 74 72 69 6e 67 21

这些字符的数量始终为BUFFER_SIZE + 8,十进制表示为-52


解决方案

  • 我已为WriteFile()和ReadFile()添加第4个参数,问题并未因此出现(但根据文档,最后两个参数不能同时为NULL,这确实可能引发其他问题)。
  • 我在文档中发现,ReadFile()应在事件发生后调用,由WaitCommEvent()捕获事件。通过SetCommMask(mainCom, EV_RXCHAR)设置事件类型,当输入缓冲区有字符时触发事件。此方案表明问题由开发板导致,因为WaitCommEvent()会进入无限循环等待接收数据。但不使用WaitCommEvent()时,发送的数据似乎被保存在某种内存中并从中读取,即使开发板未回传也会被打印。真正解决问题的方法是每次Windows启动后重新连接开发板(重新连接后,即使使用WaitCommEvent()也能正常工作),这引出另一个疑问:Windows启动时是否会向USB端口发送异常数据导致开发板异常,但这属于另一个话题。也可能是Windows启动时使用了不同的通信参数(如波特率等)导致的,但这也属于其他问题。

内容的提问来源于stack exchange,提问作者Wartiik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:50:26