|
項目需要用MSComm控件實現(xiàn)射頻設(shè)備與PC的串口通信。先說一下設(shè)備發(fā)送命令后會返回的相應(yīng)的數(shù)據(jù):
' c. k1 i" I" i8 A/ Q* T$ d- ~4 V5 _2 p. h+ A# a) M
當(dāng)發(fā)送命令"H!i"時,為尋找芯片。
* Y& F* a; y' C- D9 |+ G5 e3 q7 `9 ]當(dāng)設(shè)備連接正確又無芯片在感應(yīng)區(qū)時,設(shè)備循環(huán)返回:0630 和 15377 q( R7 H3 X+ ^
當(dāng)設(shè)備當(dāng)設(shè)備連接正確而芯片又在感應(yīng)區(qū)時,設(shè)備返回0630,稍有停頓,繼續(xù)返回4831+其他信息1 Y: l( v0 h8 A" g4 q
/ l* s* Z3 V+ t當(dāng)芯片在感應(yīng)區(qū)時,發(fā)送命令“R00000016U”,讀取芯片前十六字節(jié)數(shù)據(jù)
6 _6 @# l( g. |1 K沒有錯誤時,設(shè)備返回:0630
/ M+ m( Y* A9 b此時,發(fā)送命令“STX”,或十六進制命令“02”
1 g2 n4 n* K* c! \1 N% o設(shè)備返回前十六字節(jié)數(shù)據(jù)3 D2 m# v; @ `
' ^! t2 h& ~7 \. Q+ k: }之后繼續(xù)發(fā)送命令“H!i”,尋找下一個芯片0 Z4 F# T$ X) w4 I
--------------------------------------------------------------------& u7 h) r( ~5 B9 s
項目用MSComm進行串口通信
' h' ]+ J6 k3 K: Z需要將上述幾條命令循環(huán)起來。我用的是比較MSComm1.Input是否為爭取的返回值“4831”和“0630”。* p2 p8 r1 Y7 h! \0 c* q1 W) v
用了三個timer來控制三條命令“H!i”、“R00000016U”和“STX”的發(fā)送。把發(fā)送命令都放在了timer_timer下。
. r6 j4 P: x' Z- O( c" Y, u, J但是這樣的話,就用到了三個Private Sub MSComm1_oncomm()。系統(tǒng)報錯,“發(fā)現(xiàn)二義性名稱”。意思應(yīng)該是不能重復(fù)定義Private Sub MSComm1_oncomm()吧?
7 K9 v9 P. M# D: g c----------------------------------------------------------------------------
. L2 l1 A" i5 [8 o2 b1 c其實程序說簡單些就是:" C2 k* ]# ]! I* t4 Y7 x
發(fā)送命令—>從數(shù)據(jù)返回區(qū)判定->發(fā)送命令->數(shù)據(jù)返回區(qū)判定->再發(fā)送命令->接收數(shù)據(jù)' Q0 J* p* ~. o' ^4 \7 ]1 u7 r; T
這個循環(huán)要怎么實現(xiàn)呢?
# X; Y, M' L9 l0 q. n先謝謝各位!7 b( a2 ?4 C% ^) }- J, o# N( j% K
! G' H4 ~& C, e/ ~4 ~6 ?9 V--------------------------------------------------------------------+ H e7 r( g/ C" W: [7 Y, \
下面是循環(huán)部分的代碼。系統(tǒng)報錯
- N! J* ~8 s: G" q9 [Private Sub cmdStart_click(), _! j* ~8 L2 {
Timer1.Enabled = True
0 \0 [0 u% v$ |- B+ t
( t3 @) R8 ?! }$ n5 m+ k . F% [4 s! X- c% |1 p; }* p1 C. b
1 X8 h. ?" H6 }- b$ y; }3 z! E# lEnd Sub
' i/ z( p: l; \' O# q9 ~Private Sub timer1_timer()' A+ U( v' y1 t
3 G8 N! ? M+ \, g3 z MSComm1.OutBufferCount = 0 '先清空緩存, W2 J. u& J- t# r+ A) U& D
sendbuffer = "H!i"( A, R0 O& J8 B f& R2 O# v
MSComm1.Output = sendbuffer
3 M) J4 H$ f3 nEnd Sub
. q: }/ ]$ X$ v1 v$ Y# X) Q/ Q'結(jié)束
1 D e) |0 A0 APrivate Sub cmdStop_click()9 X5 T+ z* p- H" D9 a' c
Timer1.Enabled = False% B4 ]& n; s" @
Timer2.Enabled = False% E: V0 C* G% E$ L2 M
Timer3.Enabled = False5 [9 V, u5 ]# D. r& u
End Sub' O0 M9 q- o8 |, K5 s3 Y
8 \, W! Y% Y# w'接收數(shù)據(jù)& |+ q% _* S+ H! u' a# E% I
Private Sub MSComm1_oncomm()
7 i4 ]5 \3 q1 P9 @ Dim inbyte() As Byte
v- M- @! Z. T1 R* y1 h Dim revbuffer As String% b# a. W# G& C$ H. m2 w
Dim a, i, b
1 Y/ [# x& b) _" j" _/ T Select Case MSComm1.CommEvent5 u; R& {( `" ?2 x& w
'如果有CT在感應(yīng)區(qū)
! h* q# F6 U: u
1 ~* g) N% l V8 z6 B) ? Case comEvReceive
, H' J+ ]; b* w6 Q; o F; u inbyte = MSComm1.Input6 i$ i' W- c M$ g
For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉(zhuǎn)換為十六進制
& \, s, u0 [9 P4 O t5 U revbuffer = revbuffer + Hex(inbyte(i))
0 M# r9 [4 X; N% ^, M- a5 ^' p" E Next i8 f; a3 X! K" T
txtHex.Text = revbuffer$ A r/ D) c$ W% ~! w1 r( b! `
If Mid(revbuffer, 1, 6) = "480310" Then
+ P b2 j: p, |, X2 U# T0 [5 r Timer1.Enabled = False
0 t5 [8 I6 [5 V5 ^8 b: K Timer1.Enabled = True7 ]* v6 _6 @% |6 H7 z& E
End If
6 Z/ w7 g% z# _: r3 q; J End Select
) K# j3 s. \, S# }6 ? Case comEvSend; @- r9 X; Z% `. O
End Select
, e( @1 F y; y, }" G, EPrivate Sub timer2_timer(); s6 k2 }5 ^, P9 s# s( X5 g! C; K
MSComm1.OutBufferCount = 0 '先清空緩存
+ W3 k8 a. d$ [ sendbuffer = "R00000016U") U3 x- i2 \3 n4 E* M% B
MSComm1.Output = sendbuffer3 F* B* V8 |7 D- F C
End Sub
* v/ A) l8 f3 \: pPrivate Sub MSComm1_oncomm()8 {1 W9 U1 E' R3 [" _7 \; D, K
Select Case MSComm1.CommEvent7 f- C5 q' E7 G
Case comEvReceive
# D# p w; z+ A7 L' ] inbyte = MSComm1.Input
) T: @, f% k9 q+ w For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉(zhuǎn)換為十六進制' S9 U+ K4 Z! t0 c, _
revbuffer = revbuffer + Hex(inbyte(i))
! W. @2 q, V3 k2 p Next i
$ \+ ^& T, Z' ]; Q# |+ C txtHex.Text = revbuffer
, T' |' P, |- M( x5 P7 L If Mid(revbuffer, 1, 4) = "6030" Then
& t) G: ?0 i6 F% n Timer2.Enabled = False
" q/ D) E# x/ \: i$ e( f9 ? Timer3.Enabled = True
7 @$ o3 j9 h% p0 ]! Z9 T! P7 v End If, g! J% |/ j' a! R
Case comEvSend
3 T" x4 z0 H; { O End Select
7 ]+ O2 M% h/ I) q: p* L" c2 Y# _End Sub7 E' g1 @2 M2 t0 A
Private Sub timer3_timer()
0 \* @7 m! b3 P9 s MSComm1.OutBufferCount = 0 '先清空緩存: U, [0 p$ c- E/ ^" w
sendbuffer = "STX"& [& w* Y* g y
MSComm1.Output = sendbuffer& e- w D" ?" d1 M5 `: l
Select Case MSComm1.CommEvent; z: V% Q! ]# ^) S
Case comEvReceive
9 e/ h& K' C% H# Q inbyte = MSComm1.Input
' w6 {( M; H0 Q$ M For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉(zhuǎn)換為十六進制
7 }/ N% ], c) M! s0 v9 z2 ~. \ revbuffer = revbuffer + Hex(inbyte(i))
: v6 h6 u, v( o5 H, h N }0 W Next i
+ b% }. ~2 F: W txtHex.Text = revbuffer2 n7 E( p: j: K9 w2 `. t7 H$ Y
Case comEvSend
5 |6 a& F2 o7 n3 @ m1 B9 x End Select
( H$ {/ Z: e; Y) g! G1 v+ {End Sub+ o8 ]0 v" E: L
^( h; l* L. h' T7 h/ W/ @0 }' |& W- x1 ]3 Q+ k+ [7 D' K
. s+ j& Q2 }* m6 E' w8 w' {
|
|