这是个用mscomm控件接收串口数据的程序.串口每接受一个字节触发接受程序.从串口读取然后发送到文本框显示.发送的数据是55,2000-0000的递减(即55 20 00 55 ff 1f 55 fe 1f 55 fd 1f....55 05 00 55 04 00 55 03 00..).可以确定发送端发送数据没有问题.可文本框显示先是错误.后又正确然后又错误(具体数据见后面).为什么呢.下面依次是vb原程序和文本框输出**********程序代码*********************Dim ErroArray(30000) As Byte
Dim BufferByte() As Byte
Dim i As Integer
Dim CommandFlag As Integer
Dim buffer As Variant
Private Sub Command1_Click()
 CommandFlag = 1
 MSComm1.Output = "1"
 
End SubPrivate Sub Command2_Click()
CommandFlag = 0
MSComm1.Output = "0"End SubPrivate Sub Command3_Click()
Text1.Text = ""End SubPrivate Sub Form_Load()
 i = 0
 CommandFlag = 2
 MSComm1.PortOpen = True
End SubPublic Sub MSComm1_OnComm() '接收数据触发OnComm()事件
    Select Case MSComm1.CommEvent  '在CommEvent中接收数据
    Case comEvReceive
      If CommandFlag = 0 Then
       Text1.Text = Text1.Text & vbCrLf + "写55完成"
      Else
        buffer = MSComm1.Input  '读出借收到的数据到variant变量buffer
        BufferByte = buffer     '存入byte型
        ErroArray(i) = BufferByte(0)  '将接收到的数据保存到数组中
        i = i + 1                     '数组索引加一
        Text1.Text = Text1.Text + "  " + CStr(Hex(ErroArray(i - 1))) '在文本框中显示接收到的16进制数据
        
        DoEvents
      End If
     
    
    
  End Select
  
  
End Sub
********输出结果******************55  0  20  55  F5  1F  55  3F  55  3F  55  3F  55  3F  55  3F  55  
^^^^^^^^^^
第一个是正确的
3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
这是错误的输出
  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  AC  1F  55  7F  1F  55  7E  1F  55  7D 
                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                           从这个地方开始是正确的   
 1F  55  7C  1F  55  7B  1F  55  7A  1F  55  79  1F  55  78  1F  55  77  1F  55  76  1F  55  75  1F  55  74  1F  55  73  1F  55  72  1F  55  71  1F  55  70  1F  55  6F  1F  55  6E  1F  55  6D  1F  55  6C  1F  55  6B  1F  55  6A  1F  55  69  1F  55  68  1F  55  67  1F  55  66  1F  55  65  1F  55  64  1F  55  63  1F  55  62  1F  55  61  1F  55  60  1F  55  5F  1F  55  5E  1F  55  5D  1F  55  5C  1F  55  5B  1F  55  5A  1F  55  59  1F  55  58  1F  55  57  1F  55  56  1F  55  55  1F  55  54  1F  55  53  1F  55  52  1F  55  51  1F  55  50  1F  55  4F  1F  55  4E  1F  55  4D  1F  55  4C  1F  55  4B  1F  55  4A  1F  55  49  1F  55  48  1F  55  47  1F  55  46  1F  55  45  1F  55  44  1F  55  43  1F  55  42  1F  55  41  1F  55  40  1F  55  3F  1F  55  3E  1F  55  3D  1F  55  3C  1F  55  3B  1F  55  3A  1F  55  39  1F  55  38  1F  55  37  1F  55  36  1F  55  35  1F  55  34  1F  55  33  1F  55  32  1F  55  31  1F  55  30  1F  55  2F  1F  55  2E  1F  55  2D  1F  55  2C  1F  55  2B  1F  55  2A  1F  55  29  1F  55  28  1F  55  27  1F  55  26  1F  55  25  1F  55  24  1F  55  23  1F  55  22  1F  55  21  1F  55  20  1F  55  1F  1F  55  1E  1F  55  1D  1F  55  1C  1F  55  1B  1F  55  1A  1F  55  19  1F  55  18  1F  55  17  1F  55  16  1F  55  15  1F  55  14  1F  55  13  1F  55  12  1F  55  11  1F  55  10  1F  55  F  1F  55  E  1F  55  D  1F  55  C  1F  55  B  1F  55  A  1F  55  9  1F  55  8  1F  55  7  1F  55  6  1F  55  5  1F  55  4  1F  55  3  1F  55  2  1F  55  1  1F  55  0  1F  55  F5  1E  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  3F  55  AC  1E  55  7F  1E  55  7E  1E  55  7D  1E  55  7C  1E  55  7B  1E  55  7A  1E  55  79  1E  55  78  1E  55  77  1E  55  76  1E  55  75  1E  55  74  1E  55  73  1E  55  72  1E  55  71  1E  55  70  1E  55  6F  1E  55  6E  1E  55  6D  1E  55  6C  1E  55  6B  1E  55  6A  1E  55  69  1E  55  68  1E  55  67  1E  55  66  1E

解决方案 »

  1.   

    我没有发射程式呀!!你把它也给我吧!!还有,要等到明天才能答复你。我要去弄条数据线才能通讯。我的电邮是:[email protected]
      

  2.   

    给你介绍一个更好的串口控件:Sax ActiveX Comm Objects 8,去http://www.sax.net/support/softlib.aspx下载,注册码为:1280-2083563-90
      

  3.   

    是关于串口通信的吗,可以使用台湾四○四科技公司的产品啊,PCCOM,听好用的 尝试以下啊
      

  4.   

    To:chemmy (大笨熊) ,这个问题我最有发言权,因为我也是学单片机的,正好也在用单片机的RS232与PC机通讯,PC机的编程语言是VB。前天我还来向网友请教,但这儿的人好象没几个懂的,所以就只好自己干了。昨天我已经顺利地完成了用单片机控制PC机,实现按单片机键盘播放MP3的功能!!!
    以下是我的几点心得希望对大家有用:1。请确认你的单片机的晶振是多少?或者仿真器是多少?2。我从我的老师(单片机老手)哪里知道目前的仿真器多多少少在通讯方面有些不知原因的错误,故最好是通过烧芯片!!!3。不同的晶振,允许的波特率是不一样的。4。由于PC机与单片机的信号是不一样,请想办法处理。
      

  5.   

    如还有疑问请发言或EMAIL:[email protected]
      

  6.   

    可能的问题:1、你的buffer没有清空或者其他的变量存储问题2、i=i+1可能有问题,因为不是静态变量,我想退出on_comm事件后,再次进入时该值未必正确。
      

  7.   

    To:chemmy (大笨熊) ,你的信我看过了,对于你的问题我想问,你是用仿真器实验的吗?如果是的话,请试试烧录芯片!!!
    还有8MHZ的单片机可以在9600的波特率下工作吗?你最好查一下8MHZ的波特率使用范围!?
    对于很多数据波特率不能设得太高,而且一定要有一定的延时。此外,在VB中一定要清空BUFFER,即MSCOMM1.BUFFERCOUNT=0  ,而且数据要用二进制接收!!!
      

  8.   

    我没有仿真器,用烧录eprom的.
    单片机的延时已经考虑.每个数据的发送都加了足够延时
      

  9.   

    mscomm1.buffercount?没有这个属性啊.是不是inbuffercount?
      

  10.   

    sorry.是inbuffercount,在你接收一个数据后要清空BUFFER区,还有是否有必要添加MSComm1.InputMode = comInputModeBinary和MSComm1.RThreshold=1!
    另外请把你的单片机程序让我们看一下??
      

  11.   

    1、握手协议,用硬件握手方式 
    2、二进制方式接收
    redim bufferbyte(3)
    If CommandFlag = 0 Then
       Text1.Text = Text1.Text & vbCrLf + "写55完成"
    Else
       bufferbyte = MSComm1.Input
       ErroArray(i) = BufferByte(0)  '将接收到的数据保存到数组中
       i = i + 1                     '数组索引加一
       Text1.Text = Text1.Text + "  " + CStr(Hex(ErroArray(i - 1)))
    '   DoEvents    //如果接受速度快,应该去掉
    End If