vb串口通讯疑问mscomm

PERFECTLXY 2007-11-14 04:10:18
VB用mscomm中oncomm事件接受串口数据,如果字符串很长,波特率很低,oncomm经常会接收数据不全,循环几次就停下来了,波特率越高收的越多,为什么,我连续发两个字符串,每个都只收到前一部分,高手最好留个QQ号,好日后请教。
...全文
797 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
PERFECTLXY 2007-12-12
  • 打赏
  • 举报
回复
好吧,看来要好好再研究一下了,谢谢各位,结贴,发奖金!
zdingyun 2007-12-11
  • 打赏
  • 举报
回复
1)Command1_click 执行需 500MS有误,从新测试瞬间完成。
2)你说的没错输出缓冲区是默认512个字节。

Private Sub Command1_Click()
Dim sTemp As String
Dim yTemp() As Byte
Dim Hsum As Integer
sTemp = "给电子工程师的忠告!!![1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手![2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!"
sTemp = sTemp & "%%"
yTemp = StrConv(sTemp, vbFromUnicode)
Hsum = UBound(yTemp)
Text3 = Hsum
Text7 = Timer
MSComm1.Output = yTemp
Text5 = MSComm1.OutBufferCount '增一测试显示
End Sub

MSComm控件的属性OutBufferCount测试结果:
波特率 OutBufferCount值 接收字节
9600 160 328
4800 400 328
2400 535 328
1200 595 301
600 625 151
300 600 76
按MSDN解释:
OutBufferCount 属性
返回在传输缓冲区中等待的字符数。也可以用它来清除传输缓冲区。该属性在设计时无效。
我的理解是波特率变化,执行MSComm1.Output = yTemp时,波特率越低,滞留在传输缓冲区中等待的字符数越大,造成无法完整完成输送数据,造成数据字节丢失。编写程序代码,必须经调试无误才算通过,它是一种实验科学,很难说请原因

3)处理办法也好复杂啊
既然低波特率会出现丢失字节现象,那么只能靠合理代码控制发送节奏,以保证数据的完整及正确输送。
以上浅显见解供楼主参考。
zdingyun 2007-12-11
  • 打赏
  • 举报
回复
完善Command2_Click事件代码
Private Sub Command2_Click()
Dim Hsum As Integer
sTemp = sTemp & "%%"
yTemp = StrConv(sTemp, vbFromUnicode)
Hsum = UBound(yTemp)
Text2 = Hsum + 1
Ulen = 128
Llen = 0
Yu_sum = (Hsum + 1) Mod Ulen
for_Sum = (Hsum + 1) \ Ulen
Print "字节长= "; Hsum + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum
ReDim sj(Ulen - 1)
Text7 = Timer
Text7.Refresh
If (Hsum + 1) Mod Ulen = 0 Then
For i = 0 To Ulen - 1
sj(i) = yTemp(i + Ulen * j)
If i >= Ulen Then
Exit For
End If
Next i
MSComm1.Output = sj

ElseIf (Hsum + 1) Mod Ulen <> 0 Then
For j = 0 To for_Sum - 1
For i = 0 To Ulen - 1
sj(i) = yTemp(i + Ulen * j)
If i >= Ulen Then
Exit For
End If
Next i
MSComm1.Output = sj
Next j
ReDim sj(Yu_sum - 1)
For i = 0 To Yu_sum - 1
sj(i) = yTemp(i + Ulen * for_Sum)
Next
MSComm1.Output = sj
ElseIf (Hsum + 1) < Ulen Then
MSComm1.Output = yTemp
End If
End Sub
zdingyun 2007-12-11
  • 打赏
  • 举报
回复
修改前一答贴的Command2_Click事件代码:
Private Sub Command2_Click()
Dim Hsum As Integer
sTemp = sTemp & "%%"
yTemp = StrConv(sTemp, vbFromUnicode)
Hsum = UBound(yTemp)
Text2 = Hsum + 1
Ulen = 64
Llen = 0
Yu_sum = (Hsum + 1) Mod 64
for_Sum = (Hsum + 1) \ 64
Print "字节长= "; Hsum + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum
ReDim sj(Ulen - 1)
Text7 = Timer
Text7.Refresh
If (Hsum + 1) Mod Ulen = 0 Then
For i = 0 To Ulen - 1
sj(i) = yTemp(i + Ulen * j)
If i >= Ulen Then
Exit For
End If
Next i
MSComm1.Output = sj

ElseIf (Hsum + 1) Mod Ulen <> 0 Then
For j = 0 To for_Sum - 1
For i = 0 To Ulen - 1
sj(i) = yTemp(i + Ulen * j)
If i >= Ulen Then
Exit For
End If
Next i
MSComm1.Output = sj
Next j
ReDim sj(Yu_sum - 1)
For i = 0 To Yu_sum - 1
sj(i) = yTemp(i + Ulen * for_Sum)
Next
MSComm1.Output = sj
ElseIf (Hsum + 1) < Ulen Then
MSComm1.Output = yTemp
End If
End Sub

能适应任意字节长度代码
zdingyun 2007-12-11
  • 打赏
  • 举报
回复
字节长=<64或字节长为64的倍数情况未予以考虑算法,当字节长>64及64的倍数,下列代码适用波特率300 600 1200 2400 4800 9600等,代码调试通过。
Option Explicit
Dim data As Variant
Dim Temp1 As String
Dim m As Integer
Dim strData As String
Dim bytInput() As Byte
Dim sj() As Byte
Dim i As Integer
Dim j As Integer
Dim sTemp As String
Dim yTemp() As Byte
Dim Hsum As Integer
Dim Ulen As Long
Dim Llen As Long
Dim for_Sum As Long
Dim Yu_sum As Integer

Private Sub zhuanhuan()
Dim yTemp() As Byte
ReDim yTemp(Len(strData) \ 2)
For i = 1 To Len(strData) - 4 Step 2
yTemp((i - 1) \ 2) = Val("&H" & Mid(strData, i, 2))
Next
sTemp = StrConv(yTemp, vbUnicode)
Text1 = sTemp
End Sub

Private Sub Command2_Click()
'Dim sTemp As String
'Dim yTemp() As Byte
Dim Hsum As Integer
sTemp = sTemp & "%%"
yTemp = StrConv(sTemp, vbFromUnicode)
Hsum = UBound(yTemp)
Text2 = Hsum + 1
Ulen = 64
Llen = 0
Yu_sum = (Hsum + 1) Mod 64
for_Sum = (Hsum + 1) \ 64
Print "字节长= "; Hsum + 1; "循环次数= "; for_Sum; "余数= "; Yu_sum
ReDim sj(Ulen - 1)
Text7 = Timer
Text7.Refresh
For j = 0 To for_Sum - 1
For i = 0 To Ulen - 1
sj(i) = yTemp(i + Ulen * j)
If i >= Ulen Then
Exit For
End If
Next i
MSComm1.Output = sj
Next j
ReDim sj(Yu_sum - 1)
For i = 0 To Yu_sum - 1
sj(i) = yTemp(i + Ulen * for_Sum)
Next
MSComm1.Output = sj
End Sub

Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.InBufferSize = 2048
MSComm1.OutBufferSize = 1024
MSComm1.Settings = "300,n,8,1"
MSComm1.PortOpen = True
MSComm2.CommPort = 2
MSComm2.InBufferSize = 2048
MSComm2.OutBufferSize = 2048
MSComm2.Settings = "300,n,8,1"
MSComm2.RThreshold = 1
MSComm2.PortOpen = True
Text1 = ""
Text2 = ""
Text3 = ""
Text4 = ""
Text5 = ""
Text7 = ""
sTemp = "给电子工程师的忠告!!![1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手![2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!"
End Sub
Private Sub MsComm2_OnComm()
Dim intInputLen As Integer
Select Case Me.MSComm2.CommEvent
Case comEvReceive
'此处添加处理接收的代码
Me.MSComm2.InputMode = comInputModeBinary '二进制接收
intInputLen = Me.MSComm1.InBufferCount
ReDim bytInput(intInputLen)
bytInput = Me.MSComm2.Input
jieshou
If Right(strData, 4) = "2525" Then
Text3 = Timer
zhuanhuan
End If
End Select
End Sub

Public Function jieshou() '接收数据处理为16进制
Dim i As Integer
For i = 0 To UBound(bytInput)
If Len(Hex(bytInput(i))) = 1 Then
strData = strData & "0" & Hex(bytInput(i))
Else
strData = strData & Hex(bytInput(i))
End If
Next
Text1 = strData
Text4 = Len(strData) \ 2
End Function
嗷嗷叫的老马 2007-12-11
  • 打赏
  • 举报
回复
顶~~~~~~~

这才像论坛,呵呵~~~
PERFECTLXY 2007-12-10
  • 打赏
  • 举报
回复
从以上数据看,当波特率为300时,每秒只能串30字节,你的那串字符串,字节长654字节,需21.8秒,而Command1_Click只需500ms,以至造成输出缓冲区过载而丢失字节.

多谢楼上这么热情的解答,处理办法也好复杂啊,继续问
1.输出缓冲区是默认512个字节啊,过载?那至少也要收到512个啊,不会只有100+个啊,500ms就不再发送了吗
2.还有command1_click 500MS是什么意思,鼠标单击只能500ms有效吗,
zdingyun 2007-12-07
  • 打赏
  • 举报
回复
当波特率在2400及以上,用如下代码:
Option Explicit
Dim data As Variant
Dim Temp1 As String
Dim m As Integer
Dim strData As String
Dim bytInput() As Byte
Dim i As Long
Dim sTemp As String
Dim yTemp() As Byte
Dim Hsum As Integer

Private Sub Command1_Click()
Dim sTemp As String
Dim yTemp() As Byte
Dim Hsum As Integer
sTemp = "给电子工程师的忠告!!![1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手![2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!"
sTemp = sTemp & "%%"
yTemp = StrConv(sTemp, vbFromUnicode)
Hsum = UBound(yTemp)
Text3 = Hsum
Text7 = Timer
MSComm1.Output = yTemp
End Sub

Private Sub zhuanhuan()
Dim yTemp() As Byte
ReDim yTemp(Len(strData) \ 2)
For i = 1 To Len(strData) - 4 Step 2
yTemp((i - 1) \ 2) = Val("&H" & Mid(strData, i, 2))
Next
sTemp = StrConv(yTemp, vbUnicode)
Text1 = sTemp
End Sub

Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.InBufferSize = 2048
MSComm1.OutBufferSize = 1024
MSComm1.Settings = "2400,n,8,1"
MSComm1.PortOpen = True
MSComm2.CommPort = 2
MSComm2.InBufferSize = 2048
MSComm2.OutBufferSize = 2048
MSComm2.Settings = "2400,n,8,1"
MSComm2.RThreshold = 1
MSComm2.PortOpen = True
Text1 = ""
Text2 = ""
Text3 = ""
Text4 = ""
sTemp = "给电子工程师的忠告!!![1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手![2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!"
End Sub
Private Sub MsComm2_OnComm()
Dim intInputLen As Integer
Select Case Me.MSComm2.CommEvent
Case comEvReceive
'此处添加处理接收的代码
Me.MSComm2.InputMode = comInputModeBinary '二进制接收
intInputLen = Me.MSComm1.InBufferCount
ReDim bytInput(intInputLen)
bytInput = Me.MSComm2.Input
jieshou
If Right(strData, 4) = "2525" Then
Text2 = Timer
zhuanhuan
End If
End Select
End Sub

Public Function jieshou() '接收数据处理为16进制
Dim i As Integer
For i = 0 To UBound(bytInput)
If Len(Hex(bytInput(i))) = 1 Then
strData = strData & "0" & Hex(bytInput(i))
Else
strData = strData & Hex(bytInput(i))
End If
Next
Text1 = strData
Text4 = Len(strData) \ 2
End Function
zdingyun 2007-12-07
  • 打赏
  • 举报
回复
当波特率在1200及以下,用如下代码控制发送节奏:

Option Explicit
Dim data As Variant
Dim CloseTemp As String
Dim i As Integer
Dim bytInput() As Byte
Dim strData As String
Dim sTemp As String
Dim yTemp() As Byte
Dim CloseyTemp() As Byte
Dim Hsum As Integer

Private Sub zhuanhuan()
Dim yTemp() As Byte
ReDim yTemp(Len(strData) \ 2)
For i = 1 To Len(strData) - 4 Step 2
yTemp((i - 1) \ 2) = Val("&H" & Mid(strData, i, 2))
Next
sTemp = StrConv(yTemp, vbUnicode)
Text1 = sTemp
End Sub

Private Sub cmdSend_Click()
Label1 = Timer
sTemp = sTemp & "%%" '加结束标识
yTemp = StrConv(sTemp, vbFromUnicode)
Hsum = UBound(yTemp)
Text2 = Hsum
Timer1.Enabled = True
End Sub

Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.InBufferSize = 1024
MSComm1.OutBufferSize = 512
MSComm1.Settings = "300,n,8,1"
MSComm1.PortOpen = True
MSComm2.CommPort = 2
MSComm2.InBufferSize = 1024
MSComm2.OutBufferSize = 512
MSComm2.Settings = "300,n,8,1"
MSComm2.RThreshold = 1
MSComm2.InputMode = comInputModeBinary '二进制接收
MSComm2.PortOpen = True
Text1 = ""
Text2 = ""
Text3 = ""
sTemp = "给电子工程师的忠告!!![1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手![2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!"
Timer1.Interval = 1
End Sub
Private Sub MsComm2_OnComm()
Dim intInputLen As Integer
Select Case Me.MSComm2.CommEvent
Case comEvReceive
'处理接收的代码
intInputLen = Me.MSComm1.InBufferCount
ReDim bytInput(intInputLen)
bytInput = Me.MSComm2.Input
jieshou
If Right(strData, 4) = "2525" Then '判断结束标识
Label2 = Format(Timer - Val(Label1), "000.00")
zhuanhuan
End If
End Select
End Sub

Public Function jieshou() '接收数据处理为16进制
Dim i As Integer
For i = 0 To UBound(bytInput)
If Len(Hex(bytInput(i))) = 1 Then
strData = strData & "0" & Hex(bytInput(i))
Else
strData = strData & Hex(bytInput(i))
End If
Next
Text3 = Len(strData) \ 2
End Function

Private Sub Timer1_Timer() '控制发送节奏
Dim yTemp1(0) As Byte
yTemp1(0) = yTemp(i)
MSComm1.Output = yTemp1
i = i + 1
If i > Hsum Then
Timer1.Enabled = False
End If
End Sub
zdingyun 2007-12-06
  • 打赏
  • 举报
回复
试验结果:
波特率 收到字节数
300 154
600 308
1200 594
2400 654
4800 654
试验下列代码,仅需500ms:
Private Sub Command1_Click()
Text1 = Timer
Dim sTemp As String
Dim sTemp1 As String
Dim yTemp() As Byte
Dim Hsum As Integer
sTemp = "给电子工程师的忠告!!![1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手![2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!"
yTemp = StrConv(sTemp, vbFromUnicode)
ReDim yTemp1(UBound(yTemp))
Hsum = UBound(yTemp)
Text2 = Hsum
MSComm1.Output = yTemp
Text3 = Timer
End Sub

从以上数据看,当波特率为300时,每秒只能串30字节,你的那串字符串,字节长654字节,需21.8秒,而Command1_Click只需500ms,以至造成输出缓冲区过载而丢失字节.
PERFECTLXY 2007-12-04
  • 打赏
  • 举报
回复
楼上说明,我是用com1口2 3脚连接,发出去的马上就回来。
PERFECTLXY 2007-12-04
  • 打赏
  • 举报
回复
感谢大家这么热心关注它,我把源程序传上来,大家试试,改变波特率300/9600有什么区别
最简单的一个代码了,只用来测试用的

Private Sub Command1_Click()
Dim yTemp() As Byte
Dim stemp As String
stemp = "给电子工程师的忠告!!![1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手![2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!"
yTemp = StrConv(stemp, vbFromUnicode)
MSComm1.Output = yTemp
End Sub

Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeBinary
MSComm1.RThreshold = 1
MSComm1.PortOpen = True

End Sub

Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
Static m As Byte
Dim yTemp() As Byte
Dim stemp As String
m = m + 1
Label1.Caption = m
yTemp = MSComm1.Input
stemp = StrConv(yTemp, vbUnicode)
Text1.Text = Text1.Text & stemp
Case Else
Label1.Caption = "出错啦"
End Select
End Sub
jwh2004 2007-11-15
  • 打赏
  • 举报
回复
接上,若数据未接收完,则保存数据后不进行,下次接收到数据再进行判断。
jwh2004 2007-11-15
  • 打赏
  • 举报
回复
其实串口控件一次只接收到一个数据通讯包的一部分并没关系,你可以将每次接收到的数据添加保存到一个全局动态字节数组的末尾,然后从数组的头开始查找数据包的包头和包尾,若数据接收全则开始处理,若数据错误则清除。我的程序都用这种方法。至于是否用定时器,其实都可以,主要是算法和流程都正确就行。
of123 2007-11-15
  • 打赏
  • 举报
回复
通讯协议有问题。如果你的传输长度不确定,就应在数据前用固定长度(例如 4 字节)的域表示数据长度。你首先将 InputLen 属性设置为 4,读取长度域,然后循环检查 InBufferCount 属性,是否收到全部数据,再将InputLen 属性设置为 0,从 Input 取回所有数据。

你的方法之所以只能收到部分数据,是因为第一个字节到达后 OnComm 事件就触发了,你在这时就去读取,很可能传输还没有完成。

另,除非迫不得已,不要用 Timer 来读串口,而要用 OnComm 事件。那是一个不好的编程习惯,占用较多资源。而且,如果不进行数据接收完成的检查,用 Timer 也一样会丢数据。
叶帆 2007-11-14
  • 打赏
  • 举报
回复
不要用oncomm事件接受串口数据,在一定的超时时间内直接读取串口接收缓冲区里的数据。
这是在主从串口通信中,我常用的代码:

MSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.Output = bytSendArray '发送数据

Do
DoEvents
Loop Until MSComm1.OutBufferCount = 0 '等待,直到数据发送完毕

Do While True '数据接收
DoEvents

'接收数据
If MSComm1.InBufferCount > 0 Then
VarReceiveData = MSComm1.Input
ReDim bytReceiveArray(0) As Byte
bytReceiveArray = VarReceiveData
ReDim Preserve bytReceiveData(intReceiveNum + UBound(bytReceiveArray)) As Byte
For i = intReceiveNum To UBound(bytReceiveData)
bytReceiveData(i) = bytReceiveArray(i - intReceiveNum)
Next
End If

If intReceiveNum >= intGetDataLen Then Exit Do

'超时处理
If Abs(GetCurrentTime() - sngTime) > sngTimeSpace Then '超时
VarReceiveData = MSComm1.Input
RtuData = 1
dblTimer = GetCurrentTime() '上次操作结束时间
Exit Function
End If
Loop
zdingyun 2007-11-14
  • 打赏
  • 举报
回复
未见到你的代码很难提出意见.
http://topic.csdn.net/u/20071029/15/f2635fd1-7f77-4306-b7b9-76cf74e47ff8.html
参阅上述网址的讨论

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧