首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

串口接收时,split出错,该如何解决

2012-01-22 
串口接收时,split出错背景:现在用VB做一个单片机与PC端的串口通信程序。该程序主要是发送命令,然后在串口的

串口接收时,split出错
背景:现在用VB做一个单片机与PC端的串口通信程序。该程序主要是发送命令,然后在串口的接收区完成特定的一些显示,程序采样MSCOMM控件,采样事件驱动方式(来一字符就产生On_Comm事件)。由于每个命令发送后要求在接收区显示的格式和内容不一样,因此在MSComm1_OnComm()函数中用一个标志位来分开显示不同的内容。
问题:现在的问题是在On_Comm函数中接收时不能正确地分割数据。具体代码如下:
 

VB code
receive_cnt = Form1.MSComm1.InBufferCount  Buffer = Form1.MSComm1.Input  Arr = Buffer  s = ""  For i = 0 To receive_cnt - 1  'receive_cnt is static   s = s & Chr$(Arr(i))   intRecCnt = intRecCn  Next i     If bytReceiveType = 1 Then  '对应一项命令    strHLARec = Split(s, "%")    If InStr(s, "End") > 0 Then '检测到结束符中跳出函数      blnReceiveFlag = False         Exit Sub    End If    For i = 0 To UBound(strHLARec)       Text1.Text = Text1.Text & strHLARec(i) & Chr$(10) & Chr$(13)    Next i    Text1.Text = Text1.Text & Chr(10)   ElseIf bytReceiveType = 3 Then  '对应另一项命令    strSysPara = Split(s, "%")    If InStr(s, "END") > 0 Then  '这个结束符和上一个不太一致,这是下位机造成的      blnReceiveFlag = False           Exit Sub    End If    For i = 0 To UBound(strSysPara)       Text1.Text = Text1.Text & strSysPara(i) & Chr$(10) & Chr$(13)    Next i


  在bytReceiveType = 1和3时代码思路都是一样的,但是=1时就能正确地分割,而=3时就不能正确地分割了。二者内容的区别仅仅在于=1时发送的都是定长的(每4Byte用%分开,一共10个4Byte),而=3时用%分割开的内容某些项不是定长的(一共是9项),有两个只有1Byte,而恰恰是这两个1Byte的内容分割不出来。弄了两天了,实在不知道怎么回事
 

[解决办法]
代码不全 只得用猜的
一.RThreshold = 1 '收到1个字节便激发,你是用二进制模式接收的对吧? Buffer变量宣告的是什么形态的?Arr又是什么形态的 ? 如果是二进制的接收,你用Chr$(Arr(i))来转为文字会正确吗?接收的是16进制的,16进制转为文字 Chr(Val("&h" & Arr(i))) ,无法理解......
 

二.代码思路很诡异, 正确的作法是每个Byte逐一接收,碰到终止符时才收尾,一次性将每组字节逐一转为文字,再用split去分割整串接收到的数据,再分两类.

三.Split函数是以特定的字符来分割,不管你每段是几个字,空白也行,你的问题在于接收,不在于Split,你甚至于都没处理这笔接收完后再接收下一笔的数据,这能行吗?


你先参考我的代码, 不懂你再问


【CBM666 的二进制串口收送(1)】
http://cbm666.net/forum.php?mod=viewthread&tid=1011&fromuid=2

【CBM666 的二进制串口收送(2)】
http://cbm666.net/forum.php?mod=viewthread&tid=1014&fromuid=2

热点排行