|
項(xiàng)目需要用MSComm控件實(shí)現(xiàn)射頻設(shè)備與PC的串口通信。先說一下設(shè)備發(fā)送命令后會(huì)返回的相應(yīng)的數(shù)據(jù):
8 c7 z( H0 E* w& X& M8 s
: J+ I' ?! S( [當(dāng)發(fā)送命令"H!i"時(shí),為尋找芯片。
1 v: _# j4 t2 }+ f5 }3 y當(dāng)設(shè)備連接正確又無芯片在感應(yīng)區(qū)時(shí),設(shè)備循環(huán)返回:0630 和 15372 |- r& ?$ u! }" q3 w$ c3 |
當(dāng)設(shè)備當(dāng)設(shè)備連接正確而芯片又在感應(yīng)區(qū)時(shí),設(shè)備返回0630,稍有停頓,繼續(xù)返回4831+其他信息
: m) A3 G# w# Q) t
: A5 [- X- Q# ~ |; F當(dāng)芯片在感應(yīng)區(qū)時(shí),發(fā)送命令“R00000016U”,讀取芯片前十六字節(jié)數(shù)據(jù)
6 v5 f( S0 B6 X沒有錯(cuò)誤時(shí),設(shè)備返回:06307 y& k" Q' s/ i/ g' L
此時(shí),發(fā)送命令“STX”,或十六進(jìn)制命令“02”+ n$ E+ t6 x5 o4 G
設(shè)備返回前十六字節(jié)數(shù)據(jù); e& C, {8 M3 o2 z, L
" f( P% c+ ]: H' `4 y# t2 n2 p
之后繼續(xù)發(fā)送命令“H!i”,尋找下一個(gè)芯片
6 s0 [4 E6 _* {$ O! ~1 H--------------------------------------------------------------------
2 x$ v3 }9 ]4 m0 Z' g' V項(xiàng)目用MSComm進(jìn)行串口通信" U# O- L1 B& [. t# I% d- `
需要將上述幾條命令循環(huán)起來。我用的是比較MSComm1.Input是否為爭(zhēng)取的返回值“4831”和“0630”。
% z7 z1 Y3 P) y2 a4 ~) z用了三個(gè)timer來控制三條命令“H!i”、“R00000016U”和“STX”的發(fā)送。把發(fā)送命令都放在了timer_timer下。
1 l% N7 T6 u8 }* x但是這樣的話,就用到了三個(gè)Private Sub MSComm1_oncomm()。系統(tǒng)報(bào)錯(cuò),“發(fā)現(xiàn)二義性名稱”。意思應(yīng)該是不能重復(fù)定義Private Sub MSComm1_oncomm()吧?
4 `) b) \1 X- F2 M" g( k% K$ H# B( g----------------------------------------------------------------------------
( {9 C" u/ V( D9 l( y- D& U其實(shí)程序說簡(jiǎn)單些就是:
0 n% q5 L( n) e) ^) a/ ?9 R( N4 R: S發(fā)送命令—>從數(shù)據(jù)返回區(qū)判定->發(fā)送命令->數(shù)據(jù)返回區(qū)判定->再發(fā)送命令->接收數(shù)據(jù)# U5 k( M) o' ]6 U) F
這個(gè)循環(huán)要怎么實(shí)現(xiàn)呢?- Y5 @5 B9 h7 V! B _
先謝謝各位!$ K# G! V- _. [ c7 J
. C0 c/ z2 S9 A& z5 m
--------------------------------------------------------------------
" Q0 Y6 I' H, U( } V下面是循環(huán)部分的代碼。系統(tǒng)報(bào)錯(cuò)
6 {* B0 `* B& @" ]9 e5 oPrivate Sub cmdStart_click()
4 ?) O$ `# |. a2 T3 |$ \& y) F) w Timer1.Enabled = True
8 B% k( y4 t- G6 Y- q& v
! h& U3 `+ n' p
/ p8 h, l9 P/ ]* o0 m! O$ b
: }2 v; L& `! ^9 i- l* yEnd Sub2 {2 S. a8 ]) O5 r2 m: d
Private Sub timer1_timer()
* k; f, s9 O% ?$ u) R) u0 Q, u$ T
3 L: ^% I2 E( V/ m5 h( T( J MSComm1.OutBufferCount = 0 '先清空緩存( R" k0 e9 k+ U g
sendbuffer = "H!i"
. R7 P3 p' z' b& r MSComm1.Output = sendbuffer& @5 X1 K$ K; G$ m( S
End Sub0 G r, n2 j& |% e7 S5 q/ V' x! I
'結(jié)束
; F; G, y/ z/ K# N! LPrivate Sub cmdStop_click()
8 w" t- v, `1 t) R2 k Timer1.Enabled = False1 P) _3 |3 }2 M& F, T0 P% p
Timer2.Enabled = False- F* \$ O/ W% `. y
Timer3.Enabled = False
" @0 ?- D$ d/ YEnd Sub
& `' N$ J8 r" z7 a& V( [0 o2 ] w! x0 k t+ C
'接收數(shù)據(jù)
. ?1 X7 {* r3 b, A b: e4 sPrivate Sub MSComm1_oncomm()! U# d) j1 ~# y2 Y
Dim inbyte() As Byte
! C K6 p1 l5 e' \ Dim revbuffer As String
5 @' C" d) V" K$ l! l3 A Dim a, i, b" b* Y7 j; a+ {) w4 K: ?1 ~2 {7 o5 W
Select Case MSComm1.CommEvent. ?9 h8 Y+ R+ }4 ^' h/ ?
'如果有CT在感應(yīng)區(qū)
" ?1 M, B) B# C
$ ]3 J7 m/ i5 C5 } Case comEvReceive, J0 _9 M4 A: Z" @0 O
inbyte = MSComm1.Input
7 K. O/ x! R4 F" c' c4 C# L* } For i = LBound(inbyte) To UBound(inbyte) '返回?cái)?shù)據(jù)轉(zhuǎn)換為十六進(jìn)制4 I9 s" b3 r7 ?5 N0 q9 D
revbuffer = revbuffer + Hex(inbyte(i))6 a# S' s3 [6 _! j7 m5 S9 N. u& o
Next i
$ d$ {3 G; h( ]$ l6 |' v+ F txtHex.Text = revbuffer7 S6 p# y; |! s
If Mid(revbuffer, 1, 6) = "480310" Then* s1 ^3 \# v0 T
Timer1.Enabled = False
( H6 n5 ~: c: H9 U! v Timer1.Enabled = True
$ ~0 a- |- y* Z: ]$ o- a5 N End If
) S8 F5 G- n+ q$ D! G- S End Select- z" W1 S- i4 V, r4 ]
Case comEvSend
1 y0 r0 O2 T, H5 k End Select
5 W* s; w- H+ r* ]Private Sub timer2_timer()
( g! ?/ D: P5 M& k MSComm1.OutBufferCount = 0 '先清空緩存
7 j3 F" s2 a( n" ^+ h" L1 | sendbuffer = "R00000016U"
3 z$ o3 r/ \, [ c ` MSComm1.Output = sendbuffer' w0 [; `6 h0 s
End Sub
" Z7 t$ D9 k l- w% J- } `, cPrivate Sub MSComm1_oncomm()5 q1 q/ b9 o" k- O- x9 O# D+ p
Select Case MSComm1.CommEvent
0 N+ R. q/ M% S5 B, B' c$ }9 x# \ Case comEvReceive
2 B/ d! u" V @: I% K, g inbyte = MSComm1.Input
+ P% n" T$ ?7 o( |, F For i = LBound(inbyte) To UBound(inbyte) '返回?cái)?shù)據(jù)轉(zhuǎn)換為十六進(jìn)制
' a: M1 ?% V8 G8 [/ z) O$ r: i revbuffer = revbuffer + Hex(inbyte(i))! p& d' x# W5 M
Next i$ K" o8 W, Z( V" N% q7 M& o
txtHex.Text = revbuffer
, t5 t" L/ T' D$ F" X* ]9 Z If Mid(revbuffer, 1, 4) = "6030" Then; n' l, z7 T/ @0 H+ E/ I
Timer2.Enabled = False
4 {8 ~* F6 ?& y+ z( W Timer3.Enabled = True
3 J/ M: M, u, M" |" h+ u End If
( m+ a+ }6 y; g$ K1 Y9 a Case comEvSend& [) ?) T! l/ A9 O' @
End Select, V. y( g; Q$ u; ~( z, Q/ ?9 F
End Sub
% _. {% b3 r% |' W- U6 R6 pPrivate Sub timer3_timer()
# y4 a# q* ^$ p+ f MSComm1.OutBufferCount = 0 '先清空緩存
3 u4 _) E' @% g sendbuffer = "STX"0 p d" n/ d \
MSComm1.Output = sendbuffer
1 _$ ^ ?! ?( W: f- H6 A Select Case MSComm1.CommEvent
6 J$ }( S/ Y3 N. |; } Case comEvReceive
4 P8 o: ~& B+ Y- v* d& K- [- E8 T inbyte = MSComm1.Input- @# N3 o0 d( j. b
For i = LBound(inbyte) To UBound(inbyte) '返回?cái)?shù)據(jù)轉(zhuǎn)換為十六進(jìn)制
1 S) w; `8 l5 n* c' a4 w4 S# F% H revbuffer = revbuffer + Hex(inbyte(i))
, ~) L8 E3 W/ p( V, A Next i
+ V0 c C6 I' z+ @) Y txtHex.Text = revbuffer+ ~6 m! [# f8 V7 z- j
Case comEvSend' E! U* _% n( P S
End Select0 f* q+ b+ a" s, f
End Sub1 {( U3 k# k. X T/ W8 R
* R P' u+ T5 B% J0 b( C
) [+ A/ X2 R! K6 d }9 Z
2 N# v7 F; f+ U7 G+ U) K1 Z7 H
|
|