串口接收时,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