项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:
4 \1 G3 n, V! k a4 m. k' W5 ?) z* m% C1 W7 _
当发送命令"H!i"时,为寻找芯片。4 S; u3 C& x) L: O3 Y
当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537! t4 K' T( n6 v+ T
当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息
8 _$ C* ~& e% ?% h8 \6 b- B }3 h& ]& K0 g1 X" u* O
当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据
: K, m4 R) S: [# I6 D没有错误时,设备返回:0630
- M7 p) T. R( x" \; _此时,发送命令“STX”,或十六进制命令“02”1 L! e5 L1 L) Q4 x6 J: N8 x
设备返回前十六字节数据
5 u% v, Q0 }; Y- [# g# S) y
2 [8 d. {6 R2 u* U' F3 `, Q之后继续发送命令“H!i”,寻找下一个芯片
% t9 A( H2 @: ~, `--------------------------------------------------------------------
, k4 y1 ~0 ?. T' \( @$ b# P项目用MSComm进行串口通信
! }1 [, I1 t( I* |+ w需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。
9 C1 [+ f. W; t- P2 l: o, b: X用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。
9 _4 Q6 Y D; R# U" z但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?
& q; B9 Z M7 b( [9 Z' F----------------------------------------------------------------------------) m. r, e9 A& a
其实程序说简单些就是:9 u/ Q2 h) E f" s
发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据
/ ^7 p# C+ j/ W5 K( e% T; K这个循环要怎么实现呢?
* B7 `8 F8 T( _ M+ p* L先谢谢各位!8 y5 A- L) t3 M S9 }
% R, D S* b& O: X% Z--------------------------------------------------------------------
$ ~0 S6 t5 v9 G% a! ~% }" L下面是循环部分的代码。系统报错
4 ~- ` [/ [2 G6 F: `Private Sub cmdStart_click()
. }2 W `3 k' O. R" I Timer1.Enabled = True
! s; R9 p% d# n" o+ U! I8 U 1 e# H* G# r# P1 W- i
9 j/ e1 q) L K; d- q, t
1 {+ e" U f* G4 p- Q3 dEnd Sub
& }, v( n+ m( @Private Sub timer1_timer()
0 H8 ]% Y! I; ?! ?
8 c* f. k* N4 t6 I+ d8 b MSComm1.OutBufferCount = 0 '先清空缓存
$ @& ~) f5 ^) ^7 N" N sendbuffer = "H!i"% D b+ n6 a% l$ M, X% P3 E
MSComm1.Output = sendbuffer
a8 U) W6 A' f( Y iEnd Sub9 i' I/ W! w$ n& X
'结束8 d4 p$ Q: B- ]
Private Sub cmdStop_click()
% U; n# n C2 K3 S Timer1.Enabled = False
" _3 F. z- M1 m9 g2 B4 ?( w Timer2.Enabled = False
2 b. B% S% n. J& w Timer3.Enabled = False
2 l) w. c9 |. H! p; U% A1 e/ e" fEnd Sub% F. j: b/ v0 }8 h0 N6 \- r
4 J1 H) C, V; v" V' _2 m' h'接收数据
( `7 T; @5 R2 y1 m6 vPrivate Sub MSComm1_oncomm()/ [: A k; h1 J' u: _
Dim inbyte() As Byte
$ A: R8 r1 `- c6 ~8 j Dim revbuffer As String
0 k* `9 x- V3 H% s a( n4 D& _* _ Dim a, i, b
* i6 j6 L; h! _# ^; l7 o4 f% [ Select Case MSComm1.CommEvent- O5 A8 Z d U6 o5 u
'如果有CT在感应区
- w/ [$ f1 K; L8 V+ E$ I7 `- w ) g6 E% U O c
Case comEvReceive
4 N3 Q2 d2 F2 k; M( f. G+ [5 t inbyte = MSComm1.Input! M" ]1 j n6 a5 T
For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制
/ L! p6 |3 b* q* c revbuffer = revbuffer + Hex(inbyte(i))1 M2 e+ k) p6 f/ a. d; X1 L; {
Next i+ l) O1 f0 N+ G [4 A g# q! u
txtHex.Text = revbuffer# S5 v! u. ]( i3 Q9 x
If Mid(revbuffer, 1, 6) = "480310" Then2 p3 P' P& \( Q0 t
Timer1.Enabled = False
+ O; U5 y- t0 F4 d( {( x Timer1.Enabled = True" {9 g$ A, ^( B! Z. J1 E
End If0 c7 a4 _8 o* o2 X" n
End Select2 G' J: x2 t8 h& X9 @! S" E
Case comEvSend. c1 [$ F; Q6 c( J
End Select$ p/ J$ H) g* T8 ~! B
Private Sub timer2_timer()
' K, e; d. q, t9 J3 ~* Y MSComm1.OutBufferCount = 0 '先清空缓存
8 H: v% K; k1 C0 X5 q' K6 y sendbuffer = "R00000016U"+ m5 d$ U- \) ~& o, ^8 R2 ^
MSComm1.Output = sendbuffer
N5 x6 P- z2 B# t XEnd Sub
D0 S+ V4 L& q/ C* c6 G3 e8 }Private Sub MSComm1_oncomm()$ Z% j; P' U: k
Select Case MSComm1.CommEvent
" H4 S+ `" M4 a- V+ B1 ~, ~ Case comEvReceive
' Q2 l7 ?1 I2 g: O) S inbyte = MSComm1.Input2 O7 A- l( w7 Q7 Q
For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制
8 p) K' h3 S2 |! i3 R2 H: g5 w) m. O revbuffer = revbuffer + Hex(inbyte(i))& M( _- {0 F* L0 U
Next i
( ?( M2 }5 K4 J; \ txtHex.Text = revbuffer9 S6 t1 _5 i& X( `
If Mid(revbuffer, 1, 4) = "6030" Then6 B& u, ~1 f6 c9 o; J; L6 y
Timer2.Enabled = False+ z% ^! t$ @. {! p3 i
Timer3.Enabled = True
0 z) r: a$ P9 |9 S3 M0 L0 z End If6 o9 G$ f# ]8 X0 w
Case comEvSend
4 f9 A* H5 O' t End Select
9 v. a1 b$ d1 D6 k) j9 b2 @End Sub3 e5 v5 y/ x; n1 B
Private Sub timer3_timer()9 j, y3 t& u4 e& d9 C: p: j
MSComm1.OutBufferCount = 0 '先清空缓存% m1 c6 e ]7 A6 n
sendbuffer = "STX"
' N8 k/ m# d: a2 P7 V8 i; U MSComm1.Output = sendbuffer' s$ ~) P" h! H" {; C% [
Select Case MSComm1.CommEvent
$ H( h8 v7 `1 `* l8 D) [ Case comEvReceive b: V' L( E4 x
inbyte = MSComm1.Input
F8 Z3 X# ^2 o. I1 j- P' R For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制
5 }$ l, M3 E* [' f+ m- m revbuffer = revbuffer + Hex(inbyte(i))5 P9 V* |# A6 ~& e' P
Next i: G$ a: N( i8 R9 \6 P6 v
txtHex.Text = revbuffer
F ^) ]/ |+ J Case comEvSend
9 U* A0 l- Y- r2 E: x" Q3 k End Select4 }) ]( L0 F$ [2 t
End Sub/ q- s3 s# v$ o6 ?; `" C0 y
1 P! Y/ p9 W3 D4 G A
" \: j6 T1 b x
, h" g2 Z/ h+ t) j- p |