VB接收串口数据部正常,但串口调试器是正常的,C#程序也没问题

wShineboy 2014-09-20 10:09:55
RT:阿拉使用VB高上位机软件,跟单片机通信时发现:命令可以发送过去,但返回代码确实乱的(跟协议不符,起始代码不对,长度有所减少,校验和有误,偶尔发现长度增加,起始代码会正确)。
使用串口调试器试了一下,一切正常。
俺使用VB新建了一个工程,仅用于调试这个通信,结果还是遇到同样的问题。
接着阿拉使用C#新建一个项目,也用来调试上述通信,发送、接收完全正常,但程序逻辑没任何区别,窗体上的控件也没多的。这是啥子道理呢?
本应收到:EE 33 22 00 00 00 00 CS
结果得到:B9 0C 00 12 00 00 08
通信方式:二进制;设置:9600,n,8,1
Comm控件属性没什么改动,全都是默认值。
...全文
234 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wShineboy 2014-09-24
  • 打赏
  • 举报
回复
起始俺提这个问题的原意是找出MScomm控件解决这种乱码的办法,在VB6里面俺用这个控件十多年了,没有一次不能满足要求。本来打算用最优雅的办法解决,不去考虑什么C#、VC写什么Dll,烦人! 可惜搞了半天没个头绪,俺只好用串口API解决了,反正通信协议不是很复杂。 至于Comm_OnComm事件,很多时候蛮好用,但不该用到它时最好不要纠结,阿拉吃过这种亏的。
wShineboy 2014-09-23
  • 打赏
  • 举报
回复
试了下,用OnComm事件没能解决问题,而且这个事件效率太低,我不喜欢用。 楼上童鞋的办法也没效果,毕竟C#程序也用Threading.Sleep就可以,而其它产品的通信,俺用Sleep这个API,可说百试不爽。
of123 2014-09-23
  • 打赏
  • 举报
回复
把 Sleep 什么的都去掉, Do Until Comm.InBufferCount = 9 DoEvents Loop 当然,你还可以加上超时处理。
三楼の郎 2014-09-23
  • 打赏
  • 举报
回复
事件效率还低,那你还是继续sleep吧,不过sleep 500恐怕不够,试试sleep 10000,你这点数据量sleep 10000的话应该够,MSCOMM控件神马的也没必要了,直接API吧,ReadFile WriteFile操作串口应该更适合你。
wShineboy 2014-09-22
  • 打赏
  • 举报
回复
补充一点:单片机采用485串口连接,因俺的电脑没串口,故加了个USB转串口的东西。
zdingyun 2014-09-22
  • 打赏
  • 举报
回复
LZ的接收应该放在OnComm事件中完成,设置好MsComm控件的RThreshold 属性为9,可以完整接收和处理数据的。
wShineboy 2014-09-22
  • 打赏
  • 举报
回复
单片机的原因可以排除吧?同样的调试程序,c#百试不爽,vb怎么搞都不正常。你叫人家怎么配合你?

我想知道,vb的那个控件是不是有什么属性需要设置?瞬间解决问题
wShineboy 2014-09-22
  • 打赏
  • 举报
回复
没有用到OnComm事件,协议中若果规定即时返回数据,就不要用OnComm事件。

      Dim Out(9) As Byte
      Out(0) = &H55
      Out(1) = &HEE
      Out(2) = &H50
      Out(3) = &H33
      Out(8) = &HC6
      '//Send code:55 EE 50 33 0 0 0 0 C6
      Comm.Output = Out
      Sleep 500
      If Comm.InBufferCount < 5 Then Exit Sub    '//实际字节数应为9,考虑到调试时可能收不完
      Dim DataBuff As Variant
      Dim DTcount As Integer
      DoEvents
      DTcount = Comm.InBufferCount
      DataBuff = Comm.Input
anticlimax 2014-09-22
  • 打赏
  • 举报
回复
细节问题,估计是数组的下标存在错误,最好贴出代码
三楼の郎 2014-09-22
  • 打赏
  • 举报
回复
你是不是在MSComm1_OnComm事件里检测到comEvReceive消息的时候直接去缓冲区读的数据,如果是这样那是要出问题的,因为触发comEvReceive消息的时候数据可能还没接收完成,这时候去读缓冲区就会少东西,而下次再读的时候又可能多东西,因为上次还有部分东西没读出。 解决办法就是自己编程再建个缓冲区,在MSComm1_OnComm事件里检测到comEvReceive消息的时候把数据直接读到自建的缓冲区里面,然后根据协议对自建缓冲区的数据进行处理。
greatbody 2014-09-21
  • 打赏
  • 举报
回复
这种状态下,双向通信几乎无误码。
greatbody 2014-09-21
  • 打赏
  • 举报
回复
这个时候,记得检查单片机。单片机的芯片选择11.0592M的最适合进行上位机下位机通信,波特率我记得是9600. 这种状态下,双向通信几乎呜呜吗。

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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