项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:
) m, L% i5 j u$ H- m% f3 e' F6 e2 x3 u5 L, \0 o! l" ?
当发送命令"H!i"时,为寻找芯片。3 j& U# L/ t% e. }
当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537
# J, ?7 g. y0 G, T) O2 o当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息
a4 |+ i" |" ]1 |. Q8 B0 E0 z5 o$ q/ U8 w, q
当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据# Z6 N/ s" x$ l* L' t! e* z% V& `' r$ ^
没有错误时,设备返回:0630, R' q) ?0 [ n3 ^
此时,发送命令“STX”,或十六进制命令“02”, {/ m: i0 v' ]- P8 |5 ^3 T6 l1 S& M
设备返回前十六字节数据
9 g* F5 V5 v2 J) G0 | f; a, R4 z t; c: i% N7 G" X+ [5 K0 N
之后继续发送命令“H!i”,寻找下一个芯片# L; A1 ]/ e6 y3 X. r
--------------------------------------------------------------------& [0 G% {9 \; j# J S
项目用MSComm进行串口通信
& k. i% _+ w3 y1 A5 X5 e. n8 z/ ]需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。
2 J: Z$ |4 X7 ~3 c: h) F用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。, n# R1 [- p4 j+ v) {$ N( ^
但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?( ^3 e# ?& j- {! r+ Q4 X- i2 F; H. P
----------------------------------------------------------------------------
; ^. @' @, ?* K9 r其实程序说简单些就是:
6 T4 y) ?1 n: M6 ]0 F* p- H发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据; ?9 e; x- w4 A5 J1 `# j
这个循环要怎么实现呢?+ t! ?/ r% `) n6 o* r9 L
先谢谢各位!( J- k5 z2 t- w: I
% b% |4 @& E& _" ^--------------------------------------------------------------------
) ?. R3 x6 |& l- l: B# [, K下面是循环部分的代码。系统报错
: _4 z8 T7 d0 ?' nPrivate Sub cmdStart_click()
1 a2 `* U) Y0 h$ N! P- W Timer1.Enabled = True6 Y6 X C0 D4 m- s; P( ~) z+ N
4 e. `- w0 h$ {8 s! q! \
' q$ v% X+ g8 T
N5 Z* W: w5 n3 N: p& I% MEnd Sub7 X9 I8 h" u; G8 L7 p. n- G6 |
Private Sub timer1_timer()
& w& D% W" l6 Z. w9 _ {5 X: H& D% T8 S 1 J9 i- \; E1 F3 G7 d' w
MSComm1.OutBufferCount = 0 '先清空缓存3 |$ V) T4 A0 s3 M' P& Z6 @, y
sendbuffer = "H!i"* u8 _; N3 \% D) n# u- {; Z C7 }
MSComm1.Output = sendbuffer
) ]9 T( Y6 ~: g& G8 K8 w( YEnd Sub- L7 g( ^, \) l* G& b8 d7 A
'结束. K. f# o; \6 Z4 l8 e
Private Sub cmdStop_click()
. S$ H! V2 P. P, Q% c Timer1.Enabled = False
9 M; R) [% L; w1 b' m, O4 f Timer2.Enabled = False
- b- G/ e; T" [$ Q+ w8 S D Timer3.Enabled = False7 D- L# I8 R# E7 O
End Sub
7 q/ t4 A) J* q3 e# R
6 M, w( ~5 n K9 V1 z( c'接收数据
4 f4 r. i( h6 e- P7 PPrivate Sub MSComm1_oncomm()" q% a. z7 Y7 e; l
Dim inbyte() As Byte
: C$ ?- ?: i4 n Dim revbuffer As String
# i9 Z' k. Z! V: R Dim a, i, b
) D9 G2 ^1 t- u% j9 Q" } Select Case MSComm1.CommEvent
; ]7 R+ P" n7 Q* ^6 T7 B '如果有CT在感应区1 }1 m2 A$ H( F0 X }
# } i' J1 M3 Z Case comEvReceive& ~7 e. [* N" Q6 R& M. P5 }' {
inbyte = MSComm1.Input& G7 x+ A, k! ]3 I' a' x
For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制( \; w8 B1 y& R' }8 F& q. I. j0 X
revbuffer = revbuffer + Hex(inbyte(i))
- o7 J4 m9 e# g3 `# p Next i
/ V' W. {" Z' @& m' k2 v; } txtHex.Text = revbuffer n, ~1 w7 ~- i3 F, O4 T( N
If Mid(revbuffer, 1, 6) = "480310" Then
0 T$ A: p; k* S, d/ u; k1 b Timer1.Enabled = False
. U3 J& Y% @; |. a* E, M Timer1.Enabled = True
- p+ e! b6 T" @( d/ v1 M End If* M" e! f/ m1 x _" f
End Select+ o+ ?; {7 L5 U8 N1 C
Case comEvSend& P+ O$ P- S9 i4 I: h
End Select
5 I9 N- O; a* d" cPrivate Sub timer2_timer()* \+ Q$ v$ S/ T8 M" p
MSComm1.OutBufferCount = 0 '先清空缓存
: G V* ~) n/ \& w* ?8 F sendbuffer = "R00000016U". a& B; Z! @8 |7 n' d
MSComm1.Output = sendbuffer
$ I' q+ Z$ Q! E/ uEnd Sub7 |- \8 t2 ?3 F
Private Sub MSComm1_oncomm()
, l+ l' d4 Q) b( C( u5 i% D7 G Select Case MSComm1.CommEvent* a' f& O) w: E4 D* z" V
Case comEvReceive7 K& X' W9 r: a0 y! h
inbyte = MSComm1.Input0 w$ r9 Y# O. ^, d
For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制
# O H( u% D1 Z1 ^6 |; K revbuffer = revbuffer + Hex(inbyte(i))
3 O; Y- d6 O8 Y3 @ c& [/ X, s Next i# |4 C- q- h, J R+ t8 a. u
txtHex.Text = revbuffer
# Y o- `3 c4 A" d( a: ? If Mid(revbuffer, 1, 4) = "6030" Then
$ v/ ]: g+ e+ m* c! f Timer2.Enabled = False( @9 [/ u1 m( Q/ M/ {' N: H+ ~
Timer3.Enabled = True
. g, I" S4 d- q" P End If
2 `2 M2 h q1 n+ Z6 w Case comEvSend
. u3 D5 e$ }; n; P! K End Select/ {$ {! |- M1 f+ _: B% O5 \2 Q* G" I5 Q
End Sub
8 [8 ]9 n# y0 l/ _4 zPrivate Sub timer3_timer()
/ D1 j4 V- M- Y! e- I MSComm1.OutBufferCount = 0 '先清空缓存
" R! D8 z5 ]) @( ^/ m5 x3 |. P2 q) o sendbuffer = "STX"
( V m- u0 U8 d9 ^3 h- V9 V" E4 g MSComm1.Output = sendbuffer' a% }6 C, W7 [% X8 N6 N# d
Select Case MSComm1.CommEvent
5 N" @# `& T$ D5 B( f. O0 F Case comEvReceive
L% G5 ]7 l4 X. W2 J3 J9 D9 P inbyte = MSComm1.Input
& w3 l `" C1 r' g9 z; {) f For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制6 V. B! ^* P" M3 y
revbuffer = revbuffer + Hex(inbyte(i))
: p) Q) V0 ~' [5 F Next i
* P/ R1 Z* c0 [3 w: b# p d txtHex.Text = revbuffer
( R" |* h0 f" ~9 N: Y) e Case comEvSend
7 V* F# m, N. e& q3 `0 v End Select8 K( W- f) F8 w1 t, S
End Sub
" i0 R# p2 t! t" @( a+ h- Q0 W0 q8 b7 \) R m3 N
" y# J; @, H7 D. J. [( q# [, Z* R/ f5 {) f2 J) y/ Y+ b/ \
|