|
項目需要用MSComm控件實現(xiàn)射頻設(shè)備與PC的串口通信。先說一下設(shè)備發(fā)送命令后會返回的相應(yīng)的數(shù)據(jù):- u4 C: h. r) k1 {, r( b3 d
2 l* U4 [' d" N5 O當(dāng)發(fā)送命令"H!i"時,為尋找芯片。% A+ b$ ?/ q: y. [4 n( T
當(dāng)設(shè)備連接正確又無芯片在感應(yīng)區(qū)時,設(shè)備循環(huán)返回:0630 和 15374 b8 ]$ w1 ~; c$ W4 J
當(dāng)設(shè)備當(dāng)設(shè)備連接正確而芯片又在感應(yīng)區(qū)時,設(shè)備返回0630,稍有停頓,繼續(xù)返回4831+其他信息
4 X! R$ f( t2 z( v
1 t/ t$ F8 r: [0 {: {: i當(dāng)芯片在感應(yīng)區(qū)時,發(fā)送命令“R00000016U”,讀取芯片前十六字節(jié)數(shù)據(jù)0 @, B; F8 Y; y6 \3 }
沒有錯誤時,設(shè)備返回:0630- n- _# f+ L+ E/ ~
此時,發(fā)送命令“STX”,或十六進(jìn)制命令“02”
# @& M8 D- z ^7 v+ A3 P設(shè)備返回前十六字節(jié)數(shù)據(jù)
- ~7 h2 r! J2 ?7 w
v8 K/ I1 U* p之后繼續(xù)發(fā)送命令“H!i”,尋找下一個芯片5 y- m u0 ?7 Q3 _1 o8 R
--------------------------------------------------------------------
4 o# R9 F- {$ b. u2 A! @) N- }項目用MSComm進(jìn)行串口通信
7 y5 ] K5 H4 X0 t% S/ I5 E- @需要將上述幾條命令循環(huán)起來。我用的是比較MSComm1.Input是否為爭取的返回值“4831”和“0630”。* h0 v8 i; d8 g b" B
用了三個timer來控制三條命令“H!i”、“R00000016U”和“STX”的發(fā)送。把發(fā)送命令都放在了timer_timer下。
7 j' T7 l- C& k8 a. \% v但是這樣的話,就用到了三個Private Sub MSComm1_oncomm()。系統(tǒng)報錯,“發(fā)現(xiàn)二義性名稱”。意思應(yīng)該是不能重復(fù)定義Private Sub MSComm1_oncomm()吧?
1 Y9 a5 l$ ?# i N1 A6 [- N# @----------------------------------------------------------------------------6 g. w; m* G% {6 q$ ~: E- M
其實程序說簡單些就是:4 I1 K( v8 h% N0 K, ^1 @0 Q
發(fā)送命令—>從數(shù)據(jù)返回區(qū)判定->發(fā)送命令->數(shù)據(jù)返回區(qū)判定->再發(fā)送命令->接收數(shù)據(jù)" J1 p+ r: M$ T& H: f
這個循環(huán)要怎么實現(xiàn)呢?2 R4 v p/ n% C- H
先謝謝各位!- U" r8 B/ H @. V' o: f
' a* }+ @$ G0 }7 T
--------------------------------------------------------------------
. s) \ G, _/ t( z2 v+ E) n8 n下面是循環(huán)部分的代碼。系統(tǒng)報錯
6 l3 n! r6 }" M6 F; JPrivate Sub cmdStart_click()+ x% c3 @+ f- h3 @$ M
Timer1.Enabled = True! y( b& ` ^& L+ x/ b
A. a% b# M: p) h1 p
9 Q$ R, a( E( V' [% N6 ?' G
4 w% G( H6 O/ ~End Sub
, U& R0 J, O3 W) G+ s# l# M& Y4 TPrivate Sub timer1_timer()( N O/ M0 G* u7 c$ e, U
" {" P. ^9 p+ \; x$ M% m9 u( B
MSComm1.OutBufferCount = 0 '先清空緩存
: X+ V# K) V# H. h$ v: Q% I sendbuffer = "H!i"
! ?& w' ?" `; O6 n& z" I0 b MSComm1.Output = sendbuffer& k, U) r+ x ~9 V7 @+ P% z
End Sub
+ l$ b6 l5 ^ U6 x" U'結(jié)束6 f5 J/ S& t& I. G7 a* e, Y! j
Private Sub cmdStop_click()5 o# V( ]: M7 K, d5 f' l, J; K# Q
Timer1.Enabled = False! Y+ G7 u6 I6 Z* x) ~
Timer2.Enabled = False. P+ L3 x7 S" l" ?$ Q1 z
Timer3.Enabled = False4 M4 ?2 B* d' k$ y3 S l
End Sub8 K l2 a* @) b# q! Q+ b- q
* ~! u% }7 i0 O! E2 K- d
'接收數(shù)據(jù)5 a( R/ G- g! i
Private Sub MSComm1_oncomm()8 @' B5 ]" q+ U9 G3 [
Dim inbyte() As Byte
- J' T9 W+ Y4 T& G! i Dim revbuffer As String/ m$ `. V1 W7 |5 ]1 j: v
Dim a, i, b
0 }: n1 n/ J; f Select Case MSComm1.CommEvent. g6 p4 z( Q, a! m8 q
'如果有CT在感應(yīng)區(qū): h$ r- o/ \& x# c
: R2 V# z# f( G4 c' V- C4 @- O/ |, H Case comEvReceive
* \% w3 l* b% S inbyte = MSComm1.Input
2 Y1 G1 o2 Z0 o) c For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉(zhuǎn)換為十六進(jìn)制7 {; J( y2 o/ `6 Z9 J% i
revbuffer = revbuffer + Hex(inbyte(i))
, p W% ]& O+ f2 ]' q Next i
# F7 {2 M- T/ t5 D4 d4 w txtHex.Text = revbuffer
$ M! `4 ~- E! Z& D$ q5 c- S# Q If Mid(revbuffer, 1, 6) = "480310" Then" @& _. y- N" F
Timer1.Enabled = False
6 y) C4 V' c" s1 G/ j Timer1.Enabled = True
% Y: @0 s9 s% T6 v, q End If8 u R. p8 c- r/ z
End Select3 \- p# d" B t& _+ i9 C
Case comEvSend
6 `) d( h/ z) I, r2 B3 _: ? End Select
. J8 A2 u8 e" c0 z9 sPrivate Sub timer2_timer()
/ J2 ~# I5 }- t MSComm1.OutBufferCount = 0 '先清空緩存! [* p' ]6 G4 }( h( c
sendbuffer = "R00000016U"# f$ g0 X' ~* e+ R+ m& b: t' R
MSComm1.Output = sendbuffer' C" b% C0 r% L( q. \- r, I# C4 |
End Sub' Y9 W' Y! |- u
Private Sub MSComm1_oncomm()
2 o, a7 s W- J2 V) ]$ c Select Case MSComm1.CommEvent- R& y& x+ |9 d/ E; h3 i& q+ k
Case comEvReceive
) \) T; ?0 Z T9 A c6 b0 {: U inbyte = MSComm1.Input. d, U$ t) ~/ Q6 {) \# K: W) L
For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉(zhuǎn)換為十六進(jìn)制8 P4 r2 U$ k, |; `9 A ]
revbuffer = revbuffer + Hex(inbyte(i))
) p" c" o& P8 T4 i1 Q Next i2 d4 x3 X! A2 t9 y4 F
txtHex.Text = revbuffer
% r8 U t2 Q/ n4 g If Mid(revbuffer, 1, 4) = "6030" Then
1 s5 L( p( [5 B* w" _1 b Timer2.Enabled = False
2 z. g, ^$ v' G( f" f/ Y9 W- `( s Timer3.Enabled = True" J: l9 ]: P% w$ X
End If' m# L( B5 \8 N) W; i
Case comEvSend' }( E$ P7 v8 G4 [ }
End Select' u0 M$ H- Z& y& G6 |- m: Z
End Sub
- |" a4 @% K5 O) C3 t4 u) hPrivate Sub timer3_timer()
v8 e8 H! Y- G4 S MSComm1.OutBufferCount = 0 '先清空緩存
3 s$ h/ b, ?; g+ v5 H# O) Z3 q sendbuffer = "STX"
2 L: M" x% n; E! j$ Y: X- o MSComm1.Output = sendbuffer5 ?; }) ]# u+ S' \! c' @7 {) N5 h
Select Case MSComm1.CommEvent/ L+ w, C7 A4 {$ I, e' O
Case comEvReceive
4 d! F- T/ p* b% [9 ~3 R3 ]; p+ t inbyte = MSComm1.Input( r- w9 K3 |: l! w
For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉(zhuǎn)換為十六進(jìn)制
: i2 o9 a" C+ b+ W, x) X6 ` revbuffer = revbuffer + Hex(inbyte(i))
0 h2 e& L$ M* l4 [' q Next i9 |; O4 A2 p9 c
txtHex.Text = revbuffer Z& y# R% N8 c
Case comEvSend; _' N \, _3 D9 B) [4 `
End Select( M: ` P4 u' d! b* V
End Sub0 @& f. `% @8 E
0 r- t# J5 M+ y) m. G
" c ^8 v5 K1 A: \! e
* {5 Q& z) P* [% Q' } |
|