项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:( U6 u( ?0 j( m0 \
: c) c* [; {2 ?
当发送命令"H!i"时,为寻找芯片。$ R% L% P" k/ b; `
当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537
9 b. X/ v, C! n: @$ S当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息
7 s- h3 F0 u6 p5 ~3 x
1 ?% B W5 G; F) C. [当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据
1 g! r, }+ _1 g* [ e没有错误时,设备返回:0630& {8 Z5 Q- l4 f
此时,发送命令“STX”,或十六进制命令“02”. i$ A+ @( v1 r, o) T# Q* N
设备返回前十六字节数据1 n! ~% O* W1 p; W
# g- }$ ]3 U4 t6 I# B; d: d& ]8 J之后继续发送命令“H!i”,寻找下一个芯片. c/ S- T2 x+ U) b) t% d
--------------------------------------------------------------------
, v7 h% M" c: `7 M& i$ F7 c6 w项目用MSComm进行串口通信" }; [" U) j! s( ?1 d. @5 |
需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。8 i+ B# ^6 C# \5 p3 ]
用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。
. D8 w/ S& r7 T$ O* A8 v s1 x但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?$ ~3 }+ N4 C9 W
----------------------------------------------------------------------------/ }: t( B+ O2 M1 J4 e! O
其实程序说简单些就是:( I( V7 ^+ j$ V$ }" ]5 r
发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据3 }, d- l. A& y
这个循环要怎么实现呢?0 U' G5 x3 ^& R; l9 n
先谢谢各位!9 T9 c' X" l% H+ ^
$ z. B, t9 ^, H, I9 l5 c
--------------------------------------------------------------------
7 z1 O& P# _- w) K下面是循环部分的代码。系统报错! D3 t# E& O" l! K4 A2 v
Private Sub cmdStart_click()
8 A) c) m4 h* i0 v Timer1.Enabled = True
+ B. ?8 @& Q) s. N 5 Y6 n& p5 A5 t3 S6 k x
w8 ]5 v: `6 j/ L" {7 Z
* P9 e" l; q' @/ R" G+ }/ C& eEnd Sub7 O6 B# n/ J( k/ z- j
Private Sub timer1_timer()
b& }6 }9 a, G; h ! |$ X* V2 t9 m8 t
MSComm1.OutBufferCount = 0 '先清空缓存2 `; F. m; Z* F" L$ O- x9 N& b
sendbuffer = "H!i"
7 n& M# f# F6 l# [ MSComm1.Output = sendbuffer6 E# Z3 c% ~2 o/ Z$ x/ D( ?- M
End Sub
% u# Q0 B+ A$ M9 V'结束/ e9 b+ s! T7 |$ t0 m2 {" e+ r
Private Sub cmdStop_click() X/ ]$ T6 W/ G$ }$ B+ S0 c1 J) A/ B
Timer1.Enabled = False$ q* U5 k; J' B3 Q7 Z4 d
Timer2.Enabled = False
2 h* ^0 A2 _7 v1 s4 @2 g5 \2 F Timer3.Enabled = False f" e, B6 o7 K0 u, f
End Sub; S/ `! d$ j5 h+ x1 F0 l9 r" m, W* j
+ a0 c8 M4 r0 R' Q U5 ?
'接收数据0 c6 ?8 s! j' j# i- E1 s
Private Sub MSComm1_oncomm()
! V2 H* E# _- R/ w! }3 } ?( h Dim inbyte() As Byte
7 ~; d* n- }* O( ~7 x0 k+ L Dim revbuffer As String
- ?8 }3 W' j) v# b$ }5 F( F Dim a, i, b$ M1 {! _4 g# R( m$ x' q0 ~
Select Case MSComm1.CommEvent
+ g; c8 f6 J/ }7 Y '如果有CT在感应区9 ?7 ]$ Q: z, ]7 Y4 D3 M
/ K, l* T) L. U* D( i
Case comEvReceive, W- p. k; J- F
inbyte = MSComm1.Input
[& ~3 x' Q6 V7 R4 \2 ? For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制
y, X ?: ] F ?- f5 R) C4 D revbuffer = revbuffer + Hex(inbyte(i))
. l @6 S) r- g Next i9 T/ [) n C) y8 u1 I" h2 v
txtHex.Text = revbuffer3 U7 ?" U* @: q$ Y: l
If Mid(revbuffer, 1, 6) = "480310" Then
/ D& u5 X& M6 o: ]; P6 X Timer1.Enabled = False
- V" m- w/ Q/ a7 s' G3 H Timer1.Enabled = True
: [2 [# g% j% e4 e" { End If
: O5 a4 }7 k, h: W End Select% d& ~$ s: w( r) ?$ ~ B
Case comEvSend# @! u- S# o( i' P7 M2 a' `
End Select
" u: G- f6 ^* Z5 S/ _8 H. i. m: sPrivate Sub timer2_timer()
7 X% F7 f; t/ t7 b" Z" L MSComm1.OutBufferCount = 0 '先清空缓存) w$ C* ^9 H5 s, s7 G1 }
sendbuffer = "R00000016U"
+ }5 c' m a# u; D* t* ] MSComm1.Output = sendbuffer( P# L! V+ p1 d% E( i: I
End Sub
3 a" X) U, r m/ e8 b0 u0 BPrivate Sub MSComm1_oncomm(): ~0 ~! M7 r. F2 [ F
Select Case MSComm1.CommEvent
' f9 W& l1 K4 a Case comEvReceive
' A3 m4 [2 K: d3 V( }" b6 C inbyte = MSComm1.Input" M) m: Y" @# b0 i2 U6 C
For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制+ ]. y7 \) K( E4 Y; x! b
revbuffer = revbuffer + Hex(inbyte(i))8 ~1 R2 `& J. R# ~
Next i
J8 a% \3 G- B txtHex.Text = revbuffer5 F. `/ r6 y6 [% l* A' ?2 B
If Mid(revbuffer, 1, 4) = "6030" Then
1 T8 g; F, ]6 V+ Y& p Timer2.Enabled = False/ x" E6 @+ B- ~1 ^
Timer3.Enabled = True6 i% y4 v: ]3 B9 t7 Y# ]- w
End If8 G* X$ d1 u6 }2 L8 f/ ]+ Y9 R
Case comEvSend) V; C: ~& @: a$ a
End Select
' X8 y3 ~2 J, r) K; w. z+ NEnd Sub
1 z. c, J. K2 J; j2 e6 lPrivate Sub timer3_timer()- V9 O) m" E `$ q
MSComm1.OutBufferCount = 0 '先清空缓存
* f6 ~! M* G6 y5 G F6 p7 }7 `4 e; ? sendbuffer = "STX"
* M5 @7 N1 D/ \9 _- n MSComm1.Output = sendbuffer
' H9 A: q2 p8 B& E- i Select Case MSComm1.CommEvent
3 a% i, {8 c1 u9 [4 u: ` Case comEvReceive
( O; M6 E0 \3 L5 L2 L o1 W inbyte = MSComm1.Input
6 K( d8 w1 N3 h- M; v F% R. I9 j For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制
& `) p4 e% E0 s8 A7 c- ?) D- S revbuffer = revbuffer + Hex(inbyte(i))% a2 j. k9 d" p/ x
Next i
1 V+ U1 W5 j- G, ~- U4 c, g! s txtHex.Text = revbuffer' C$ K" Z+ V+ e
Case comEvSend: k" E$ t* j' F
End Select
5 e1 I! G9 W# p' h3 |) {End Sub! w+ R n/ u5 w* _; q" g
# b8 R4 v R0 L& z9 r- u
1 W- B7 ?% \! F( z% p% D+ z! c" x) u- y* P+ w; c6 o1 {3 L; |
|