项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:6 F2 D- _$ c% X& l3 v. C, {
. k* U" @7 T( R. c! O+ m; |
当发送命令"H!i"时,为寻找芯片。/ A) ~: c; |6 S1 H" o
当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537/ p6 j( c# @# \" b6 _5 g6 L
当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息" a$ D- n i( N- ]5 a5 L) W
5 G+ v* M: x* t7 x( J9 t5 g" g. V
当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据; I" i1 ]- Q: l' _2 H: d. Q8 c% Q
没有错误时,设备返回:06301 n# l* E3 x# P; H
此时,发送命令“STX”,或十六进制命令“02”
6 U5 i# c! @+ m8 Q' @& j0 S7 W设备返回前十六字节数据
. @' j3 F0 n% Q: ~" U& \5 S5 F
5 p# U& g6 [0 U |( Z1 r之后继续发送命令“H!i”,寻找下一个芯片" b, n3 f- A; }1 f: b& W+ {
--------------------------------------------------------------------5 c2 Y. L; P# M& I+ j' i
项目用MSComm进行串口通信
9 y" h, [5 ^( u. d6 R( \需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。$ `! j" E& j$ K$ g/ w
用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。
5 Z% s; d/ ?+ b) B但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?
! ]. F( f3 A& R4 @ b) k----------------------------------------------------------------------------
6 H$ V/ G& A9 v: G其实程序说简单些就是:
( t$ _: A# @$ r9 Y发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据
* n) y- m# e0 x这个循环要怎么实现呢?5 y2 s# t7 ~* B8 j# z" a" L. z$ L- ]
先谢谢各位!# P |3 P& P, t0 A
& x; @6 X2 T& W3 A9 }' Z, x--------------------------------------------------------------------; p7 K( i6 X% V8 R$ O
下面是循环部分的代码。系统报错
- n" m3 m( s+ {3 y- y/ U8 y+ Y- uPrivate Sub cmdStart_click()$ {2 V3 B9 q( N7 @0 w. d U
Timer1.Enabled = True
@$ l2 I2 G \5 g, e) [: ^ 8 _" g4 S3 V& d- r* {- O
) k, i# w. E7 a; K6 K $ l; H# Z8 e# J
End Sub
) l5 {2 i, m/ B/ b6 v! rPrivate Sub timer1_timer()
/ ?, ~4 j5 j7 n* i) l% J0 r; g2 M % e0 x+ V" ]4 z% e/ y
MSComm1.OutBufferCount = 0 '先清空缓存
, {3 ?. b3 N2 s% u7 f sendbuffer = "H!i") D b' }( s7 \2 [5 w, H( [" z
MSComm1.Output = sendbuffer
+ Y. F% m* ?6 \End Sub0 u* e0 e9 j3 Z# ~
'结束" J: f7 B# w, S. B$ I2 q
Private Sub cmdStop_click()) k9 h3 u9 k; L6 N9 E/ d" l9 r
Timer1.Enabled = False4 R, D+ b- P0 b3 T6 }% m8 P
Timer2.Enabled = False
6 E3 c' y2 E. t/ e6 M% C Timer3.Enabled = False# |6 Y7 c0 M, D4 m9 I" W: w
End Sub) g6 A3 O+ k3 `4 Z8 C* n% w- r0 Y
* c6 U3 Z% m, B4 |) K
'接收数据! [0 I9 y" @3 ?
Private Sub MSComm1_oncomm(): z/ o) w% O U6 c/ r0 a
Dim inbyte() As Byte
6 k' ^* h0 b2 f7 a Dim revbuffer As String# d% Z% l ]' k5 ]$ p! K: B; _
Dim a, i, b6 `2 m- |! |6 Y! A$ b
Select Case MSComm1.CommEvent+ {1 y9 E. k; e1 y
'如果有CT在感应区
+ q$ u; k- e% i, m5 ^5 S6 f) f$ Q0 z( L + [7 R. R/ X+ Q ]7 h1 t/ | @
Case comEvReceive4 s$ o/ K1 h! S/ Q* V; b
inbyte = MSComm1.Input* ]/ T* B+ {* g/ y; l6 X; P
For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制+ D: Z/ z4 Q% u
revbuffer = revbuffer + Hex(inbyte(i))
]) ~, F8 l. y W: g2 v* [ E Next i% K' B9 \; D5 Q' S& D5 k! X4 k
txtHex.Text = revbuffer# _ A1 C# P+ B6 G9 R) H
If Mid(revbuffer, 1, 6) = "480310" Then
# S" y3 B$ f; T# O Timer1.Enabled = False( g4 v& Q1 Q# l9 J6 ?$ G
Timer1.Enabled = True/ B5 n% y2 A T) e2 [2 r
End If- z$ ~, N% Y2 S+ h% b
End Select: t" w9 X3 J' S
Case comEvSend I% l7 A9 I/ G$ D0 _% ~. O& s
End Select
/ c/ p$ d2 ]6 Z. OPrivate Sub timer2_timer()
) Y! b& a; g i2 _* ^ MSComm1.OutBufferCount = 0 '先清空缓存
$ x# K0 j0 I: ^ sendbuffer = "R00000016U"
: x0 x: | a2 u0 M: Y3 p2 k+ @ MSComm1.Output = sendbuffer
3 @/ t; s: T( s+ \' @5 I3 I' @End Sub3 f6 G) s# W, `7 _ `* g
Private Sub MSComm1_oncomm()& v" g- V( m/ g3 D4 h
Select Case MSComm1.CommEvent# n, B( H% B% t: }/ F
Case comEvReceive6 i# \+ \/ A/ T8 G! C t7 n% L2 U
inbyte = MSComm1.Input
# d# c5 t0 A. h; y For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制( X& o- Q: T8 s
revbuffer = revbuffer + Hex(inbyte(i))) i0 h: n0 H' L/ B3 s) D- l. x: V" Y
Next i
+ H$ ~( x* C" ? txtHex.Text = revbuffer; ?+ V* t0 v. J7 u2 C* P% H
If Mid(revbuffer, 1, 4) = "6030" Then
' E1 T8 P+ `9 t6 { Timer2.Enabled = False# \& r5 S3 b/ f! A! ?( y; g& r
Timer3.Enabled = True
- k3 y5 U3 N+ a: ?& T8 m N End If; s' U# k9 H+ o5 f" ~2 N" P; w J
Case comEvSend5 Y" B0 A5 l1 z+ H+ k- L+ _
End Select
$ W9 n6 u5 |4 h* p iEnd Sub+ j! Y" E( M) R# {' b
Private Sub timer3_timer()4 g7 o4 Z4 q+ M" G$ Q
MSComm1.OutBufferCount = 0 '先清空缓存
5 U* ~1 x0 L& t sendbuffer = "STX"; q! X6 a1 q8 A2 g, h: e2 i" j
MSComm1.Output = sendbuffer
4 |& y" w8 `6 Y# D Select Case MSComm1.CommEvent
6 |4 e) H1 ~. Q% ~8 l0 b6 V# k$ c2 F Case comEvReceive
/ {0 E p! H! j inbyte = MSComm1.Input
. K- U( ?4 t& S7 ] For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制
. u$ g: P) a1 z/ N. J- z; F revbuffer = revbuffer + Hex(inbyte(i))2 P* m: ?1 Y( P0 s' T' R6 }
Next i6 u* Z. k4 A; }5 x+ d9 m5 G
txtHex.Text = revbuffer
2 p5 e$ G7 W: b& ~, s Case comEvSend6 t5 s3 \9 ?9 J5 z: ~$ Y
End Select
6 n" C- g0 x8 k+ f% rEnd Sub
6 T: ?6 K0 ^; T1 E+ S2 ^; d1 d* @0 J
/ o& z2 s6 M& d1 f, s {: v' H
$ ?0 ^# F8 \ n! {) Z" w& Q
) F l/ C* i/ f* |" { |