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 '这个是我用串口的一段代码,希望对你有帮助,我刚开始做的时候,波特率美设对,就都是乱码
to water_j: 谢谢你的建议,但是我已经把接收缓冲区设得足够大了,而且handshaking各种值 我也试过但是情况也没太大变化,其实handshaking值只能试0或1,别的值根本 不通.还有我改用二进制读看来乱码的错误解决了,但是会出现数据丢失.
要注意mscomm控件的oncomm()事件时有很多种情况触发的 应判断 if me.MSComm1.CommEvent=2 then 详细请参照CommEvent定义
楼上说的对! 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
干脆用二进制形式取怎么样。
另外,帮忙推一把:
http://www.csdn.net/expert/topic/640/640646.xml?temp=.4522974
设置或返回 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
我是用mscomm.input=0,就是一次全部读完。
设置并返回硬件握手协议。语法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
"读comm设备错误",这又是怎么回事呢??
建议将接收缓冲区设大或将速率减小!Settings 示例
下面的例子设置控件端口通讯,波特率 9600,无奇偶校验检查,8 个数据位,1 个停止位:MSComm1.Settings = "9600,N,8,1"InBufferSize 属性
设置并返回接收缓冲区的字节数。语法object.InBufferSize[ = value ]InBufferSize 属性语法包括下列部分:部分 描述
object 对象表达式,其值是“应用于”列表中的对象。
value 整型表达式,说明接收缓冲区的字节数。
说明InBufferSize 是指整个接收缓冲区的大小。缺省值是 1024 字节。不要将该属性与 InBufferCount 属性混淆,InBufferCount 属性返回的是当前在接收缓冲区中等待的字符数。注意 接收缓冲区越大则应用程序可用内存越小。但若接受缓冲区太小,若不使用握手协议, 就可能有溢出的危险。一般的规律是,首先设置一个 1024 字节的缓冲区。如果出现溢出错误,则通过增加缓冲区的大小来控制应用程序的传输速率数据类型Integer
返回接收缓冲区中等待的字符数。该属性在设计时无效。语法object.InBufferCount[ = value ]InBufferCount 属性的语法包括下列部分:部分 描述
object 对象表达式,其值是“应用于”列表中的对象。
value 整型表达式,说明在接收缓冲区中等待的字符数。
说明InBufferCount 是指调制解调器已接收,并在接收缓冲区等待被取走的字符数。可以把 InBufferCount 属性设置为 0 来清除接收缓冲区。注意 不要把该属性与 InBufferSize 属性混淆。InBufferSize 属性返回整个接收缓冲区的大小。数据类型Integer
用二进制可以
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
'这个是我用串口的一段代码,希望对你有帮助,我刚开始做的时候,波特率美设对,就都是乱码
谢谢你的建议,但是我已经把接收缓冲区设得足够大了,而且handshaking各种值
我也试过但是情况也没太大变化,其实handshaking值只能试0或1,别的值根本
不通.还有我改用二进制读看来乱码的错误解决了,但是会出现数据丢失.
应判断
if me.MSComm1.CommEvent=2 then
详细请参照CommEvent定义
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