VB编写MSCOMM比较麻烦
主要是UNICODE的问题
在VB中字是按照字元来表示的
一个汉字和一个字母都是一个字元
所以如果与控制符或ASC码大于128的字符混合发送的时候必须转换一下
sendstring=strconv(sendstring,vbfromunicode)
或者使用字符串函数的B版本
另外接收端肯定要有延时
否则字符还没有到达接收缓冲区
延时时间视情况而定

解决方案 »

  1.   

    oh,看到你的原题了。
    如果你能更改下层硬件通信协议的话,可以在发送之前加多一个成功响应标志,程序检验到这个字符,即可开始接收了。没有的话,自己以第一个信号为标志吧,得有些处理。注意监测程序是一个延时的循环,(能超时退出)我的程序中有类似的语句,你可以看看。但那是读串口的,监测的程序你自己编吧。这是我的读写串口函数。我使用了MSCOMM控件。dim inarr as byte()Sub ReadMSComm(MsComm1or2, nNum As Integer)
        Dim lcount
        ReDim InArr(nNum - 1)
        
        CommErr = False
        ' wait data return to comm port
        lcount = 1
        Do
            DoEvents
            lcount = lcount + 1
        Loop Until MsComm1or2.InBufferCount >= nNum Or lcount > 5000
        If lcount > 5000 Then
            MsgBox "通讯出错, 复位并重新再试!", , "故障"
            CommErr = True
            Exit Sub
        End If
        
        'save bin data to buff
        inbuf = MsComm1or2.Input
        
        'trans data to system array
        InArr = inbuf
    End SubSub WriteMSComm(MsComm1or2 As MSComm, byAscii As Byte)
        
        Dim OutByArr(0) As Byte, OutBuf As Variant
        
        OutByArr(0) = byAscii
        OutBuf = OutByArr
        MsComm1or2.Output = OutBuf
    End Sub
      

  2.   

    http://www.csdn.net/expert/TopicView.asp?id=6207
      

  3.   

    我用下面的方法还没出现问题,你不防试试:
    '初始化
    If MSComm1.PortOpen = False Then
        MSComm1.CommPort = "2400,n,8,1"
        MSComm1.Settings = 1
        '以上参数由自己定义
        MSComm1.InputLen = 1
        MSComm1.RThreshold = 1 '设置/返回当接收到多少个字符时发生接收事件,为0时不发生接收事件
        MSComm1.SThreshold = 1 '同上,用于发送事件
        MSComm1.PortOpen = True
        MSComm1.InputMode = comInputModeBinary
    End If
    '下面外部变量必须这样定义,否则不能正确接收
    Dim InString As Variant '接收变量
    Dim OutString() As Byte '发送变量'在MSComm1的OnComm事件中加入以下代码
    Select Case MSComm1.CommEvent
        Case comEvReceive '接收事件
            '接收缓冲区收到Rthreshold个字符时触发
            If MSComm1.InBufferCount Then
                InString = MSComm1.Input
                For I = LBound(InString) To UBound(InString)
                    If Check1.Value <> 1 Then
                         '用Text1控件来显示接收的数据
                         Text1.Text = Text1.Text & CStr(Hex(Val(InString(I)))) & " "
                    End If
                Next I
                InString = ""
            End If
        Case comEvSend '发送事件
            For I = LBound(OutString) To UBound(OutString)
                '用Text2控件来显示接收的数据            
                Text2.Text = Text2.Text & CStr(Hex(Val(OutString(I)))) & " "
            Next
    End Select
      

  4.   

    Sorry!不用“If Check1.Value <> 1 Then”这句