最近写一个上位机,发送16进制指令给下位机然后接收显示!用rsr232通信很稳定,但用到USB转一下数据干扰极大,接回来的数据前面产生2-4的干扰数据,并且打开串口时就会产生一个错误comevcts,请熟悉这方面的高手帮忙解决一下,感激不尽!

解决方案 »

  1.   

    硬件或驱动问题,USB转接头常遇到的问题,如无意外,你用的USB转换头肯定是那种15左右的。建议你更换好一些的。
      

  2.   


    U 转串所用的芯片有多种,线也良莠不齐。我用过最好的是 FT232 芯片的,稳定。
      

  3.   


    我的程序也一样,用串口时程序稳定,接收数据正常,由于笔记本没有串口,所以用usb转串口,驱动我也安装上去了,可程序就是接收不了数据,程序也没任何报错,不知道为什么,是不是转后程序的通讯方式得改变啊?求解答,谢谢!
      

  4.   

    完全不必改变。不过,你可能要根据情况改变串口号。看一下 U 转串映射的虚拟串口号。如果是 FT232 芯片,则可以在操作系统下直接改虚拟串口的串口号,如果与 PC 上固有串口不冲突的话。
      

  5.   


    我已经在设备管理器里面更改串口号了,并无冲突,对了,usb转串口后程序虽没报错,但PLC其他设备报错,不能正常运行,用串口时程序和设备一切正常,我猜测是usb转串口后不能正常通讯,设备缓存满了,所以PLC设备运行到一半时就报错了。不知道为什么。'*************************************************
    '初始化MSCOMM控件
    '*************************************************
    Private Function uflInitRS()
        On Error GoTo ErrorTrap:    
        If Not comLaser.PortOpen Then
            comLaser.CDTimeout = 0
            comLaser.CTSTimeout = 0    
            comLaser.DSRTimeout = 0   
            comLaser.RTSEnable = True 
            comLaser.DTREnable = True  
            comLaser.CommPort = 1
            comLaser.Settings = "9600,N,8,1"
            comLaser.InputLen = 0
            comLaser.PortOpen = True
        End If
        uflInitRS = 0
        Exit Function
    ErrorTrap:
        uflInitRS = Err
    End Function'*************************************************
    '关闭MSCOMM
    '*************************************************
    Private Function uflQuitRS()    If comLaser.PortOpen Then
            comLaser.PortOpen = False
        End If
        End
    End Function'*************************************************
    '程序运行时MSCOMM读取数据
    '*************************************************
    Private Sub Ceshi()Dim bufInput As String
    Dim RecData As StringDo
        If comLaser.InBufferCount > 0 Then
            RecData = ""
            comLaser.InputLen = 1   '确定input属性读取的字符数为1位
            Do
                If comLaser.InBufferCount >= 0 Then '如果接收缓冲区中存在数据大于或等于零
                   bufInput = comLaser.Input   
                   
                   Select Case bufInput
                          Case Chr(10)  '换行
                               Exit Do
                          Case Chr(13)  '回车
                               uCnt = uCnt + 1
                               Exit Do
                          Case Else
                               RecData = RecData & bufInput
                   End Select
                Else
                    RecData = ""
                    Exit Do
                End If
            Loop        Call Sleep(100)        '--- 数据格式
            '--- P0:********19.7895**P5:*********0.0328**  字符串长度40,CR数:1
            
            If Format(Val(Mid(RecData, 4)), "0.0000") <= 0 Or Format(Val(Mid(RecData, 24)), "0.0000") <= 0 Then
                GoTo AA:
            End If
            
            If uCnt = 1 Then
                Call uflRegClear     '清除 Inpt(uCnt).Gaik和Inpt(uCnt).Fure数据
                lstResult(0).AddItem "Point  OD        Offset"       ‘ lstResult(0)是ListBox控件
                lstResult(0).AddItem Right(Format(uCnt, "  #:"), 3) & "    " & Format(Val(Mid(RecData, 4)), "0.0000") & "   " & Format(Val(Mid(RecData, 24)), "0.0000")
            Else
                lstResult(0).AddItem Right(Format(uCnt, "  #:"), 3) & "    " & Format(Val(Mid(RecData, 4)), "0.0000") & "   " & Format(Val(Mid(RecData, 24)), "0.0000")
            End If
            
            Inpt(uCnt).Gaik = Format(Val(Mid(RecData, 4)), "0.0000")   '外径值
            Inpt(uCnt).Fure = Format(Val(Mid(RecData, 24)), "0.0000")  '偏心值
            
            If Val(lblPoint.Text) = uCnt Then     '求已测试的点数uCnt是否与指标相等 (lblPoint控件用于存取某品番需测试的点数)
                Num = Num + 1  '求已测试的制品根数
                lblResCn(0).Caption = Num
                Call uflWriteLot
                uCnt = 0
            End If
            
        End If
    AA:
        DoEvents
        LoopEnd Sub