VB MSComm控件接收数据

眯眯豆儿 2010-11-22 03:49:01
需要用MSComm控件进行串口通信,发送的命令为 十六进制的 chr(&H10) & chr(&H04) & chr(&H04) 接收返回的数据位 &H1E或者 &H7E,问题是,接收不到返回,代码如下:



Private Sub Form_Load()

MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeBinary
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.PortOpen = True

End Sub

Private Sub command1_Click()
Dim selfcheck As String
selfcheck = Chr(&H10) & Chr(&H4) & Chr(&H4)
MSComm1.Output = selfcheck
End Sub


Private Sub MSComm1_OnComm()
Dim inbuff As String
Select Case MSComm1.CommEvent
Case comEvReceive
inbuff = MSComm1.Input
MsgBox inbuff
End Select
End Sub

...全文
238 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
m_nAdrs 2010-12-29
  • 打赏
  • 举报
回复
给力了,最近搞这个
眯眯豆儿 2010-11-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 veron_04 的回复:]
楼主,不用那么麻烦吧?OnComm事件中不需要清除什么OutBufferCount等,那样可能还要出问题。
还有串口可以一直开着,直到关闭程序时载关闭它即可。
代码要力求简洁,多余的不要写了。
[/Quote]

小生受教了!呵呵
贝隆 2010-11-22
  • 打赏
  • 举报
回复
楼主,不用那么麻烦吧?OnComm事件中不需要清除什么OutBufferCount等,那样可能还要出问题。
还有串口可以一直开着,直到关闭程序时载关闭它即可。
代码要力求简洁,多余的不要写了。
眯眯豆儿 2010-11-22
  • 打赏
  • 举报
回复
非常感谢!学习了

Private Sub Command1_Click()
Dim OutBuffer() As Byte
Dim tem As Variant
Dim e As Integer
Dim q As Integer
Dim LenOfText As Integer
LenOfText = Len(Text2.Text) \ 2 - 1
ReDim OutBuffer(LenOfText)

If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
End If

q = 0
For e = 1 To Len(Text2.Text) Step 2
tem = Mid(Text2.Text, e, 2)
OutBuffer(q) = Val("&H" & tem)
Debug.Print Val("&H" & tem)
q = q + 1
Next

MSComm1.Output = OutBuffer

End Sub

Private Sub Form_Load()
Text2.Text = "100404" '发送的命令
MSComm1.CommPort = 1 '固定为串口com1
MSComm1.Settings = "9600,N,8,1" '设置Settings属性
MSComm1.InputMode = comInputModeBinary '访属性用于设置或者返回传输数据的类型 ComInputModeText文本 comInputModeBinary二进制
MSComm1.InputLen = 0 '该属性用于设置并返回Input属性从接收缓冲区读取的字符数 当设置InputLen为0时,使用Input将使MSComm控件读取接收缓冲区中全部的内容。
MSComm1.InBufferSize = 1024 '用于设置或返回输入缓冲区的大小,默认值为1024字节。

MSComm1.OutBufferSize = 512 '属性用于设置或者返回发送缓冲区的大小,值为整形表达式,表示传输缓冲区的字节数,默认值为512字节。
MSComm1.PortOpen = True '打开串口
MSComm1.SThreshold = 0 '设置并返回传输缓冲区中允许的最小字符数。如果Sthreshold等于5,仅当在输出队列中字符数从5降到4时,comEvSend才发生。如果在输出队列中从没有比Sthreshold多的字符,comEvSend事件将绝不会发生。

MSComm1.RThreshold = 1 '若RThreshold属性设置为0(默认值)则不会产生OnComm事件。否则,该属性为一阈值,当接收缓冲区内字节个数达到或超过该值后就会产生OnComm事件,例如,设置RThreshold为1,接收缓冲区收到每一个字符都会使MSComm控件产生OnComm事件。

MSComm1.InBufferCount = 0 '用于返回输入缓冲区内的等待读取的字节个数,可以通过该属性值为0来清除接收缓冲区。

MSComm1.OutBufferCount = 0 '清除发送缓冲区
End Sub
Private Sub MSComm1_OnComm()
On Error Resume Next
Dim BytesReceived() As Byte
Dim buffer As String
Dim HData As String
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive '接收十六进制数据。并以十六进制显示
MSComm1.InputLen = 0
buffer = MSComm1.Input '接收数据至字符串中
BytesReceived() = buffer '将数据转入Byte数组中
For i = 0 To UBound(BytesReceived) '显示结果以十六进制显示
If Len(Hex(BytesReceived(i))) = 1 Then
HData = HData & "0" & Hex(BytesReceived(i))
Else
HData = HData & Hex(BytesReceived(i))
End If
Text1.Text = HData
'最后将结果后入Text1中
MSComm1.OutBufferCount = 0 '清除发送缓冲区
MSComm1.InBufferCount = 0 '清除接收缓冲区
MSComm1.PortOpen = False
Next
End Select
End Sub
t69490741 2010-11-22
  • 打赏
  • 举报
回复
同意二楼的。但是我觉着二楼的代码中 应该把COMM的参数设置和串口打开程序放到command1_Click中
在MSComm1_OnComm()中,最后,关闭串口。这样对串口的调用比较合理
贝隆 2010-11-22
  • 打赏
  • 举报
回复
1、就你的代码而言,是错误的,正确的应该如下:

Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeBinary
MSComm1.RThreshold = 1
MSComm1.InBufferSize = 1024
MSComm1.InBufferCount = 0
MSComm1.OutBufferSize = 100
MSComm1.OutBufferCount = 0
If Not MSComm1.PortOpen Then MSComm1.PortOpen = True
End Sub

Private Sub command1_Click()
Dim bytOut(0 To 2) As Byte
bytOut(0) = &H10
bytOut(1) = &H4
bytOut(2) = &H4
MSComm1.Output = bytOut
End Sub


Private Sub MSComm1_OnComm()
Dim strInput As String
Dim intP As Integer
Dim varP As Variant
Select Case MSComm1.CommEvent
Case comEvReceive
MSComm1.RThreshold = 0
For intP = 1 To MSComm1.InBufferCount
varP = Null
varP = MSComm1.Input
strInput = strInput & Right("00" & Hex$(varP(0)), 2)
Next intP
MsgBox strInput
MSComm1.RThreshold = 1
End Select
End Sub

2、检查一下你的连线,端口设置(波特率、校验方式等等),通信协议是否理解错误
-晴天 2010-11-22
  • 打赏
  • 举报
回复
1.检查串口对不对.
2.检查连接是否完好.

7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧