当前位置:编程学习 > VB >>

MSComm1控件写对读的干扰

--------------------编程问答-------------------- timmer问题 造成的 这种写 死循环 都比用 timmer好 --------------------编程问答-------------------- 没做过这种应用,不知楼上说的循环中是否适合插些DoEvents让界面有点响应呢? --------------------编程问答-------------------- 硬件通讯和时序有关,不要把整个通讯过程太理想的认为会在你的设定的时间内完成,因为PC的串口通讯不是理论上的多少字节数据在多少波特率用多少时间完成的,而是根据系统当前的资源、任务、CPU使用情况而动态变化的,用定时器是不能确定这种过程的完成时间的。
我曾经就遇到过一条20个字节的串口数据,在PC机任务比较繁忙的时候,发了10秒才真正的发完到下位机。收数据也是如此,需要等系统不那么繁忙了才能收到数据,这种通讯用时间完全是根据系统运行情况而定的。
所以你的通讯过程需要发送数据后相应的数据返回后确认过程完成,然后再执行下一个任务命令。这样的循序才对,否则很有可能你连续发了好几个命令,最终因为系统繁忙而累加到发送缓冲区,当系统有空的时候,一次性连续吧你的这些命令在无时间间隔的情况下一次性发送到下位机,这种时候下位机会不会出问题就很难保证了。 --------------------编程问答-------------------- 用一个所谓“状态机”的概念控制一下你的通讯流程。

例如,用一个公共变量(标志)表示“写”命令忙的状态。在写操作代码中,开始处设置标志,结束处清除标志。

在你的定时器事件代码中,检查这个标志。如果你的定时器周期很短,在忙标志时可以直接退出事件;反之,可以在事件代码中等待标志被清除(需要 DoEvents)。
--------------------编程问答-------------------- 就我编写工控上位机程序的一点经验而言,读没有完成的时候是不能再发写命令的。所以,如何判断读是否完成就成为关键,就如楼上所言,你可以设置一个变量,用于标记目前是度还是写,大致格式如下:

Option Explicit
Dim intPLCComm As Integer   '读PLC的状态字,
Private Sub Form_Load()
    tmrComm.Interval = 2000
    With mscP
        .CommPort = 1
        .Settings = "9600,n,8,1"
        .InputLen = 0
        .RThreshold = 0
        .PortOpen = True
    End With
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    mscP.PortOpen = False
End Sub

Private Sub tmrComm_Timer()
    Dim strComm As String
    Dim strResult As String
    Select Case intPLCComm
        Case 0
            '读PLC命令一
            strComm = "命令一字符串"
            mscP.Output = strComm
            Do
                strResult = strResult & mscP.Input
            Loop Until mscP.InBufferCount <= 0
        Case 1
            '读PLC命令二
            strComm = "命令二字符串"
            mscP.Output = strComm
            Do
                strResult = strResult & mscP.Input
            Loop Until mscP.InBufferCount <= 0
        Case 2
            '读PLC命令三
            strComm = "命令三字符串"
            mscP.Output = strComm
            Do
                strResult = strResult & mscP.Input
            Loop Until mscP.InBufferCount <= 0
        Case 3
            '写PLC命令一
            strComm = "写命令字符串"
            mscP.Output = strComm
            Do
                strResult = strResult & mscP.Input
            Loop Until mscP.InBufferCount <= 0
    End Select
    intPLCComm = (intPLCComm + 1) Mod 4
End Sub

--------------------编程问答-------------------- http://bbs.csdn.net/topics/390200153

我问过相同的问题了,请看,这里有我自己的例子,死循环到读取为止或超时为止

也有高手的例子,加标志位,判断当前是读还是写
补充:VB ,  基础类
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,