|
項目需要用MSComm控件實現(xiàn)射頻設(shè)備與PC的串口通信。先說一下設(shè)備發(fā)送命令后會返回的相應(yīng)的數(shù)據(jù):
" \: @8 [, o+ F$ Z) n h7 { g+ _# T& x$ @( v
當(dāng)發(fā)送命令"H!i"時,為尋找芯片。
+ I1 H/ ~+ F- D# p/ I Z當(dāng)設(shè)備連接正確又無芯片在感應(yīng)區(qū)時,設(shè)備循環(huán)返回:0630 和 1537" A0 V" L, A3 m; Q1 x
當(dāng)設(shè)備當(dāng)設(shè)備連接正確而芯片又在感應(yīng)區(qū)時,設(shè)備返回0630,稍有停頓,繼續(xù)返回4831+其他信息4 X; w8 N$ C- K5 N9 y# u/ n
4 D" c7 U8 d. Q3 H6 G7 E
當(dāng)芯片在感應(yīng)區(qū)時,發(fā)送命令“R00000016U”,讀取芯片前十六字節(jié)數(shù)據(jù)
; l3 \7 q& \" S% n' D沒有錯誤時,設(shè)備返回:0630
* f+ P5 }- O; J2 u% R: ?; a- B此時,發(fā)送命令“STX”,或十六進制命令“02”
) R- x ]2 ]. c% V5 e設(shè)備返回前十六字節(jié)數(shù)據(jù); u, \! Z7 ^$ G- x
5 c2 T7 d4 G: X6 c之后繼續(xù)發(fā)送命令“H!i”,尋找下一個芯片1 g/ @2 {( l: s5 y; k
--------------------------------------------------------------------
6 e; X" A) j+ ]" L% {項目用MSComm進行串口通信
+ s \0 j8 M8 w2 t9 q需要將上述幾條命令循環(huán)起來。我用的是比較MSComm1.Input是否為爭取的返回值“4831”和“0630”。; ~$ d/ F+ L* ^* e1 U* C
用了三個timer來控制三條命令“H!i”、“R00000016U”和“STX”的發(fā)送。把發(fā)送命令都放在了timer_timer下。
# |" L: U% L; q- x6 C) j" W但是這樣的話,就用到了三個Private Sub MSComm1_oncomm()。系統(tǒng)報錯,“發(fā)現(xiàn)二義性名稱”。意思應(yīng)該是不能重復(fù)定義Private Sub MSComm1_oncomm()吧?7 H8 ?( q2 w! d$ ^! T, z
----------------------------------------------------------------------------% T( u& C0 l. J! Z' P4 B
其實程序說簡單些就是:
) r: Y- H0 e+ Y* p3 ]- ~5 s發(fā)送命令—>從數(shù)據(jù)返回區(qū)判定->發(fā)送命令->數(shù)據(jù)返回區(qū)判定->再發(fā)送命令->接收數(shù)據(jù)
; Q9 p, y: Y% \/ K1 O/ r# l2 @這個循環(huán)要怎么實現(xiàn)呢?
2 y3 R: l' c8 F; p" Y. V先謝謝各位!
! r1 {) Y I* _4 y. N
) B- C8 F. c- H" l--------------------------------------------------------------------- m0 E9 `9 b! j4 H
下面是循環(huán)部分的代碼。系統(tǒng)報錯
% k4 H: ^2 a, M4 Q) r, z! `4 ePrivate Sub cmdStart_click()
9 n5 K5 B4 z6 i$ r T* F* B$ Q# M Timer1.Enabled = True( y4 O0 l4 D3 E3 V I3 V" @/ Q
' S1 \4 K$ d! }$ m- e
. x J3 @6 W% h0 F
! F$ N( S& L7 f% A9 X+ T1 r' d Q' QEnd Sub
, a) z& X* z! ]3 c* D1 EPrivate Sub timer1_timer()
, ?3 E; g) n0 K4 ^- O
, }5 u8 H* l, B; S MSComm1.OutBufferCount = 0 '先清空緩存
! a! U+ n4 b# E4 M; ?- Z sendbuffer = "H!i"; S' N! h9 p4 `
MSComm1.Output = sendbuffer
8 O1 J* `/ G+ v, kEnd Sub
# h# c6 m' z* g) U5 a/ L'結(jié)束
) P6 r7 ]) }+ p+ H* GPrivate Sub cmdStop_click()$ L6 m& Y: `% J( w
Timer1.Enabled = False- g+ @: a# I$ J) _9 f/ x/ L
Timer2.Enabled = False
& k' _! U# F9 G8 ]0 C6 s$ d( ] Timer3.Enabled = False
" J6 w! j8 H2 V0 R5 L7 \, @End Sub
& W9 i q- H n- p
9 \2 f8 q. y1 ~# i" E; L'接收數(shù)據(jù) |2 F" Y+ a5 p0 C
Private Sub MSComm1_oncomm()8 l8 Y* _6 E+ g2 T7 ]
Dim inbyte() As Byte/ M. _8 z# T: C- b
Dim revbuffer As String& @& C. H' E" ]+ ?7 W( W
Dim a, i, b' X5 p4 v7 a6 y1 l' K+ Y0 U' C( o
Select Case MSComm1.CommEvent
- C9 f0 B$ f2 Y1 Z '如果有CT在感應(yīng)區(qū)
5 p: R0 X- g* u9 }0 {* f& D
4 F2 i1 X3 M- V! v% x' j0 y/ P Case comEvReceive
# {6 }! {1 k4 g) k5 k6 l& z6 s inbyte = MSComm1.Input+ m6 B c( W6 A1 z
For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉(zhuǎn)換為十六進制
7 r5 L% t3 } i revbuffer = revbuffer + Hex(inbyte(i))
6 o- }; ?. a" r( H8 ? | Next i+ A$ k5 W: @9 X4 C: O
txtHex.Text = revbuffer+ U4 i; _% N# f( C! b
If Mid(revbuffer, 1, 6) = "480310" Then3 Y) D! u/ \) t: c8 I8 H1 \
Timer1.Enabled = False/ D; v$ c, s" c: [% b6 \' y6 z
Timer1.Enabled = True
( O2 W" R6 D1 |/ ?( e; K End If
8 p( l( N* o* q8 V End Select& H5 b) d) c0 h( d# \9 P' _
Case comEvSend2 @/ k, b" O; O: p% t5 ^, e& Z5 H
End Select/ Y& f: T% ]9 s
Private Sub timer2_timer()! @5 ^1 k# y& ?% f9 C; G
MSComm1.OutBufferCount = 0 '先清空緩存( x8 b- F6 N3 L# T6 y
sendbuffer = "R00000016U"/ G# {$ i7 \" c' N$ t
MSComm1.Output = sendbuffer
" L4 d+ S+ w# Z! A+ s* ?" XEnd Sub
0 S A) q) [3 h! v: kPrivate Sub MSComm1_oncomm()3 s# P( Q. H' c
Select Case MSComm1.CommEvent
C5 Z' H2 F7 G Case comEvReceive$ c7 y7 W; O# p7 j( b
inbyte = MSComm1.Input2 Y7 H$ m! J" ^" O# X' ]
For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉(zhuǎn)換為十六進制5 ~ s6 U+ i' U3 b
revbuffer = revbuffer + Hex(inbyte(i))/ \1 B5 U& z7 {, S
Next i: g) J& k* k, x, z* M+ _+ y
txtHex.Text = revbuffer
L8 ^' K% P! i. m9 V8 E J- C' ~ If Mid(revbuffer, 1, 4) = "6030" Then
$ t- o# N% T! a; Y Timer2.Enabled = False
5 r9 i; l, _0 Z( \. T r Timer3.Enabled = True- h# s4 _' _- x! N7 v
End If
: W" a9 P& \2 r5 o Case comEvSend3 B' B9 B8 o+ r. m
End Select& W, p6 k' S2 [ S3 I
End Sub; V0 _4 h2 G. T a7 ]( Z
Private Sub timer3_timer()
& m5 W* G* q& ?, N% @; ~7 } MSComm1.OutBufferCount = 0 '先清空緩存6 z2 h% ?. H. x/ }6 k! G/ K
sendbuffer = "STX"
; i7 ~ s( v; h+ k6 h MSComm1.Output = sendbuffer
' O1 M' {8 J7 p1 ~2 q3 M: L Select Case MSComm1.CommEvent3 a3 ^# L/ g: r' d% a
Case comEvReceive' m5 j# w) a$ _3 _: R
inbyte = MSComm1.Input
0 ?: \# Y! V9 w) [& W For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉(zhuǎn)換為十六進制; Q3 v9 G" \7 `. _( Q
revbuffer = revbuffer + Hex(inbyte(i))
& X9 y: y. j' [% A L$ N4 } Next i
9 x' |6 `+ o3 X6 p/ `2 v txtHex.Text = revbuffer* n+ r0 h5 n; T
Case comEvSend- U$ h, {# o6 w6 V& ^6 M0 `
End Select# e( U8 f d9 [0 h. @* L5 L
End Sub
9 h1 g- C8 ]& H. V* b
0 r* R7 G0 J% {$ J
" W! [' q' j) V
6 n: W* g$ f: ] X$ \ |
|