項目需要用MSComm控件實現射頻設備與PC的串口通信。先說一下設備發送命令后會返回的相應的數據:7 I7 O, l; T2 c5 u
3 b9 |: }6 b% |& d, I. N0 T, W
當發送命令"H!i"時,為尋找芯片。
" Y! @/ K% z w! j當設備連接正確又無芯片在感應區時,設備循環返回:0630 和 1537
) i" ^2 p8 v; j8 D3 P1 R3 U1 P6 y當設備當設備連接正確而芯片又在感應區時,設備返回0630,稍有停頓,繼續返回4831+其他信息
# c- u+ q1 t3 l" U% l1 B1 J
+ M' v! l) K& q7 R1 @2 I/ o3 w) D3 a當芯片在感應區時,發送命令“R00000016U”,讀取芯片前十六字節數據 y" U! p& }" \( f9 G" p
沒有錯誤時,設備返回:0630* @3 m1 C& Q3 r1 R
此時,發送命令“STX”,或十六進制命令“02”% d9 a5 y7 M' p. z3 h7 k8 d
設備返回前十六字節數據
3 o$ u" N2 E+ {! m1 f ?2 s
) [" k0 q. ]1 E7 h" l/ Q之后繼續發送命令“H!i”,尋找下一個芯片4 }9 O P) \+ v! \0 f J. F
--------------------------------------------------------------------* h7 X: U' ~; s- y
項目用MSComm進行串口通信- D( s8 F5 I2 k( ^. I9 q7 a
需要將上述幾條命令循環起來。我用的是比較MSComm1.Input是否為爭取的返回值“4831”和“0630”。7 \( h6 t! n7 V$ b
用了三個timer來控制三條命令“H!i”、“R00000016U”和“STX”的發送。把發送命令都放在了timer_timer下。
9 M" z# }3 |. R f/ {7 g2 u% H但是這樣的話,就用到了三個Private Sub MSComm1_oncomm()。系統報錯,“發現二義性名稱”。意思應該是不能重復定義Private Sub MSComm1_oncomm()吧?& ?& R# [2 d8 f" b5 C) T
----------------------------------------------------------------------------( K5 ^! L0 G- l
其實程序說簡單些就是:- |5 M5 M' @2 J# }
發送命令—>從數據返回區判定->發送命令->數據返回區判定->再發送命令->接收數據; u6 E0 L! y2 a0 E3 Y3 V2 o) C1 l4 u
這個循環要怎么實現呢?
2 o+ ?4 l( [" Y% H4 e先謝謝各位!" p9 R) R) v# X6 x, X
0 p2 C! g! ]: n- y g# k n+ i
--------------------------------------------------------------------
7 g1 R I `$ \9 i9 g下面是循環部分的代碼。系統報錯
- _" \* k) T9 T0 ePrivate Sub cmdStart_click()$ Q+ T' S8 ?4 _& W2 I
Timer1.Enabled = True# ~1 p' ]+ k7 S( i0 ?' P3 l* `2 p
6 J9 S# Y1 b V- X0 | ) _+ S4 s8 ?3 K8 M7 h
% v# O% Y8 ?# G% o% S" x/ R
End Sub
4 ^( z; O0 H5 I$ X5 g# FPrivate Sub timer1_timer()5 o( l- c) k9 X+ z8 `
4 ?8 H' n% f t1 x' h L
MSComm1.OutBufferCount = 0 '先清空緩存+ O+ E, d! a" j
sendbuffer = "H!i"
8 K6 @4 R& j' U/ {! G$ r- r/ g, k MSComm1.Output = sendbuffer
, f; ]7 G8 J+ J' c8 ^End Sub0 P! c9 I* U# A+ @8 o/ `
'結束
8 ]+ C" l* t/ ]/ u5 ~Private Sub cmdStop_click(): v+ L. `/ B" i$ h" Q9 W4 v" S) x
Timer1.Enabled = False
% T |1 z: Q4 y% c, h Timer2.Enabled = False7 g( V: l P: {
Timer3.Enabled = False
3 f B: u3 D! Q y- lEnd Sub6 a7 |4 S# K" t1 P% w
( C Z9 }2 t# ~'接收數據; O! g, j' Z+ z: G7 ]/ Z$ M: s2 y
Private Sub MSComm1_oncomm()
# H4 m9 l6 k4 g, [, ~0 G; \ Dim inbyte() As Byte. k) J6 w" i# z, M
Dim revbuffer As String, R- S8 \( n2 p: P+ H
Dim a, i, b1 Y7 _9 s) i4 P# q0 k" W, Y8 q
Select Case MSComm1.CommEvent" z* |$ X1 E4 y. A& ~# ?
'如果有CT在感應區
3 x9 t9 W8 x& l: u% c* ]3 G 6 Q; A9 y4 C- J$ G1 r. |
Case comEvReceive
V6 y$ ]6 k& k9 {3 z- Y$ { inbyte = MSComm1.Input* a/ {$ ~% l0 |. i% r
For i = LBound(inbyte) To UBound(inbyte) '返回數據轉換為十六進制% c6 ?9 s" R# `6 G( Y' m6 R
revbuffer = revbuffer + Hex(inbyte(i))- E* A0 X% j* G
Next i
( T% q5 v; W, K txtHex.Text = revbuffer
; C4 Z; `7 `. \7 x/ f5 l If Mid(revbuffer, 1, 6) = "480310" Then. t% G/ ^% P9 B" H! i5 S% v" L; R
Timer1.Enabled = False* E) `! p4 P% p9 C
Timer1.Enabled = True, s& p# z6 t3 |. t
End If& K# h2 p9 y; k& f
End Select' ^5 b$ T) N1 E/ x
Case comEvSend2 A6 K- e4 N; w! B0 t4 ^
End Select0 p5 x- R( P5 K( n- d- _" t) c) ~
Private Sub timer2_timer()7 g! O0 ?% e8 D1 W0 c
MSComm1.OutBufferCount = 0 '先清空緩存
% Z3 y3 j, C$ } sendbuffer = "R00000016U"+ G1 O! ]% e# n* D8 Y
MSComm1.Output = sendbuffer
' @% T" ^$ J; |; [* z6 fEnd Sub
5 M1 B" R d5 Z$ g: ?( a6 zPrivate Sub MSComm1_oncomm()
( m! v' y; l! ^. w( V n/ | Select Case MSComm1.CommEvent
4 m2 |( a3 h- ?$ Y+ ] Case comEvReceive
7 y6 P7 s5 T) P0 O inbyte = MSComm1.Input V5 z* x% E% c0 v$ \8 x
For i = LBound(inbyte) To UBound(inbyte) '返回數據轉換為十六進制
! F7 q: {9 {$ b7 R( P revbuffer = revbuffer + Hex(inbyte(i))
. n3 K/ B- H, q( H Next i
% ~9 V. r" i% w# ] txtHex.Text = revbuffer1 k& C/ m" Q x, U% P
If Mid(revbuffer, 1, 4) = "6030" Then6 c/ w A, P/ `6 u! m5 ?) @
Timer2.Enabled = False+ M% [/ k* \3 g1 {
Timer3.Enabled = True& u0 g( h1 {/ |; O. H7 _
End If6 @* _" x9 ` V- S% Y7 L& W0 n
Case comEvSend0 N, v8 F I* @% h! ~) ?
End Select
$ l2 F3 d2 p+ z" K4 o; yEnd Sub
/ e* T/ p# J' {( R# D1 Y) GPrivate Sub timer3_timer()
7 L1 X0 X% U. `! C+ s MSComm1.OutBufferCount = 0 '先清空緩存
+ X& r) h. ?& d8 q9 Q" C sendbuffer = "STX"
- W R9 N/ B( r2 l3 n MSComm1.Output = sendbuffer2 @. q2 S: X f1 P2 B6 C0 V* u
Select Case MSComm1.CommEvent7 D) ?! b! \/ q& s# M
Case comEvReceive+ @- a% K ~5 V* \) O3 h8 \
inbyte = MSComm1.Input5 m4 w) e5 ?) F( ?
For i = LBound(inbyte) To UBound(inbyte) '返回數據轉換為十六進制# T8 E8 `* [: f( ?" @
revbuffer = revbuffer + Hex(inbyte(i))( }6 e/ C9 p) V# j2 N1 M
Next i6 H& Q; p. V" x6 m
txtHex.Text = revbuffer2 w0 _1 d; l3 x+ X3 q m: x
Case comEvSend, q6 ^+ ^$ B0 F; m5 T* I& c5 [
End Select2 H. l6 Y( b* b0 c4 A
End Sub- k* i. T* I4 n
4 C# Q/ X% V3 e: u
7 H. q% q) o4 k
2 d7 E- ]5 y8 P' P; O |