MSComm控件的缓冲区问题

liuyingli2002 2004-09-19 08:14:03
我用MSComm控件做通信问题。现在我循环往输出缓冲区发命令,应该发一条命令就会有相应的处理事件从输入缓冲区中返回,但是由于我是用For循环发命令,第一条刚发完,即MSComm1.Output = putbyte,没等这个命令触发OnComm事件呢,就进入了循环的下一条命令,即next i 。以至于输入缓冲区里的返回事件都乱了套,我怎么样处理呢?
...全文
313 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovebeethoven 2004-09-22
  • 打赏
  • 举报
回复
'这是延迟程序
Private Sub delay(ii As Integer) '时间延迟,以毫秒为单位
Dim strtemp() As Byte
Dim tt As Long
tt = GetTickCount()
Do
DoEvents
If mscomm1.inbuffercount>0 Then
strtemp = MSComm1.Input '
RefreshDisplay strtemp  '显示接收事件
End If
'我觉得问题出在这里,这个循环是很快的,一开始串口没有数据接收到,STRTEMP就总是被赋空值
Loop Until GetTickCount - tt > ii
End Sub
你是在延时的10毫秒内接收,我觉得这样不大好,(只是感觉,如果用起来没问题就OK了)

指导谈不上,大家讨论嘛
liuyingli2002 2004-09-22
  • 打赏
  • 举报
回复
'这是发送指令的程序

Private Sub CmdSub_Click()
If MSComm1.PortOpen = False Then
MsgBox ("未打开串口")
Exit Sub
End If
port = SubBlue.MSComm1.CommPort '记录从设备所用的串口号

'从设备初始化Reset和Write_Scan_Enable指令
Dim strt As String
Dim i As Integer, putlen As Integer
'开发包的初始化
tran_buffer(0) = "01 03 0c 00"
tran_buffer(1) = "01 05 10 00"
tran_buffer(2) = "01 05 0C 01 00"
tran_buffer(3) = "01 1A 0C 01 03"
tran_buffer(4) = "01 20 0C 01 00"
tran_buffer(5) = "01 26 0c 02 60 00"
tran_buffer(6) = "01 05 0C 03 02 00 02"
tran_buffer(7) = "01 16 0C 02 00 20"
tran_buffer(8) = "01 18 0C 02 00 30"
tran_buffer(9) = "01 07 FC 01 03"
tran_buffer(10) = "01 09 10 00"
Dim strtemp() As Byte
Dim j As Integer, a As Integer
For j = 0 To 10
strt = Trim(tran_buffer(j))
putlen = Len(strt)
Call cancelblank(strt, putlen)
Call char2hex(strt, putbyte()) '转化为十六进制数
SubBlue.MSComm1.Output = putbyte
delay (10) '延迟
Next j
CmdSub.Enabled = False
CmdMain.Enabled = True
End Sub


'这是延迟程序
Private Sub delay(ii As Integer) '时间延迟,以毫秒为单位
Dim strtemp() As Byte
Dim tt As Long
tt = GetTickCount()
Do
DoEvents
strtemp = MSComm1.Input
RefreshDisplay strtemp  '显示接收事件
Loop Until GetTickCount - tt > ii
End Sub


'这是那个显示程序RefreshDisplay
Private Sub RefreshDisplay(buf() As Byte)
Dim i As Integer
Dim hex_str As String
For i = LBound(buf) To UBound(buf)
If (buf(i) >= 10 And buf(i) <= 15) Then
hex_str = "0" + Format(Hex(buf(i)), "0")
Else
hex_str = Format(Hex(buf(i)), "00")
End If
initial_text.Text = initial_text.Text + hex_str + " " + Chr(13)

Next i
If i = 8 Then
initial_text.Text = initial_text.Text + " " + Chr(13) + Chr(10)
Else
initial_text.Text = initial_text.Text + Chr(13) + Chr(10)
End If

End Sub



感谢小佛的耐心指导
lovebeethoven 2004-09-22
  • 打赏
  • 举报
回复
贴代码出来看看吧,你是怎么在文本框中显示的
空出几百行。。。晕,夸张了吧
lovebeethoven 2004-09-22
  • 打赏
  • 举报
回复
子者墨也 2004-09-22
  • 打赏
  • 举报
回复
最好是在On_comm中处理,for循环不建议使用
liuyingli2002 2004-09-22
  • 打赏
  • 举报
回复
谢谢你,小佛,问题基本上解决了。以后还要继续讨论呀
lovebeethoven 2004-09-21
  • 打赏
  • 举报
回复
不大明白你说的空好大的空什么意思 :( ,你是返回数据时显示??
你可以试试把发送后的延时去掉,接收时,延时可以缩短,因为你波特率比较高,如果接受数据不大的话,延时50毫秒即可
liuyingli2002 2004-09-21
  • 打赏
  • 举报
回复
没有返回怎么看接收到的事件呀?从缓冲区接收到数据后,显示在文本框中呀。空了好大一段指的是空间上。一执行程序,接收文本框就马上出一垂直滚动条,然后就发现在接收到第一条数据前,文本框在空间上会空出几百行。而且接下来再接收其它数据时也是每条之间都会空上几行的。
这到底是什么原因呢
liuyingli2002 2004-09-21
  • 打赏
  • 举报
回复
小佛,你的那个只用延时,不用标志的程序是可以实现的,就是接收显示的结果是每个接收结果会空好大的空,而且第一条接收结果前会空更大的空而已。
liuyingli2002 2004-09-21
  • 打赏
  • 举报
回复
我用了57600的波特率
lovebeethoven 2004-09-21
  • 打赏
  • 举报
回复
如果没有返回,不能不显示吗?
空了好大一段是指空间上?时间上?你用什么来显示返回的数据?
liuyingli2002 2004-09-21
  • 打赏
  • 举报
回复
发送时我只延时了10毫秒,接收时也没用延时呀
liuyingli2002 2004-09-21
  • 打赏
  • 举报
回复
是返回数据时显示,空了好大一块后才接收第一条,然后再空才能接收第二条,一直到最后一条全是这样的
Wenking003 2004-09-20
  • 打赏
  • 举报
回复
你在循环处理中,确实应该在发完数据后,接着去侦听串口,等接收到数据处理完了,再进行下一轮的发送数据。
侦听时就用楼上提到的DOEVENTS,给机器一个时间去处理事务。
tztz520 2004-09-20
  • 打赏
  • 举报
回复
不可将命令放在OnComm事件中发,因为你的信息是发一个数据才收的,如果收不到就不能发了.延迟一下应该可以收到.
liuyingli2002 2004-09-20
  • 打赏
  • 举报
回复
你说发送数据也放在OnComm事件中?
liuyingli2002 2004-09-20
  • 打赏
  • 举报
回复
你是说用轮询的方法来接收事件,不用触发事件的方法啦
123BMW666 2004-09-20
  • 打赏
  • 举报
回复
将命令放在OnComm事件中发 不就行了
tztz520 2004-09-20
  • 打赏
  • 举报
回复
Private Sub Command1_Click()
Dim i As Integer
For i = 1 To 5
MSComm1.Output = "a"
Delay 2'延迟两秒
Next i
End Sub

Public Sub Delay(PauseTime As Long)'这是一个延迟函数
Dim Start As Single
Start = Timer
Do While Timer < Start + PauseTime
DoEvents
Loop
End Sub
liuyingli2002 2004-09-20
  • 打赏
  • 举报
回复
我延时了,可是延时并没有用呀,关键是这个控件不能立即触发事件,这样的话,没等触发就进入下一条语句了。
希望做过这方面的人赶快的帮我一下呀,我真的是十分的急切!
谢谢各位了
加载更多回复(11)

1,451

社区成员

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

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