项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:
( m3 L) g" h9 A2 {/ V0 Z/ p( x V; J# b/ l* l& R( l
当发送命令"H!i"时,为寻找芯片。
& C# P. w( l& {: i4 P1 |当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537+ V& v: t W# p. e' ]
当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息, `1 I5 u; o l$ m: u1 A
' S% n( W) J+ q
当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据
# ?- O2 g9 ^3 i# f没有错误时,设备返回:0630- a% D; B# ^* i' V9 y6 C) @" d# i
此时,发送命令“STX”,或十六进制命令“02”1 |5 ~" u1 w3 `2 X1 ]3 e
设备返回前十六字节数据
4 C" m, u# R! D# q: k" N( b5 A* Q* m
W4 W! J& `( c之后继续发送命令“H!i”,寻找下一个芯片
# U5 z, X/ f" L& _+ [# q( E' d--------------------------------------------------------------------9 c+ {# w( P( Q, Y+ F$ g- t
项目用MSComm进行串口通信
( d8 h* k) n6 Z' `4 u. g0 O需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。
3 C: v: Y4 N, ^2 r用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。
F L4 j5 y& b但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?
( F5 g8 M2 y, J----------------------------------------------------------------------------# L9 @6 b8 X: P7 j
其实程序说简单些就是:
' K. k; |# O# z9 J8 ~. A发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据2 u# c9 \3 @. O8 w* U \# T( b' w
这个循环要怎么实现呢?( H z: i/ b$ f: I* m& p
先谢谢各位!- O# Z ~# X; @% V- o
) E% b5 D5 C% w8 c! s& ^--------------------------------------------------------------------
/ z' Y' n% D+ d! M! ?下面是循环部分的代码。系统报错& U3 ~1 v& A; {1 S' D4 v
Private Sub cmdStart_click()3 |9 j0 L+ d( J8 K' {0 ^: N
Timer1.Enabled = True- O2 o$ U/ |1 ^. q8 | y
; d7 D4 [- w; C5 {3 e) R8 ]
4 W2 n! X# b2 b" @ i ^
, _% r2 t* T3 Q1 f% W3 M. S
End Sub6 Z# H% V: [0 R) }: c: U
Private Sub timer1_timer()
5 j: s a k8 u 6 {9 y! {5 Z% b7 d9 h7 K
MSComm1.OutBufferCount = 0 '先清空缓存
) t, e5 o1 X/ w; n) s- x3 ~ sendbuffer = "H!i"0 D& Q& p [; ^( d7 m1 a$ m8 U- b
MSComm1.Output = sendbuffer) @5 t# F) V' ^( q' b
End Sub
8 I2 q" t0 V7 p* i/ ?& Z8 {'结束
: y9 K! ]6 [: ?Private Sub cmdStop_click()
3 I. J( L5 j+ w- R' }! w Timer1.Enabled = False) |1 B' M( x, k: o7 S$ L" y% W" \
Timer2.Enabled = False2 r _6 P% [7 ~/ Z
Timer3.Enabled = False p b7 D- o8 X1 k2 y" e3 |' _
End Sub; a) e' {2 Y; j: ^0 A$ C
" B4 h! u* w& E( n" f7 u
'接收数据
! o$ S. O" h8 p$ cPrivate Sub MSComm1_oncomm()
5 k' [# y0 s: y s2 I) g, b7 m Dim inbyte() As Byte( i6 r& L% E! f d2 g9 ^, ^
Dim revbuffer As String( y( T+ V7 D- |
Dim a, i, b' v) U1 T4 W0 c; m. N, e4 w
Select Case MSComm1.CommEvent
* k% B1 i9 [/ c; f '如果有CT在感应区
7 _% M+ ~$ X. _3 ~/ | ( q1 |1 M9 s0 e$ {
Case comEvReceive
6 s/ u v$ T6 O! `6 U7 q6 X inbyte = MSComm1.Input
+ z; t" r8 z+ U9 ?* j5 K/ T For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制1 g, e3 f2 O- T. z3 @
revbuffer = revbuffer + Hex(inbyte(i))
) o+ O- n/ e0 e z% A* _5 n Next i7 }8 u s) ^" s' b" h8 r
txtHex.Text = revbuffer
5 ]0 v$ l) Q% ~) B, P If Mid(revbuffer, 1, 6) = "480310" Then
* r* h! o+ ?) } Timer1.Enabled = False
. T9 x9 c$ ~" {- b% v' Y3 Z5 ?- m Timer1.Enabled = True
1 [5 w0 l7 Z6 t End If
4 r/ V) E- ]- d5 V/ i* C End Select1 B4 |8 D i; u2 j( p' c. x
Case comEvSend
V# H3 a3 x5 |7 h4 r End Select
4 K5 R9 ^2 D' [Private Sub timer2_timer()$ e& k9 l7 U# |7 ] b) t- t
MSComm1.OutBufferCount = 0 '先清空缓存/ Y5 W+ {' o+ m3 A1 P" Y
sendbuffer = "R00000016U"
% P% B8 o& W- g% x. p4 F" @ MSComm1.Output = sendbuffer
* K5 M* G- r: U, P) |End Sub* Y+ ^+ U& i3 z5 h$ Q' f2 U3 u
Private Sub MSComm1_oncomm()
4 r$ _) g- R* K5 K Select Case MSComm1.CommEvent G: [! i1 J4 y1 m* \: Q
Case comEvReceive
9 Q. O' R/ Z! Y- @0 `: Y inbyte = MSComm1.Input
( m2 w" y" q4 {' ^5 v For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制
* W! L8 r8 P% L6 i% D& t9 [ revbuffer = revbuffer + Hex(inbyte(i))
+ ^) i& ~% m" t Next i
$ b& }' a9 M8 k txtHex.Text = revbuffer% B8 J- Y" k6 _: r
If Mid(revbuffer, 1, 4) = "6030" Then
& Y7 U% q' Q6 v w' W s Timer2.Enabled = False
# f- D5 p7 _' T8 Y Timer3.Enabled = True8 m$ s3 A3 E1 z* y1 b
End If; h) S5 n& x1 t, D
Case comEvSend' l, X( l* m+ f9 a9 g% c
End Select* q7 m% I( u% H, m: q+ w
End Sub
5 U. m6 q& i2 jPrivate Sub timer3_timer()3 P; ^+ I, ]8 ^9 X! ~/ A! q" o
MSComm1.OutBufferCount = 0 '先清空缓存
9 n: W2 c! [& [5 }3 l! a sendbuffer = "STX"2 f( f$ P6 m( w8 @8 h5 V7 l
MSComm1.Output = sendbuffer
+ v7 G2 X: B I+ e% [" B, E Select Case MSComm1.CommEvent
* `" h1 J$ I5 `/ J! ~. p0 d: T Case comEvReceive
$ V8 n+ A( E+ @( o inbyte = MSComm1.Input6 T- h, A/ `- l2 h% ?& M
For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制, {0 n4 Q/ n+ @0 q
revbuffer = revbuffer + Hex(inbyte(i))/ N. Z0 y) R8 D' |- m- t
Next i3 V" p; P! @# |
txtHex.Text = revbuffer
8 }# r: }. u: Q) l Case comEvSend
/ H) C6 {9 r1 i0 a9 {4 l) i End Select
( T8 Y, ]& k/ E6 UEnd Sub3 f% Y* c }) n" E
8 c* L2 t; n: r4 E* L0 S
2 D; Z' H% ?) T2 j+ W
1 r/ R$ }1 i# c' g
|