项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:
! M. W: u4 o. K' C F( N. u1 N. s" j: ~) W
当发送命令"H!i"时,为寻找芯片。; f; Q: A- n/ Z2 `/ g0 v0 ~! h
当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 15379 B% ] ^& u* g% S
当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息% ?6 d$ K7 t: P
! W u9 N: |- ^9 M' ^0 u5 H
当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据- ~2 y2 `8 z# C( j
没有错误时,设备返回:0630
+ w% w% X4 b! M6 ^; f1 }此时,发送命令“STX”,或十六进制命令“02”
( I& Z& T+ ~: O$ Z4 W, ^: D! W3 B设备返回前十六字节数据
) D' [. P- V0 F9 e6 [" \" V; ^6 K' z' ~/ a6 W$ X R
之后继续发送命令“H!i”,寻找下一个芯片
( H5 e: f4 t! K/ k) j* q; P--------------------------------------------------------------------
- X% n8 d6 \. [; H- J( E! U项目用MSComm进行串口通信
; p7 B) b" Q) f2 V, \需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。8 d2 s" G- U' D7 t- D
用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。
4 m. f2 K# i' i j% T e但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?
$ ]; l! G7 I1 a( y/ V& s: R6 d* q----------------------------------------------------------------------------+ ]3 E& Q+ z# I& q! n# O" [
其实程序说简单些就是:1 i3 k5 F4 M# s5 ?' t$ A. V4 X
发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据4 _" \# ]# E9 \; G1 P/ M
这个循环要怎么实现呢?8 z& Z6 b2 E% r& s/ b
先谢谢各位!. g7 [) t/ o7 t3 z% ?9 }9 c* g8 q
' R1 x6 [5 h3 D1 a% A6 u* S9 X
--------------------------------------------------------------------
$ l8 l) S/ j2 b. `下面是循环部分的代码。系统报错
7 y. d3 ?. f- n' I1 B' cPrivate Sub cmdStart_click()
- Z8 b! R+ m, Q/ y7 ^6 w) q9 _ Timer1.Enabled = True2 n7 {3 |( ~ h( |3 \+ A- \
2 k$ j7 M; P' G! b3 T
) n6 K1 V. ?6 {! o5 R
! |7 _' y" H+ {End Sub
. |+ Y7 C8 r& t5 K$ x/ O6 t& VPrivate Sub timer1_timer()$ j6 k1 z' u& B( H0 s2 n
+ ?2 u5 O. j+ q; p: f7 I' A8 B1 Y( [
MSComm1.OutBufferCount = 0 '先清空缓存3 _" q# ?) v. ]- ~
sendbuffer = "H!i"
% n' ~# j( M$ @) O; G; z+ N& x! u MSComm1.Output = sendbuffer
# F6 W. _* x) Y9 ^4 b7 KEnd Sub N8 @# C7 Z) c+ A) A0 W) }
'结束/ r4 D9 M) v f- M9 W/ ]
Private Sub cmdStop_click()
$ D% i- j' \" b7 v7 H% R* o Timer1.Enabled = False
+ q7 o2 B( }1 K Timer2.Enabled = False
8 F1 F: {8 j) `9 _ Timer3.Enabled = False
& L. Y7 z: ^+ r# h" \5 T6 vEnd Sub, l! r. t4 Y. }' C0 O: U) M2 m
' p; H1 ?1 k* e
'接收数据) a0 a H( `! U. B: P4 o
Private Sub MSComm1_oncomm()
: m) E L& X5 n& o8 ?+ B x2 T Dim inbyte() As Byte
' T( \& B. H+ G% B8 o Dim revbuffer As String; B3 z( C8 j3 Z" {3 \5 n
Dim a, i, b
; c/ t2 a3 | U: D Select Case MSComm1.CommEvent
% }$ k( E0 J1 I8 L w '如果有CT在感应区/ B: i0 \, T# [
. Z% P# R9 m4 i$ a& g0 F, F) ~, `4 @0 V Case comEvReceive; _ d2 H9 M4 k! g
inbyte = MSComm1.Input2 e# ^( V; I% O/ C$ @, P
For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制# [% T" {9 u( b
revbuffer = revbuffer + Hex(inbyte(i))* R1 P, _1 @& C- b5 @% }0 ~; K. x
Next i
9 R6 r6 p! I9 [$ g) P: A3 r7 b3 L txtHex.Text = revbuffer. h' C' Y$ |! u9 x
If Mid(revbuffer, 1, 6) = "480310" Then
: m5 h1 J* W5 s1 N5 M7 w G Timer1.Enabled = False
6 n2 y6 a5 }2 a6 l, x Timer1.Enabled = True' T6 c, h2 C/ z8 z7 t% e/ q
End If
# |3 W' V+ y8 ?8 }2 b6 u6 F End Select
" R/ |' h# o) [7 W/ P; G Case comEvSend5 m9 ]8 @$ {. X7 }; v
End Select5 I# V2 ] |2 S
Private Sub timer2_timer()
H4 ^3 X. k: b$ n$ _1 u7 Y' D MSComm1.OutBufferCount = 0 '先清空缓存
6 l$ z8 b- a, W: o2 O/ A sendbuffer = "R00000016U"; p, D6 [+ J6 L4 X
MSComm1.Output = sendbuffer/ F. X. L( z/ o& C0 n5 o
End Sub
( y) E7 x, z+ i5 f7 A# A. vPrivate Sub MSComm1_oncomm()
# q3 v- h+ j9 p- U Select Case MSComm1.CommEvent
, ?9 I J( c3 n' X5 ? Case comEvReceive. ~* z9 L6 @+ b# Z
inbyte = MSComm1.Input
3 k" i# C3 d% ^ For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制9 W. g* `8 L4 c4 J/ _* x& W
revbuffer = revbuffer + Hex(inbyte(i))$ _8 u! h" A* ]2 z0 g
Next i. y$ S. s! |: D3 L
txtHex.Text = revbuffer
7 `4 z' u7 l" s If Mid(revbuffer, 1, 4) = "6030" Then/ G. {( z. V: E1 ]5 x0 J' x7 C
Timer2.Enabled = False
& t; u) T* H7 ]( o- ] Timer3.Enabled = True( H& y0 Y& t* k$ N' C2 f; U/ a) T
End If
1 C& {5 l" R( x- P6 U+ b( A% V5 d Case comEvSend
# K; ~5 h9 K8 j6 V7 P' p End Select
d2 u, `3 w# L8 q* ~) c. h9 ~# eEnd Sub& Q0 D/ h3 v. _/ @( N( y
Private Sub timer3_timer()/ u% z$ m `- O+ u: O* M
MSComm1.OutBufferCount = 0 '先清空缓存/ p _- d; S, W& H% {
sendbuffer = "STX"
% F" Q! D: U6 J7 X) { MSComm1.Output = sendbuffer* u5 \& X) Y* r1 L/ D
Select Case MSComm1.CommEvent3 L+ y! {5 m8 X( r; H8 e
Case comEvReceive
- {/ s% [7 r9 g1 j2 m inbyte = MSComm1.Input( p2 _* A) {; Z# V* K' j7 _* k- T
For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制' S1 X& H' S: N. R
revbuffer = revbuffer + Hex(inbyte(i))
0 G: i' Y) ^' t U3 L Next i# Z$ A/ F( W/ l/ i" j- w& I
txtHex.Text = revbuffer+ ~' k5 P, `$ q; o
Case comEvSend9 c& A% f# r& N3 ~2 ]
End Select" H- F. C8 k; D% m
End Sub- ]6 P I( I! a" U8 m* K
. r8 Y$ e# o5 N, h2 J# R# R3 s+ Q# L: W' j |- x" R& J
6 X" M% X1 G$ r4 P5 Q; ~ |