我的VB程序在发送和接收时会出现丢数据,这是为什么?请教高手!
代码如下:
Option Explicit
Dim i As IntegerPrivate Sub Check1_Click()
If Check1.Value = 1 Then
Timer1.Enabled = True
ElseIf Check1.Value = 0 Then
Timer1.Enabled = False
End If
End SubPrivate Sub ComOpen_Click()If (ComOpen.Caption = "打开串口") Then
  MSComm1.CommPort = Val(Combo1.Text)
  If MSComm1.PortOpen Then
  MSComm1.PortOpen = False
  End If
  With MSComm1
    .Settings = Combo2.Text + "," + Mid(Combo4.Text, 1, 1) + "," + Combo3.Text + "," + Combo5.Text
    .InputLen = 0
    .InBufferSize = 1024
    .RThreshold = 1
    .InputMode = comInputModeText
    .InBufferCount = 0
  End With
  MSComm1.PortOpen = True
  ComOpen.Caption = "关闭串口"
  Shape1.FillColor = &HFF&
Else
  MSComm1.PortOpen = False
  ComOpen.Caption = "打开串口"
  Shape1.FillColor = &H0&
End If
End SubPrivate Sub ComSend_Click()
MSComm1.Output = Chr(2) & Trim(Text2.Text) & Chr(3)
Shape3.FillColor = &HFF&
End SubPrivate Sub Form_Load()
For i = 1 To 16
Combo1.AddItem CStr(i)
Next i
Combo2.AddItem "300"
Combo2.AddItem "600"
Combo2.AddItem "1200"
Combo2.AddItem "2400"
Combo2.AddItem "4800"
Combo2.AddItem "9600"
Combo2.AddItem "19200"
Combo2.AddItem "38400"
Combo2.AddItem "57600"
Combo2.AddItem "115200"
Combo2.AddItem "230400"
Combo2.AddItem "460800"
Combo2.AddItem "921600"
Combo3.AddItem "5"
Combo3.AddItem "6"
Combo3.AddItem "7"
Combo3.AddItem "8"
Combo4.AddItem "None"
Combo4.AddItem "Odd"
Combo4.AddItem "Even"
Combo4.AddItem "Mark"
Combo4.AddItem "Space"
Combo5.AddItem "1"
Combo5.AddItem "2"
End SubPrivate Sub MSComm1_OnComm()
Dim Buffer As String
Buffer = MSComm1.Input
If Len(Buffer) = 0 Then
Text3.Text = "空"
Else
Text3.Text = Buffer
End If
End SubPrivate Sub Timer1_Timer()
MSComm1.Output = Chr(2) & Trim(Text2.Text) & Chr(3)
Shape3.FillColor = &HFF&
End Sub

解决方案 »

  1.   

    .InBufferSize = 1 '设置缓冲区接收数据为1字节
    Private Sub MSComm1_OnComm()
    这下面 看看我给你的代码是怎么写的Private Sub MSComm1_OnComm() '等侯串口信号进来的事件
       If MSComm1.CommEvent = comEvReceive Then  '接收缓冲区收到Rthreshold 个字符时触发
          If MSComm1.InBufferCount <> 0 Then
      

  2.   


    串口的传输速度,远低于 PC 代码的运行速度。你将 .RThreshold 设置为 1,只要有一个字节传进来,OnComm 事件就被触发。如果发送端发送的长度大于 1,就有可能在你执行 Buffer = MSComm1.Input 时还没有完成传输。
      

  3.   

    强烈建议把inputLen设置为:1
    还有在处理接收事件时,先把RThreshold = 1改为RThreshold = 0 等完成处理了再RThreshold = 1
      

  4.   

    这是事实,但是不能通过更改RThreshold的值来解决,每次输入的长度都是不同的.
      

  5.   

    那我的RThreshold应该放在哪呢?
      

  6.   

    你先告诉我一个重点 到底有没有终止符?第二点你用我发给你的 sscom32测试软件 HEX显示把它打勾 将所有结收数据截个图上来
      

  7.   

    Private Sub MSComm1_OnComm()
    Dim Buffer As String
    if MSComm1.CommEvent=2 then
        MSCOmm1.RThreshold=0
        Buffer = MSComm1.Input
        If Len(Buffer) = 0 Then
            Text3.Text = "空"
        Else
            Text3.Text = Buffer
        End If
        MSCOmm1.RThreshold=1
    end if
    End Sub
      

  8.   

    有终止符,现在可以了,我把RThresold的值改了,另外我在接受区用Textbox,怎样让其
    在第二次接收的时候换行?
      

  9.   

    谢谢大家了,我想尝试多种方法!
    1.cmb666大哥的方法最完美,以前那个程序
    2.谢谢of123,你说的是正确的,RThrshold只要更改就可以,但是每次输入不一样的长度时,每次都要更改.
    3.谢谢你,Veron_04,你的代码还是不行,RThreshold=1放到Oncomm完成后,根本就无法产生接收事件.
      

  10.   

    第一条信息 & vbcrlf
      

  11.   

    你的TextBox该不会没设置MultiLine = True 吧?