回 帖 发 新 帖 刷新版面

主题:[讨论]请高手指点-VB实现串口通信的延迟问题

我现在做主机和多设备的通信,有个简单的关于串口通信的VB程序想向各位高手请教一下

       主机串口波特率4800,校验先置m,数据8位,停止1位。

过程是这样:
       主机先发出第9位为高位的地址信息给单片机,单片机如果收到自身设备地址,则复位SM2,返回此地址给主机,单片机发送数据的第9位TB8为0。
       但是现在主机端发完地址后,准备接收,立即置校验位为s空格校验Mscomm.Settings = "4800,s,8,1" 这一句居然执行了78ms,这直接导致单片机回传地址时,主机仍处于m标志校验状态,出现了“校验错误”事件!
      
       我想知道这78ms的执行时间,在VB中是不是不可能缩短了?我下面可控制着100台设备呀
       另外,我的文本输出怎么不能换行呢?

       简易程序清单如下:

Option Explicit
Dim temp(0) As Byte' temp放置传输数据
Dim Buffer(1) As Byte
Dim var As Variant
Dim dblStart As Double
Dim dblEnd As Double

Private Sub Command1_Click()'发送地址
   
On Error Resume Next

temp(0) = "&H" & Text2.Text             Text2.Text里输入十六进制地址
   

With MSComm1

.CommPort = 3

.OutBufferCount = 0'清发送缓冲区

.InBufferCount = 0'清除接收缓冲区

.RThreshold = 1'设置接收数据的长度

.InputLen = 1

.RTSEnable = True'置为接收状态

.InputMode = comInputModeBinary

.Settings = "4800,m,8,1"'奇偶校验位置1,发送地址信息

.PortOpen = True

.Output = temp'发送地址


dblStart = Timer'读取开始时间

.Settings = ",s,,"此句更改校验为S空格校验,执行时长78ms

dblEnd = Timer'读取结束时间

(.Output = temp) 当我加上这句用示波器观察时,两次数据相隔确实为78ms

End With

Debug.Print dblEnd - dblStart 
Text1.Text = "发送数据为: " & Text2.Text & vbCrLf

这句没有出错,可是为什么没有换行呢?


End Sub

' OnComm 事件控制. 错误信息处理
Private Static Sub MSComm1_OnComm()

Select Case MSComm1.CommEvent

     Case comEvReceive'接收到数据

            FeedBackFlag

     Case comBreak

     Case comFrame

    Case comRxParity

End Select
    
End Sub


Private Sub FeedBackFlag()
    

var = Null

Erase Buffer

var = MSComm1.Input

Buffer(0) = var(0)

Text1.Text = Text1.Text & "返回数据: "


Text1.Text = Text1.Text & Buffer(0) & vbCrLf
这个显示时为什么也不换行呢?
   
End Sub

回复列表 (共5个回复)

沙发

.PortOpen = True

.Output = temp'发送地址

.PortOpen = false
dblStart = Timer'读取开始时间

.Settings = ",s,,"此句更改校验为S空格校验,执行时长78ms

dblEnd = Timer'读取结束时间
.PortOpen = true
(.Output = temp) 当我加上这句用示波器观察时,两次数据相隔确实为78ms



text的多行属性打开没有

板凳

谢谢
为什么关闭了端口才能设置呢?原因出在哪里呢?能不能再细说一下?

我在单位的机子上调试是执行了78ms,可是在刚才,我的机子上,没有外围硬件设备,怎么再次执行,时间为○了?

那个文本多行,我给忘了,不好意思,呵呵!

3 楼

没有什么原因
就是要先关闭才能设置,微软搞的,我们照做就行了

还有就是不要在软件调试阶段就把On Error Resume Next加上,出问题都不知道,嘿嘿

一家之言,仅供参考

4 楼

我发现了新问题!
    原来我单位的机子上RS485端口是用USB转RS232的转接线转换来再接RS232-485转换头,这个转换线还要另加驱动才能用的,唯一的COM1我给51仿真器用了。
    我把RS232-485转换头直接插到COM1上,settings执行时间就为0了,不过问题又来了,
    前面的OUTPUT命令还没有来的及把数据发完,就被后面的settings给把校验位改掉了,导致发出错误数据。有没有能检测到串口是否发送完的状态参数呢?
    照你说的改了,settings执行时间为0了,不过在我单位机子上开关用了40ms左右,不知道什么原因!

5 楼

顶起,翻旧帖翻到这里。

目前正致力于学习VB的串口通信方面。。。

签名留个纪念。

另外,谁能回答楼上的问题

我来回复

您尚未登录,请登录后再回复。点此登录或注册