久久久国产一区二区_国产精品av电影_日韩精品中文字幕一区二区三区_精品一区二区三区免费毛片爱

機械社區

標題: 求助:VB6.0 MSComm控件串口通信發送循環 [打印本頁]

作者: robi    時間: 2011-3-31 21:03
標題: 求助:VB6.0 MSComm控件串口通信發送循環
項目需要用MSComm控件實現射頻設備與PC的串口通信。先說一下設備發送命令后會返回的相應的數據:
8 J& B1 S8 a7 a) J5 g- ]
4 ~# \! ]" s* C當發送命令"H!i"時,為尋找芯片。1 S1 x  {/ e5 e* ?. e% b- ], T
當設備連接正確又無芯片在感應區時,設備循環返回:0630 和 1537
, y( x' `- A6 b: y! ]# p當設備當設備連接正確而芯片又在感應區時,設備返回0630,稍有停頓,繼續返回4831+其他信息
; W  o3 q, ]- `" d: K5 \
1 `5 k! O" W; R8 j' K! _( v當芯片在感應區時,發送命令“R00000016U”,讀取芯片前十六字節數據
* S7 ]  q+ W8 T& C: s8 Q! m, v沒有錯誤時,設備返回:06309 b* C* c: Y1 \. g9 z
此時,發送命令“STX”,或十六進制命令“02”, ~7 ?7 y" R$ ^$ U" [
設備返回前十六字節數據2 T) d2 Q" }9 b1 r
) ^/ v: ]8 ~" C" R  Q0 B
之后繼續發送命令“H!i”,尋找下一個芯片
# l1 {; L: j+ n3 c--------------------------------------------------------------------! x) l' s, q; h- ?1 W
項目用MSComm進行串口通信. v/ b  ~# i5 D- w+ @
需要將上述幾條命令循環起來。我用的是比較MSComm1.Input是否為爭取的返回值“4831”和“0630”。  g( e( p  c6 r+ k5 j$ x
用了三個timer來控制三條命令“H!i”、“R00000016U”和“STX”的發送。把發送命令都放在了timer_timer下。, g& A7 l2 ]9 K0 B+ I
但是這樣的話,就用到了三個Private Sub MSComm1_oncomm()。系統報錯,“發現二義性名稱”。意思應該是不能重復定義Private Sub MSComm1_oncomm()吧?; z, Y. F: T4 ]
----------------------------------------------------------------------------+ h) U7 C$ }2 K0 W! S
其實程序說簡單些就是:
% y/ Q9 z( \* s. M發送命令—>從數據返回區判定->發送命令->數據返回區判定->再發送命令->接收數據9 }! D4 w4 O$ c' r6 I' b3 e3 w  M; p
這個循環要怎么實現呢?
' X  \3 i; k* z+ J$ q, X先謝謝各位!% X  f2 D" B9 ~" w9 N* v
- ?" _) }+ {2 X$ h2 V" U. ?. \! x
--------------------------------------------------------------------9 ~% L9 u# ?- i
下面是循環部分的代碼。系統報錯- n' `  N, ^4 }# q
Private Sub cmdStart_click()
' g2 p3 W. g, ~9 Q: g5 ^( W    Timer1.Enabled = True  m, r* j4 Z/ c3 q, j
   
: P4 }1 o/ ]0 S, r3 [; H' f9 j   
9 z4 U& J8 h0 l1 P8 ?* ^9 a   
/ J5 K2 _; z2 n& X8 }7 F! MEnd Sub! @# Y: x/ d  z, C3 O3 a
Private Sub timer1_timer()1 `. e9 B1 U( ^  z
   
6 D& l4 ]+ k- |" J5 m  ]% b/ b   MSComm1.OutBufferCount = 0 '先清空緩存/ ~- J% g: y" D' \! K( D
   sendbuffer = "H!i"! P0 B" v9 k" }0 G  g. o
   MSComm1.Output = sendbuffer+ ^! G' k* S4 U
End Sub: l/ Q7 l- c$ a# T  v
'結束
, ~% K. s- k% FPrivate Sub cmdStop_click()
* H# Q/ q1 ]" F* p8 H    Timer1.Enabled = False
( d; ]  P& K" d9 d& }    Timer2.Enabled = False
6 R( ^( [, R/ V* h. u& a1 v# p& g    Timer3.Enabled = False- u% i% u# Y2 H$ O8 w
End Sub) g* U5 j8 ?& G7 ^% G. V' Z9 u3 R# u
3 v) `# D& c1 }6 Y8 K. j- f
'接收數據
9 d5 a1 t5 W: d( ?/ q. TPrivate Sub MSComm1_oncomm()
, k% K) l1 W# Y2 K    Dim inbyte() As Byte
1 ^3 D! e& [1 u: @# Q& R    Dim revbuffer As String  M- u2 d& C" w: d
    Dim a, i, b/ e1 ]% Y- W( w
    Select Case MSComm1.CommEvent
8 p. L. r, x' X       '如果有CT在感應區
& C& T- i& P/ p+ g+ }: k        
3 z2 P) w3 P$ M/ r        Case comEvReceive9 j7 O; X1 U! j8 c3 z5 v* N
            inbyte = MSComm1.Input9 ]2 l* D: v* h7 ^* B4 a* r- F8 u
            For i = LBound(inbyte) To UBound(inbyte)            '返回數據轉換為十六進制* b6 J( v( W# U2 x: O8 a6 f& V( Q
                revbuffer = revbuffer + Hex(inbyte(i)). W/ c; }  @" p, C; }
            Next i
4 \# J- [* ?( l8 i: \            txtHex.Text = revbuffer, q" C( v* i2 w
            If Mid(revbuffer, 1, 6) = "480310" Then
) J- o! ?5 u6 l5 i( X* d7 }                Timer1.Enabled = False
2 a7 P2 m- _8 |' S( R7 y                Timer1.Enabled = True
9 H8 a, Z+ [- z0 Q* e$ f& ]% L0 B            End If
8 }0 P5 S) \# l- u% J) m9 m" r        End Select8 x& E) e- i2 d! S! I# }: a
        Case comEvSend1 E# t, I& p" L3 H& S
    End Select
4 [8 V! A6 U& MPrivate Sub timer2_timer()
% Y; X9 Z4 j6 a' m$ G        MSComm1.OutBufferCount = 0 '先清空緩存
+ |3 f3 h) `1 @0 j        sendbuffer = "R00000016U"
3 C. U  N: p) U! o! C" n+ _/ `        MSComm1.Output = sendbuffer
( [9 M' f" a" [+ f  uEnd Sub: V) c- H  U2 ~
Private Sub MSComm1_oncomm()$ q% }" w% H$ n4 y8 o; t
    Select Case MSComm1.CommEvent
# B* z. z; o) A0 s        Case comEvReceive2 O. Y  `  V( v$ E( \& s
        inbyte = MSComm1.Input5 A4 b6 K+ v" X; j
        For i = LBound(inbyte) To UBound(inbyte)            '返回數據轉換為十六進制
! r$ z) M9 l7 K8 k. U            revbuffer = revbuffer + Hex(inbyte(i))8 _8 ^$ t9 l0 T
        Next i
/ h. Q5 ?* F2 O  e2 C+ F' X        txtHex.Text = revbuffer! Q$ G$ D9 u  P
        If Mid(revbuffer, 1, 4) = "6030" Then
0 b3 @0 F6 k4 y. \, P            Timer2.Enabled = False
& F9 \' w# d/ @3 d  F            Timer3.Enabled = True
- B) \) J6 l% l+ |0 h        End If) \' E5 n5 K. Z; k7 B6 ?3 a
        Case comEvSend
- j+ w3 ^& R2 b( ?! k    End Select
$ k+ D7 C; z5 l; @, [! oEnd Sub
& Z& U* e' R7 T  u  s% KPrivate Sub timer3_timer()
. D. C* ?1 ]" v$ C3 a" y& [    MSComm1.OutBufferCount = 0 '先清空緩存7 q' a0 ]2 ]/ h; F; D; V4 n
    sendbuffer = "STX"8 S9 K4 u+ o; k9 [4 j2 j
    MSComm1.Output = sendbuffer5 I# }4 f+ [( ?* B5 }, o
    Select Case MSComm1.CommEvent
5 T8 b, J3 Q5 e0 }; {/ B        Case comEvReceive! E+ T) @. ]" Y
            inbyte = MSComm1.Input
2 p" ~7 Q: q; |9 l3 A, |5 X2 P            For i = LBound(inbyte) To UBound(inbyte)            '返回數據轉換為十六進制
: [% c4 [; y/ K% G+ A0 M                revbuffer = revbuffer + Hex(inbyte(i))8 d$ \6 S* Y7 _5 a
            Next i
: R0 x8 N$ q3 g8 S5 c1 Q            txtHex.Text = revbuffer" J6 |5 E9 u6 E. O( }: w, u
            Case comEvSend' M: k# {) j, y' x8 g
    End Select7 C7 C+ |: M' ?( S0 _4 D
End Sub6 q( N5 {. T+ ~$ [, R! Y
. g, v2 V. [6 ?6 V, u

* u' _, t/ j: f# D7 f" r- q% f- Q, z

作者: 無能    時間: 2011-4-1 09:22
這個問題感覺不難,但你描述的有些亂,讓人看不明白。
( ]! k2 f' h$ X6 g我也用Vb編過一些東西,歡迎交流。
作者: 無能    時間: 2011-4-6 16:50
不知解決的如何了?三個Timer確實很混亂。
作者: robi    時間: 2011-4-6 22:47
回復 無能 的帖子+ p; i4 O) t' g' M/ G

/ z6 W4 O. H+ T2 u$ |6 Y/ [; u快了。
6 U3 l* E; y! O5 l  W, T3 ]設備通信協議我沒看清,這個設備的通信不用timer。
9 J6 H1 p2 ]  e4 R& N4 Z7 O4 P
作者: 1393065141    時間: 2011-5-4 22:34
學習、、、、、、、、、、、、、、、、、、、、
作者: robi    時間: 2011-8-15 20:09
后來發現其實這個通信程序的關鍵在于要弄清收發信息的格式,也就是MSComm初始設置時,是二進制還是文本。這個很重要,否則通信會出錯。
作者: 機械電氣編程    時間: 2012-11-15 11:31
讓我想起了,我畢業論文就搞的這個。




歡迎光臨 機械社區 (http://www.ytsybjq.com/) Powered by Discuz! X3.5