我的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
代码如下:
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
Private Sub MSComm1_OnComm()
这下面 看看我给你的代码是怎么写的Private Sub MSComm1_OnComm() '等侯串口信号进来的事件
If MSComm1.CommEvent = comEvReceive Then '接收缓冲区收到Rthreshold 个字符时触发
If MSComm1.InBufferCount <> 0 Then
串口的传输速度,远低于 PC 代码的运行速度。你将 .RThreshold 设置为 1,只要有一个字节传进来,OnComm 事件就被触发。如果发送端发送的长度大于 1,就有可能在你执行 Buffer = MSComm1.Input 时还没有完成传输。
还有在处理接收事件时,先把RThreshold = 1改为RThreshold = 0 等完成处理了再RThreshold = 1
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
在第二次接收的时候换行?
1.cmb666大哥的方法最完美,以前那个程序
2.谢谢of123,你说的是正确的,RThrshold只要更改就可以,但是每次输入不一样的长度时,每次都要更改.
3.谢谢你,Veron_04,你的代码还是不行,RThreshold=1放到Oncomm完成后,根本就无法产生接收事件.