mscomm控件会不会自己发送一些数据?

bubuxindong 2013-08-23 04:50:35
最近在做usb转串口的上位和下位,遇到了一些问题。

背景:
上位:PC上调用mscomm控件,做一个串口的调用,并对串口进行一些读写操作。
下位:LPC1778的板子,作为usb device, CDC类。
板子与PC之间用usb连接,这样pc就能识别一个虚拟串口,供上位软件使用。


PC与板子之间能够通信,数据都能收发。但是有时候,板子会出现stall pid 错误,即PC发出一些错误的PID报文,板子无法识别。这样的话,板子usb device的0x82 IN端口就halt,停止工作了。PC继续给板子 usb device发送报文,板子能够接收到,但是就是进入不了0x82 IN中断(由于已经halt了)。报文见usblyzer 截图。

这里有两个问题:
1. mscomm会不会自己发送一些数据,而不是程序让他发送的?
比如mscomm会不会自己修复一些错误之类的。

2. 如果出现了这种错误,该如何修复?
已经试过GetLastError以及ClearCommError,因为GetLastError是获取函数中出现的返回错误,而PC的读取函数以及发送函数分别为GetInput和SendInput,好像不会出现这些错误。

...全文
216 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bubuxindong 2013-09-26
  • 打赏
  • 举报
回复
问题终于已经解决! 哎,真是历经千难万险啊! 原因是由于伺服未处理好的地线引起的干扰。 由于usb插座与板子外壳相连,插上usb数据线之后。如果地线有干扰,则与电脑之间形成了回路。电流的磁场干扰了D+,D-. 所以解决方案有两个: 1. 把usb线的屏蔽层隔开,最近干扰源的地方隔开,不然导线之间形成电容,还是会形成干扰。 2. 将把插座与FG隔离。 谢谢hdg3707,把分给你了。
bubuxindong 2013-08-24
  • 打赏
  • 举报
回复
引用 4 楼 hdg3707 的回复:
1。 串口硬件上的错误发生时,硬件就会自动中止发送这个字节,如果还有其它字节要继续发送,那么其它的字节会继续尝试继续发送。 2。 如果你是做个USB转串口的板子,那么USB转串口的芯片在和上位机通信的代码应该是已固定到芯片里了,上位机只需按串口方式编程就行了,因此想从上位机进行处理错误可能性不大,你还是仔细看看芯片的手册,特别是芯片所需要的电容一定要和手册上的参数一致,不能自己做出改动,因为CH431这个USB转串口的芯片,有一个电容是手册给出的是102,结果别人用了103,导致通信不可靠,后来改成102就可靠了
谢谢你的回答。 1. 我后来想了想,也不应该是MSCOMM另外发送的数据,因为IN事物是由主机发起的,与串口没有关系。 有可能是usbser.sys对于device没有发送ACK,然后又进行的一次IN报文,但不知道为什么会出现这种情况。 2. 我做的不是USB转串口的板子,而是直接usb的板子,不过是CDC类,可能通过一些描述符和INF文件,电脑就能识别成一个usb virtual com,然后再通过mscomm控件对他操作,这样的话,速度跟usb的速度差不多,比串口的速度快!
hdg3707 2013-08-24
  • 打赏
  • 举报
回复
1。
串口硬件上的错误发生时,硬件就会自动中止发送这个字节,如果还有其它字节要继续发送,那么其它的字节会继续尝试继续发送。
2。
如果你是做个USB转串口的板子,那么USB转串口的芯片在和上位机通信的代码应该是已固定到芯片里了,上位机只需按串口方式编程就行了,因此想从上位机进行处理错误可能性不大,你还是仔细看看芯片的手册,特别是芯片所需要的电容一定要和手册上的参数一致,不能自己做出改动,因为CH431这个USB转串口的芯片,有一个电容是手册给出的是102,结果别人用了103,导致通信不可靠,后来改成102就可靠了
bubuxindong 2013-08-23
  • 打赏
  • 举报
回复
引用 2 楼 hdg3707 的回复:
1。 MSCOMM不会自己发数据,而且MSCOMM不会知道哪些数据是正确和错误。 2。 有可能不是上位机的问题,有可能是干扰造成的或是硬件(比如通信线不符合高速要求或焊点质量有问题等)不可靠,因此,这时应该在下位机程序里里做出判断。 按你描述的,应该是直接对芯片编程,因此,这就可以从下位机程序里对数据进行判断对错误进行处理
1. MSCOMM可能虽然不知道数据的正确与错误,但是com口会不会有一些类似握手或者是硬件crc之类的东西,当检测到这些错误,会不会就会进行一些修复? 2. 现在还不知道是不是干扰引起的。可是USB的发起都是由主机发起的,在主机发送一些事物给device的时候,有些数据比如说PID,device的接收缓冲区是接收不到的,只能接收一些和确定是哪个端点。我觉得如果要修复的话,也是要从主机端开始,发送clear feature之类的帧。 但是在串口中,好像并没有clear feature。
hdg3707 2013-08-23
  • 打赏
  • 举报
回复
1。
MSCOMM不会自己发数据,而且MSCOMM不会知道哪些数据是正确和错误。
2。
有可能不是上位机的问题,有可能是干扰造成的或是硬件(比如通信线不符合高速要求或焊点质量有问题等)不可靠,因此,这时应该在下位机程序里里做出判断。
按你描述的,应该是直接对芯片编程,因此,这就可以从下位机程序里对数据进行判断对错误进行处理
bubuxindong 2013-08-23
  • 打赏
  • 举报
回复
网速有点差,usb抓包报文如下:

3,248

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧