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

串口接收时,split疏失

2013-01-04 
串口接收时,split出错本帖最后由 jiehao 于 2011-02-12 21:42:54 编辑背景:现在用VB做一个单片机与PC端的

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

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

热点排行