项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:
; ]+ i% _' z' u- D4 T! B# g% h4 {- O. w* c5 y2 a
当发送命令"H!i"时,为寻找芯片。2 h" Q+ Y- \" D7 D* t
当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537' c. S+ J- k, c4 p. ?, U
当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息% N/ u9 r; n, N/ K/ p6 { f, z
* [3 e: W/ ~( Z
当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据3 } ?, B0 b& E$ C6 L
没有错误时,设备返回:0630/ \; y" @4 ~' U( w4 K8 }
此时,发送命令“STX”,或十六进制命令“02”
0 A/ g+ y/ e1 l; {设备返回前十六字节数据
7 A% l% o! D, T' k5 P4 F3 K, R- U# H+ C! F
之后继续发送命令“H!i”,寻找下一个芯片
/ q5 Y1 o) N2 v) H# F8 C--------------------------------------------------------------------# i9 q! M! M5 i. Z
项目用MSComm进行串口通信2 `% i2 W9 G) k0 ?5 g4 j* g3 `! Z
需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。
' }0 I& q! e1 q! `用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。/ {- b( f' p( V9 e3 {0 Q
但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?7 G/ A y; H4 B }$ D3 s
----------------------------------------------------------------------------% W6 \2 Y, ]' [, l+ t
其实程序说简单些就是:
$ |& r! v/ U c0 c% s0 W9 R4 u' A, Q发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据/ E# D4 v+ i; V' A8 i3 g) z L! p; a
这个循环要怎么实现呢?5 x2 d* z( v# M, c) T, U' u
先谢谢各位!
# v3 ~8 V( ]$ ~/ ?0 [: d1 L% @5 R& M8 W6 r9 S8 B
--------------------------------------------------------------------
& T* _4 p( }% N7 F2 b8 k下面是循环部分的代码。系统报错0 t' `, V! ?3 Q* y- Q6 l
Private Sub cmdStart_click()- k' q' b# r) J5 R: b3 |! Q
Timer1.Enabled = True+ ~+ C, F6 `# n+ k& v+ H$ T
% e f6 T0 u: b u- P 8 B$ m, h s7 ~( K. Z8 u! I
* P2 m$ ^: L1 a+ b) c* wEnd Sub
) C4 y# [% ]4 q' K, N6 f, {! ^Private Sub timer1_timer()
- P5 H* N& z. U) k7 O ~3 R- \1 f + j/ Q7 R6 N8 S L# p
MSComm1.OutBufferCount = 0 '先清空缓存
& {# @! W3 ~* R sendbuffer = "H!i"# E: x( a' q# T5 W
MSComm1.Output = sendbuffer
- T( d1 r# o0 Z' f& u& }6 M4 ]6 [End Sub
: f* P$ g! { |3 F# w'结束5 a4 L2 s* ]5 ]4 q7 z
Private Sub cmdStop_click()
# C* k% p, L! ~/ E Timer1.Enabled = False- O, K8 r! S9 B% r
Timer2.Enabled = False
! @- X* a0 B& R Timer3.Enabled = False5 ^, n3 S7 [4 [: t% [, b c
End Sub
5 o4 D; c* C8 n$ O q$ k. F4 p2 {' h& @% X- u* c* {
'接收数据) I5 W, @" @0 f1 ^: k4 h% T' C2 q
Private Sub MSComm1_oncomm()3 G0 {5 Q. U& I" a' \
Dim inbyte() As Byte9 c+ C" N6 R& p$ R, p. n; }# w' y5 |" q
Dim revbuffer As String, C2 A! c% v. V& Y- Q9 G: B0 h
Dim a, i, b
+ A+ [/ B1 L; ^) ^3 }& s. Y Select Case MSComm1.CommEvent" h0 {" k- u) S* ] g
'如果有CT在感应区
6 O1 W% t, N1 S( t, o9 \+ \- V ?/ r% e& C# P `; R g
Case comEvReceive
' ^2 \" B6 l0 V5 S4 c: \ d9 w inbyte = MSComm1.Input
b7 Q' l) c F* t. t For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制
) i& I2 N7 E3 D" Q4 J revbuffer = revbuffer + Hex(inbyte(i)), Z. ]( ]9 S7 C- [
Next i* w9 `* V5 |$ D9 i6 |
txtHex.Text = revbuffer
! q2 u5 n. ?* G' E If Mid(revbuffer, 1, 6) = "480310" Then
4 q5 s* B" A$ G Timer1.Enabled = False
; @1 }4 Z! n8 K2 a: R; K Timer1.Enabled = True' w, p8 J( C, A4 s! Y z& m
End If
, h+ L. o1 L0 }, y; C- k End Select
% i* @/ B- }" b Case comEvSend
5 l) A, U; w1 J6 c$ Z End Select* D1 K o) d: @* w) B
Private Sub timer2_timer()7 C# a: p; p/ \2 A. I. E0 j
MSComm1.OutBufferCount = 0 '先清空缓存
) a7 A G5 |, o( M2 R! b sendbuffer = "R00000016U"
9 e. v6 {, B: z$ B! `+ T MSComm1.Output = sendbuffer
2 Q- P0 _/ x) J4 k0 G# IEnd Sub
* F; k( W+ U. x7 g) ?' s; fPrivate Sub MSComm1_oncomm()
_, a' S5 `- g+ K3 v, ] Select Case MSComm1.CommEvent
8 \; ]" _2 m# N2 D* V5 q Case comEvReceive9 _ a- q/ w# ?) ]% d/ n5 ~
inbyte = MSComm1.Input: L2 C6 j( s8 g! ?% c- o, S, I
For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制
) u* g" D5 m! a. ~! B% z; |- y revbuffer = revbuffer + Hex(inbyte(i))' U; Z$ @# t s8 A2 ]$ F- H& [
Next i7 \& O5 B4 P0 Z& _! v$ t1 ]
txtHex.Text = revbuffer
7 i. z+ r/ B+ Y8 W$ S If Mid(revbuffer, 1, 4) = "6030" Then0 D3 ^* J/ H `
Timer2.Enabled = False7 d! ~2 x; d( ]5 M7 v5 S$ A
Timer3.Enabled = True5 y8 A8 L A6 v+ X8 Z+ e
End If
}0 e/ \+ [* \* g& t% F; B: h Case comEvSend
) Q8 e- z# u. D @. o. \ End Select# [! ^, V$ W, q/ q) A
End Sub- v. [- t; c# | D: c
Private Sub timer3_timer(): h7 ]; y3 d; [+ @1 _6 T
MSComm1.OutBufferCount = 0 '先清空缓存
: p5 X9 X+ {1 W+ T" E0 z* d: b: A sendbuffer = "STX"7 w. k& [. [, g
MSComm1.Output = sendbuffer
9 `' }( D4 `: G; N2 H Select Case MSComm1.CommEvent/ b( F! L9 U, K$ d5 H5 M% [6 i& L
Case comEvReceive
$ h) i/ @$ ^8 D/ n inbyte = MSComm1.Input( z! N- c, r$ l
For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制5 A9 L; G4 K" f( F: K& {
revbuffer = revbuffer + Hex(inbyte(i))) `: h" I4 J' i3 h. b5 T. E7 y
Next i
9 b3 x& }: o5 C# a, i) a txtHex.Text = revbuffer
% v5 T1 |2 q5 m* P. }/ o Case comEvSend4 b9 Q( S0 J: g
End Select
' @9 O8 l4 f1 n' qEnd Sub
. [' ]4 U; Q+ G1 D2 Y. T. H% i- Y: k6 d" i& y
8 Z" w5 @# L/ ]) ]6 h8 E. H4 J6 T0 k" B: H Y
|