VB能够读串口?!你是怎么做的?别告诉我是用XX.dll!

解决方案 »

  1.   

    串口设置有问题。
    干脆用二进制形式取怎么样。
    另外,帮忙推一把:
    http://www.csdn.net/expert/topic/640/640646.xml?temp=.4522974
      

  2.   

    可以用其中的控件阿,也可以做控制软件哦,我现在就是这样做的MSCOMM控件不错哦,vc中也可以用的。
      

  3.   

    InputMode 属性
          设置或返回 Input 属性取回的数据的类型。语法object.InputMode [ = value ]InputMode 属性语法包括下列部分:部分 描述 
    object 对象表达式,其值是“应用于”列表中的对象。 
    value 值或常数,确定输入模式,如“设置值”中所描述。 
    设置值value 的设置值是:常数 值 描述 
    comInputModeText 0 (缺省)数据通过 Input 属性以文本形式取回。 
    comInputModeBinary 1 数据通过 Input 属性以二进制形式取回。 
    说明InputMode 属性确定 Input 属性如何取回数据。数据取回的格式或是字符串或是一数据组的二进制数据的数组。若数据只用 ANSI 字符集,则用 comInputModeText。对其它字符数据,如数据中有嵌入控制字符、Nulls 等等,则使用 comInputModeBinary。
    InputMode 属性示例
    这个例子从通讯端口读取 10 个字节的二进制数据,并把它赋给一个字节数组。Private Sub Command1_Click()
    Dim Buffer as Variant
    Dim Arr() as Byte'设定并打开端口
    MSComm1.CommPort = 1
    MSComm1.PortOpen = True'设定 InputMode 读取二进制数据
    MSComm1.InputMode = comInputModeBinary'等待直到输入缓冲区有 10 个字节
    Do Until MSComm1.InBufferCount < 10
        DoEvents
    Loop'往缓冲区存二进制数据
    Buffer = MSComm1.Input'赋值于字节数组以便处理
    Arr = BufferEnd Sub
      

  4.   

    我两个两个字节地去读,会不会好一点.
    我是用mscomm.input=0,就是一次全部读完。
      

  5.   

    是不是Unicode和Ascii的转换问题呢?
      

  6.   

    Handshaking 属性
          设置并返回硬件握手协议。语法object.Handshaking [ = value ]Handshaking 属性的语法包括下列部分:部分 描述 
    object 对象表达式,其值是“应用于”列表中的对象。 
    value 整型表达式,说明握手约定,如“设置值”中所描述。 
    设置值value 设置值是:设置值 值 描述 
    comNone 0 (缺省)没有握手。 
    comXOnXOff 1 (XON/XOFF) 握手。 
    comRTS 2 RTS/CTS (Request To Send/Clear To Send) 握手。 
    comRTSXOnXOff 3 Request To Send 和 XON/XOFF 握手皆可。 
    说明Handshaking 是指内部通讯协议,通过该协议,数据从硬件端口传输到接收缓冲区。当一个数据字符到达串行端口,通讯设备就把它移到接收缓冲区以使程序可以读它。如果没有接受缓冲区,程序需要直接从硬件读取每一个字符,这很可能会造成数据丢失,因为字符到达的速度可以非常快。握手协议保证在缓冲区过载时数据不会丢失,缓冲区过载为数据到达端口太快而使通讯设备来不及将它移到接收缓冲区。数据类型Integer
      

  7.   

    把inputlen设小之后,乱码现象少了,但是在连续读的时候就经常发生
    "读comm设备错误",这又是怎么回事呢??
      

  8.   

    是不是在接收缓冲区中有数据溢出
    建议将接收缓冲区设大或将速率减小!Settings 示例
    下面的例子设置控件端口通讯,波特率 9600,无奇偶校验检查,8 个数据位,1 个停止位:MSComm1.Settings = "9600,N,8,1"InBufferSize 属性
          设置并返回接收缓冲区的字节数。语法object.InBufferSize[ = value ]InBufferSize 属性语法包括下列部分:部分 描述 
    object 对象表达式,其值是“应用于”列表中的对象。 
    value 整型表达式,说明接收缓冲区的字节数。 
    说明InBufferSize 是指整个接收缓冲区的大小。缺省值是 1024 字节。不要将该属性与 InBufferCount 属性混淆,InBufferCount 属性返回的是当前在接收缓冲区中等待的字符数。注意   接收缓冲区越大则应用程序可用内存越小。但若接受缓冲区太小,若不使用握手协议, 就可能有溢出的危险。一般的规律是,首先设置一个 1024 字节的缓冲区。如果出现溢出错误,则通过增加缓冲区的大小来控制应用程序的传输速率数据类型Integer
      

  9.   

    InputLen 属性的缺省值是 0。设置 InputLen 为 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。若接收缓冲区中 InputLen 字符无效,Input 属性返回一个零长度字符串 ("")。在使用 Input 前,用户可以选择检查 InBufferCount 属性来确定缓冲区中是否已有需要数目的字符。该属性在从输出格式为定长数据的机器读取数据时非常有用。数据类型
      

  10.   

    InBufferCount 属性
          返回接收缓冲区中等待的字符数。该属性在设计时无效。语法object.InBufferCount[ = value ]InBufferCount 属性的语法包括下列部分:部分 描述 
    object 对象表达式,其值是“应用于”列表中的对象。 
    value 整型表达式,说明在接收缓冲区中等待的字符数。 
    说明InBufferCount 是指调制解调器已接收,并在接收缓冲区等待被取走的字符数。可以把 InBufferCount 属性设置为 0 来清除接收缓冲区。注意   不要把该属性与 InBufferSize 属性混淆。InBufferSize 属性返回整个接收缓冲区的大小。数据类型Integer
      

  11.   

    当接受字符大于&h80 用文本方式是不能正常显示的
    用二进制可以
      

  12.   

    我支持关于适当设置buffer大小同时用二进制接收的意见。如用的是Communication Functions 中API函数的话,建议在读写时都要检查返回值,因为不一定每次都能将你要求长度的读取完(尤其是在悬挂方式下)。
      

  13.   

    Public Sub ComOpen()'初始化部分
        On Error GoTo Skip
        With FrmInterFace.MSC
            If .PortOpen = True Then .PortOpen = False
            .CommPort = CommNumber'设置使用的段口号
            .InBufferSize = 1024'设置缓冲区
            .OutBufferSize = 1024
            .InputMode = comInputModeBinary
            .InputLen = 1
            If .PortOpen = False Then .PortOpen = True
        End With
        Exit Sub
    Skip:
      SetOnTop FrmChuShiHua.hwnd, False
        MsgBox "端口设置错误", vbCritical, "错误"
    End Sub
    '波特率在控件里直接设的Private Sub TimJieShou_Timer()'定时器定时查询接收
    Dim Temp
    Static Msg(1024) As Byte
    Static MsgLen As Integer
    Dim tMsg() As ByteDim I, Test As Integer
    Dim J As Integer
    Static MsgStr As String
    Dim IntTimeOut
    TimJieShou.Enabled = False    With MSC
        If .InBufferCount = 0 Then GoTo Skip        TimLinkOk.Enabled = False
            TimLinkOk.Interval = 0
            FrmMain.LabStatus.BackColor = vbGreen
            FrmMain.LabStatus.Caption = "连接正常"
            Do While .InBufferCount <> 0
                Temp = .Input
                On Error GoTo Skip
                Select Case Temp(0)
                Case 255
                    Erase Msg
                    MsgLen = 0
                    MsgStr = ""
    '                Msg(MsgLen) = Temp(0)
    '                MsgLen = MsgLen + 1
                Case 254
    '                Msg(MsgLen) = Temp(0)
    '                MsgLen = MsgLen + 1
                    If MsgLen > 1 Then
                        ReDim tMsg(MsgLen - 1) As Byte
                        For J = 0 To MsgLen - 1
                            tMsg(J) = Msg(J)
                        Next J
                        MsgHandle tMsg  '调用消息处理函数
                    End If
                    
                    MsgLen = 0
                    Erase Msg
                    
                    With Form1.List1
                      .AddItem "<--- " & MsgStr, 0
                      If .ListCount > 100 Then .RemoveItem 100
                    End With
                    
                    MsgStr = ""
                Case Else
                    Msg(MsgLen) = Temp(0)
                    If Msg(MsgLen) <= 15 Then MsgStr = MsgStr & "0"
                    MsgStr = MsgStr & Hex(Msg(MsgLen)) & " "
                    MsgLen = MsgLen + 1
                End Select
            Loop
        End With
    '    NetInit
    Skip:
        TimJieShou.Enabled = True
        If FrmMain.LabStatus.Caption = "连接中断" Then Exit Sub
        TimLinkOk.Enabled = True
        TimLinkOk.Interval = 2000
    End Sub
    '这个是我用串口的一段代码,希望对你有帮助,我刚开始做的时候,波特率美设对,就都是乱码
      

  14.   

    Handshaking 是指内部通讯协议,通过该协议,数据从硬件端口传输到接收缓冲区。当一个数据字符到达串行端口,通讯设备就把它移到接收缓冲区以使程序可以读它。如果没有接受缓冲区,程序需要直接从硬件读取每一个字符,这很可能会造成数据丢失,因为字符到达的速度可以非常快
      

  15.   

    to water_j:
    谢谢你的建议,但是我已经把接收缓冲区设得足够大了,而且handshaking各种值
    我也试过但是情况也没太大变化,其实handshaking值只能试0或1,别的值根本
    不通.还有我改用二进制读看来乱码的错误解决了,但是会出现数据丢失.
      

  16.   

    要注意mscomm控件的oncomm()事件时有很多种情况触发的
    应判断
    if me.MSComm1.CommEvent=2 then
    详细请参照CommEvent定义
      

  17.   

    楼上说的对!
    OnComm 事件示例
    下例说明如何处理通讯错误和事件。可以在相关的 Case 语句之后插入代码来处理特定的错误或事件。Private Sub MSComm_OnComm ()
       Select Case MSComm1.CommEvent
       ' Handle each event or error by placing 
       ' code below each case statement' 错误
          Case comEventBreak   ' 收到 Break。
           Case comEventCDTO   ' CD (RLSD) 超时。
          Case comEventCTSTO   ' CTS Timeout。
          Case comEventDSRTO   ' DSR Timeout。
          Case comEventFrame   ' Framing Error
          Case comEventOverrun   '数据丢失。
          Case comEventRxOver'接收缓冲区溢出。
          Case comEventRxParity' Parity 错误。
          Case comEventTxFull   '传输缓冲区已满。
          Case comEventDCB   '获取 DCB] 时意外错误   ' 事件
          Case comEvCD   ' CD 线状态变化。
          Case comEvCTS   ' CTS 线状态变化。
          Case comEvDSR   ' DSR 线状态变化。
          Case comEvRing   ' Ring Indicator 变化。
          Case comEvReceive   ' 收到 RThreshold # of
    chars.
          Case comEvSend   ' 传输缓冲区有 Sthreshold 个字符                     '
                         '
          Case comEvEof   ' 输入数据流中发现 EOF 字符
                         ' 
       End Select
    End Sub