項目需要用MSComm控件實現(xiàn)射頻設備與PC的串口通信。先說一下設備發(fā)送命令后會返回的相應的數(shù)據(jù):
3 J0 ]" X/ r9 k2 H7 A' X- K! Z5 b4 c1 o9 e4 I
當發(fā)送命令"H!i"時,為尋找芯片。
1 `" i) }& m3 ^; n. N3 ^' _當設備連接正確又無芯片在感應區(qū)時,設備循環(huán)返回:0630 和 1537+ K6 G9 P s' W1 j% o
當設備當設備連接正確而芯片又在感應區(qū)時,設備返回0630,稍有停頓,繼續(xù)返回4831+其他信息' N( J6 o2 z7 `; p/ @1 ]
8 Z! A0 I9 h/ t$ ^1 J7 ]
當芯片在感應區(qū)時,發(fā)送命令“R00000016U”,讀取芯片前十六字節(jié)數(shù)據(jù)0 F/ J9 N! c1 b6 w; H
沒有錯誤時,設備返回:0630
, u& j6 ]6 n' v" U, y# n% x此時,發(fā)送命令“STX”,或十六進制命令“02”
/ H6 v3 Z- H3 {! d設備返回前十六字節(jié)數(shù)據(jù)9 V e( _- z! @
; ?" i2 H6 q( a& g1 v4 ?* M
之后繼續(xù)發(fā)送命令“H!i”,尋找下一個芯片
8 D& }/ D. M+ K0 p- L--------------------------------------------------------------------" J" b/ `' `3 _0 ~& W# f" t, _
項目用MSComm進行串口通信
) c, W4 I. g- b) f需要將上述幾條命令循環(huán)起來。我用的是比較MSComm1.Input是否為爭取的返回值“4831”和“0630”。
2 X p& x6 `8 ~4 g5 f用了三個timer來控制三條命令“H!i”、“R00000016U”和“STX”的發(fā)送。把發(fā)送命令都放在了timer_timer下。" _6 w S6 V+ M# n$ H
但是這樣的話,就用到了三個Private Sub MSComm1_oncomm()。系統(tǒng)報錯,“發(fā)現(xiàn)二義性名稱”。意思應該是不能重復定義Private Sub MSComm1_oncomm()吧?& `, H) [( Q% z' i. s1 ~
----------------------------------------------------------------------------( |* C2 }. T w; A& X* y5 Z
其實程序說簡單些就是:$ J1 v; W4 \0 ~* i! f6 @$ V
發(fā)送命令—>從數(shù)據(jù)返回區(qū)判定->發(fā)送命令->數(shù)據(jù)返回區(qū)判定->再發(fā)送命令->接收數(shù)據(jù)
; S+ F% a4 G6 N6 z" w這個循環(huán)要怎么實現(xiàn)呢?2 C, h* w0 B, t" c
先謝謝各位!
1 P& K/ D/ S1 y( l1 a7 ^# `5 n( ?1 x7 @! A, F0 U9 g
--------------------------------------------------------------------
' \3 U" h& O ?6 \* j下面是循環(huán)部分的代碼。系統(tǒng)報錯$ P: R' f- M# f3 c* K A
Private Sub cmdStart_click()
! E6 x0 b/ v% t Timer1.Enabled = True
( G/ ~" b9 m5 ~ : T C3 }6 U, D2 F$ N$ I6 w h- N
& p" n) e9 Z) Q* T' Z% d# { ) Z" ]) f7 T4 ~3 g: ?
End Sub
% y; M5 x! g) r6 P; vPrivate Sub timer1_timer()% g1 \7 m$ k( {; a
! y+ {+ R" R c4 g: e& Z, l MSComm1.OutBufferCount = 0 '先清空緩存
k" X9 `) m6 b7 x4 A* J- \ sendbuffer = "H!i"- X, ] h) W) }3 H0 c6 {
MSComm1.Output = sendbuffer" t% n1 `2 A" v4 b, o
End Sub: L7 N6 s8 h: `
'結束* I+ o6 F- U4 R$ l1 X
Private Sub cmdStop_click()) c9 I5 T) S6 P( i E j! N
Timer1.Enabled = False \% [; i" x' Q1 d9 E& g$ x
Timer2.Enabled = False
0 N1 `7 R# x( x! c) G0 h+ w0 d u Timer3.Enabled = False9 B0 ~+ @, P3 W% b( j
End Sub
& `6 z) L9 J7 r% L+ `( S2 K) o+ s
+ a" |" f3 Y% @. @4 r'接收數(shù)據(jù)
+ N$ J' H. i( E8 v* J& yPrivate Sub MSComm1_oncomm()
/ q2 m w; \6 P) ?1 ]+ }! N Dim inbyte() As Byte
, N; l [1 x3 Q; l+ M Dim revbuffer As String# A- o* y( M: H+ ?
Dim a, i, b1 F5 S( ~2 A8 o8 b1 v6 y+ R
Select Case MSComm1.CommEvent
* [" {0 D4 c9 y2 O '如果有CT在感應區(qū)( Q2 E, c9 r! x( M& _4 V- c
* N. m4 E! u2 j6 h/ r# M Case comEvReceive" d4 s! e! H2 q' K4 x
inbyte = MSComm1.Input7 J2 U8 i. d/ H. m$ ]" J. i+ u/ x/ O m
For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉(zhuǎn)換為十六進制0 R' c4 w3 `- U; x) R( J' X
revbuffer = revbuffer + Hex(inbyte(i))4 M' ?( K; @; r3 F5 n
Next i y) @( s$ T3 n) _ ^0 j% y
txtHex.Text = revbuffer9 i' w1 ]$ i' Y- g. q0 [1 Q1 M
If Mid(revbuffer, 1, 6) = "480310" Then
! `0 L/ h8 h2 ] Timer1.Enabled = False, y, U/ S% _! s8 J+ u
Timer1.Enabled = True; R. O% ]& Z/ I+ K0 V) u7 X
End If
1 l, B/ h: r, _' e End Select9 f0 H3 Q% N3 ?( J! J- q c4 b8 q
Case comEvSend: e6 Y3 w( l/ q+ u9 Q/ ?( R
End Select
' \& [; a9 z$ B; YPrivate Sub timer2_timer()
, Y; |" s4 p" A' E9 s4 f# W: W MSComm1.OutBufferCount = 0 '先清空緩存0 O, d& u6 I! J9 |( d I
sendbuffer = "R00000016U"
: p* t4 L1 e* ?. j4 b. Z I MSComm1.Output = sendbuffer
5 q& ]8 r6 Z) [: }3 cEnd Sub
2 z: ], h' d; i3 y5 e' k4 sPrivate Sub MSComm1_oncomm()
3 Q4 f7 l9 [" a" E Select Case MSComm1.CommEvent( }; g! z% D8 o
Case comEvReceive. P/ I, q! V5 A7 X! i
inbyte = MSComm1.Input
- U: R, Y; X1 Q; @- v For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉(zhuǎn)換為十六進制- i5 b6 q& ~% Z: M5 T4 X
revbuffer = revbuffer + Hex(inbyte(i))
6 g, C/ N4 A/ J+ b Next i
5 } X. }/ }" n! M9 k) r0 y txtHex.Text = revbuffer" c5 W! I, R$ d% j5 h% I0 j
If Mid(revbuffer, 1, 4) = "6030" Then% X8 t& ?: M3 |* H+ e
Timer2.Enabled = False
( ]0 S- Q& q1 W Timer3.Enabled = True# j% y/ G A! i3 p; B
End If( D2 m$ ^6 ~2 t/ K: |3 A
Case comEvSend9 j/ R' a8 B4 l: N B: j6 V2 M& a
End Select) q( N+ r: Y9 \/ j5 \
End Sub
8 }( q9 `5 e, i+ ~. _Private Sub timer3_timer()1 e. o; m( O0 E$ ^% B
MSComm1.OutBufferCount = 0 '先清空緩存# ~. t) ~1 @ |8 O& d
sendbuffer = "STX"
8 ?! ?" Q. }. |/ `7 g1 {$ M MSComm1.Output = sendbuffer, C9 C! u( X" E1 @
Select Case MSComm1.CommEvent
9 x) m( @" q+ K( d0 E7 G Case comEvReceive( Q+ K# Y4 R7 j" \) \
inbyte = MSComm1.Input
# q5 c: S3 u \ v8 I8 w: H For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉(zhuǎn)換為十六進制
1 e2 o9 V5 K* [: Y( C! r, L6 L: Q$ i revbuffer = revbuffer + Hex(inbyte(i))
~! {7 w, f4 T3 e5 ?0 z Next i
& j; }0 F% U8 F& c3 Q1 [ txtHex.Text = revbuffer" |/ }/ Z! q( n
Case comEvSend
3 A+ x' c* X; S% }7 ] End Select, d( H" {' ]7 y% x
End Sub3 \0 S& v4 e( J* X9 S; S
) z/ ^% z2 u; V' E3 |
& V& y& M' q& R9 D8 B$ w$ D
8 @2 I, {* m. ~* T$ F% V; |8 S
|