项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:
' b: A; Y4 r6 @/ y' v3 _, i; M
( a7 N5 D5 I9 S8 ?# i当发送命令"H!i"时,为寻找芯片。
; F+ S' z9 q4 |当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537
! ~1 i, X# F. \9 q7 C: p, Z; Z, k当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息2 @! M/ K2 W2 @: J3 Z4 b9 C$ O0 U
5 i& f. p% {9 C- }! ?. B
当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据2 l# D8 M+ `- g* ?6 P/ B
没有错误时,设备返回:0630
1 c) z, v. k, u7 q. W6 `3 \此时,发送命令“STX”,或十六进制命令“02”+ A$ q3 X5 ?, F- J+ t- s
设备返回前十六字节数据5 }! d% o8 R( e, Q% ]
: ^( F6 P O* V1 g$ J$ R之后继续发送命令“H!i”,寻找下一个芯片5 @1 n4 \; ?; S+ C2 H# C
--------------------------------------------------------------------5 X( T! o2 H! ~1 x
项目用MSComm进行串口通信9 _' j/ K$ K/ }% N. i$ c
需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。5 d) d2 V) }* ]5 f" d. U
用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。
2 W; w8 c# i# ~- K4 q但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?
* x# W3 m4 f& u/ @" j. n6 s----------------------------------------------------------------------------) m5 H, ?' s7 v. |
其实程序说简单些就是:
1 G% O0 E% V3 B/ B发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据, G6 u; [) j" ~1 q% ]1 V
这个循环要怎么实现呢?
* R* x- z6 y0 |: m3 ]. b5 P/ n先谢谢各位!
. n0 M, m a* _# I$ [! P H: n/ p1 t0 }. O
--------------------------------------------------------------------
6 c9 [$ @& K: Q7 S; d下面是循环部分的代码。系统报错
! s( Z' }0 A4 k7 F5 r2 fPrivate Sub cmdStart_click()
/ v, d2 p9 E ]; [; ` Timer1.Enabled = True
6 e8 ~9 M2 \# H" L: `
4 a- `0 n* @# H3 e1 J% n
- G* n# l8 ~6 e8 w/ V
3 u) ^* ~! R& S8 LEnd Sub: n: K" J7 h7 n7 @$ K& A2 s% b
Private Sub timer1_timer()* d2 b0 [. c/ c/ s0 L
' L/ K: m- J. F MSComm1.OutBufferCount = 0 '先清空缓存6 l! W! [6 j! [) r& @* H" P+ ~
sendbuffer = "H!i"
* b) Y. l5 j4 A6 j MSComm1.Output = sendbuffer9 @. [ F' k5 k' A3 X
End Sub }: I: @) i2 w* g
'结束( Y7 m& a* h7 R( R) { C. l3 v
Private Sub cmdStop_click()( l0 x2 n. l x
Timer1.Enabled = False
3 V3 m8 i( M7 l Timer2.Enabled = False
2 T* i5 i( V3 @* a) w+ J( l$ e Timer3.Enabled = False
) B# \& {* P _& z& Q9 `! @+ MEnd Sub
% F4 g! X) d! j1 c% U0 V; i( e4 S5 c7 _; e
'接收数据
9 G$ q6 p0 d% K! r$ J1 e! u0 iPrivate Sub MSComm1_oncomm()
3 M2 \) G( I' s) F/ [+ [; o q Dim inbyte() As Byte0 u( J! B2 j: Q5 o4 K% N
Dim revbuffer As String1 M/ P5 l& U3 e2 ]
Dim a, i, b1 o! g/ ?7 U" {9 F( d0 b' h
Select Case MSComm1.CommEvent
# H2 a4 r% L: M '如果有CT在感应区1 V) ]7 ?2 G$ S5 K+ t+ t9 A
: g; u5 l h" g) U. T" {' W" t- S# q
Case comEvReceive; ~4 K) K; l2 J b Z* `
inbyte = MSComm1.Input
! V; X7 p$ c# f& y For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制/ q {& p& e- }
revbuffer = revbuffer + Hex(inbyte(i))1 Q+ s5 M M9 p* R X! U; b
Next i
j! f. i( p4 I; ]/ X2 B# | txtHex.Text = revbuffer
# f2 S& W* {2 ^! i# s4 G4 I If Mid(revbuffer, 1, 6) = "480310" Then
" e5 g# Q0 x7 H* Z1 [' U8 ]9 s2 ^ Timer1.Enabled = False
/ a8 M9 t: a, v) h. i+ c2 [# C- j* P Timer1.Enabled = True( Y2 \7 \4 g4 W: `" T$ \3 k. h
End If! O. k4 I4 ^: X( G% x& m! [0 {
End Select
, ]. O, ~+ ~2 H5 ]7 U% |9 ]# F* m Case comEvSend
( t) Q6 N5 e! }& ^& K/ i9 r End Select' V& X7 X0 h4 d( R8 q) m1 N- |
Private Sub timer2_timer()1 v" D W1 t3 z: Q4 A' N8 L5 P" l
MSComm1.OutBufferCount = 0 '先清空缓存1 m6 M. W- T/ m5 y) Q9 U" w/ x
sendbuffer = "R00000016U") t1 |; \6 M( t% h* i" h8 h! J+ \/ R9 A
MSComm1.Output = sendbuffer
4 h' l4 U( B' ?: e. W) H1 HEnd Sub/ g. e h% z9 k0 @
Private Sub MSComm1_oncomm()
# X" y2 [! P5 Y6 U m5 K Select Case MSComm1.CommEvent
* c" p5 ?; \ w( R+ X5 D Case comEvReceive' A# f U- G% ]7 e
inbyte = MSComm1.Input7 o$ f( P4 L4 l v) D
For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制5 W2 @( t3 c2 Z. C, ?. Z" m1 q4 i% x
revbuffer = revbuffer + Hex(inbyte(i))8 @; L7 n) }& _7 {+ {
Next i
5 V, T& L X7 Q7 a& I1 G) J* a txtHex.Text = revbuffer+ @4 |/ B1 l/ K) y' Y. h
If Mid(revbuffer, 1, 4) = "6030" Then W4 s. c8 G5 r7 x( ]$ L; _
Timer2.Enabled = False! r/ v% G! p1 o- A$ X3 j1 E
Timer3.Enabled = True9 E( f& h$ V9 I% I
End If$ f& r1 R- {9 e8 G/ a6 k
Case comEvSend/ t1 y% m1 m X0 L/ }
End Select& W( D" M1 ^- `) N, ^
End Sub/ ~3 {! n6 P8 B3 \4 n
Private Sub timer3_timer()& u( ?& ~# W( S, G! `
MSComm1.OutBufferCount = 0 '先清空缓存 D3 i& i8 C' x$ Y( [# y6 |( i
sendbuffer = "STX"
: d1 b3 @! m4 _ MSComm1.Output = sendbuffer
/ ^: l" d4 e5 j4 Z& _, r6 N5 h, A6 x& l Select Case MSComm1.CommEvent% a" k8 \ b1 M3 t
Case comEvReceive
3 z7 O4 l. U2 C+ t" G0 y) R inbyte = MSComm1.Input6 E/ e! k# B& S9 @. I3 u
For i = LBound(inbyte) To UBound(inbyte) '返回数据转换为十六进制
' x7 b8 p! ~( p+ J5 W" {. X- y V/ T* c revbuffer = revbuffer + Hex(inbyte(i))
7 }9 k% z/ g! Q7 k) Q9 r1 f G Next i
$ c. X' d/ O# ]4 g0 v txtHex.Text = revbuffer
) j/ n) ^# ~) b Case comEvSend
5 F2 ?5 o% u( _ End Select( J. P6 E. j' v( P% H+ r
End Sub. C1 D8 B5 g" d0 ~; { m9 h6 p
7 p4 S8 j! y6 r5 ^. ]1 @& b! O
+ w( s( ~' @# }7 A4 C+ a V7 \
. S6 j3 m+ S1 w: {, C+ K Y: i. Q |