機械社區(qū)

 找回密碼
 注冊會員

QQ登錄

只需一步,快速開始

搜索
查看: 8231|回復: 6
打印 上一主題 下一主題

求助:VB6.0 MSComm控件串口通信發(fā)送循環(huán)

[復制鏈接]
跳轉到指定樓層
1#
發(fā)表于 2011-3-31 21:03:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
項目需要用MSComm控件實現(xiàn)射頻設備與PC的串口通信。先說一下設備發(fā)送命令后會返回的相應的數(shù)據(jù):5 q1 u9 D9 e: L5 Z0 O8 B- u

& ^% g0 N+ l, a7 P. R當發(fā)送命令"H!i"時,為尋找芯片。
1 F6 x; u. X0 u3 d當設備連接正確又無芯片在感應區(qū)時,設備循環(huán)返回:0630 和 1537! h- b! I$ j( d- r( R
當設備當設備連接正確而芯片又在感應區(qū)時,設備返回0630,稍有停頓,繼續(xù)返回4831+其他信息7 e) n. g9 g' ]1 T4 \  y1 V' w

5 ~( w% S4 e% U5 ~% \( E0 Y8 L' v' C當芯片在感應區(qū)時,發(fā)送命令“R00000016U”,讀取芯片前十六字節(jié)數(shù)據(jù)
8 V2 ^" d4 Z6 J5 h7 k& T* ]& Z( [沒有錯誤時,設備返回:0630
* O+ ]7 i' B3 C! w+ W, A$ j  J1 [此時,發(fā)送命令“STX”,或十六進制命令“02”/ C& a7 @: I5 ~0 l# A2 o- M' F; `
設備返回前十六字節(jié)數(shù)據(jù)8 R% a( W- J- z. X  y" d+ s" j6 V

6 q) n2 x0 i, d5 j# c之后繼續(xù)發(fā)送命令“H!i”,尋找下一個芯片
5 ^* [% Y" s5 I) R9 U' @; C9 R( j9 t--------------------------------------------------------------------
9 ~4 ~' \+ v% F* v+ j! F1 b項目用MSComm進行串口通信6 l1 |( _# X; I- W
需要將上述幾條命令循環(huán)起來。我用的是比較MSComm1.Input是否為爭取的返回值“4831”和“0630”。' P! C  z8 C7 c& V  G( @2 a; U+ t  t" F
用了三個timer來控制三條命令“H!i”、“R00000016U”和“STX”的發(fā)送。把發(fā)送命令都放在了timer_timer下。% f) h2 w  v3 M$ Z1 G( L4 k
但是這樣的話,就用到了三個Private Sub MSComm1_oncomm()。系統(tǒng)報錯,“發(fā)現(xiàn)二義性名稱”。意思應該是不能重復定義Private Sub MSComm1_oncomm()吧?
( b8 R, b( _9 r" V----------------------------------------------------------------------------1 q) \, _8 E: u0 z
其實程序說簡單些就是:
* i9 z% X+ U8 ?發(fā)送命令—>從數(shù)據(jù)返回區(qū)判定->發(fā)送命令->數(shù)據(jù)返回區(qū)判定->再發(fā)送命令->接收數(shù)據(jù)" T9 r9 W$ E* ^+ M$ r7 w9 q4 t9 C1 C
這個循環(huán)要怎么實現(xiàn)呢?& Q" @. i1 \; u$ d! {, F7 y
先謝謝各位!9 n2 ]& U2 G% F' ]1 g" d# x

% A* Q6 a- {3 {0 r--------------------------------------------------------------------
; Y' s4 t' z, J6 P7 r! i, r# r7 W下面是循環(huán)部分的代碼。系統(tǒng)報錯% t. L; X% \. x
Private Sub cmdStart_click()2 n* G, [0 ^! v: m: t7 n+ I2 ^
    Timer1.Enabled = True: H3 L/ G# c, o7 q1 b
    * P! T* F8 r* K2 B9 R2 x
   7 {! @# Z3 u' h+ k
   
3 J& s5 O. Q3 w* G' g* D3 ~1 aEnd Sub
' t. I7 M* E% fPrivate Sub timer1_timer()( p: ]: ^9 O# [- p4 \
   
4 [% w# O+ V* D+ Q/ R   MSComm1.OutBufferCount = 0 '先清空緩存
9 A2 _( s1 I, X6 X+ L   sendbuffer = "H!i"
6 P- r; H' _0 L   MSComm1.Output = sendbuffer
3 h+ b8 K0 W8 }2 k" ^( i/ UEnd Sub
. o3 z% w$ @+ O/ @'結束6 s9 @! u+ w- n
Private Sub cmdStop_click()
3 g6 S5 m5 B8 E" w    Timer1.Enabled = False- S0 E" b! ]( |( i6 e
    Timer2.Enabled = False
7 H1 ]5 \6 b: F% q2 g; |6 q    Timer3.Enabled = False
) ^! C/ V/ W8 A: `; BEnd Sub/ a( c* i% N9 \$ @0 C
* n1 f' q  E& S# v
'接收數(shù)據(jù)1 i8 Y6 |# ]% ]7 u/ X& M) B5 R% u5 h
Private Sub MSComm1_oncomm()
7 {) R) N  o+ R/ n3 e0 M, K4 w    Dim inbyte() As Byte& Z. }6 _: D' A  U' u# ]1 \
    Dim revbuffer As String
6 U0 F& F& A, T* w1 D    Dim a, i, b
' o- o) z: p+ I3 K; P1 U& g3 t. {+ ]    Select Case MSComm1.CommEvent
8 S4 _* f7 b$ Y; R% R, ~" O! p       '如果有CT在感應區(qū)2 O3 o5 v0 h, _+ u/ |
        2 a. D1 Q: w4 A  F* u
        Case comEvReceive
. n& f' J$ W# w1 t            inbyte = MSComm1.Input8 H' I2 p$ g. T6 {
            For i = LBound(inbyte) To UBound(inbyte)            '返回數(shù)據(jù)轉換為十六進制
; W7 M+ F9 V* O2 S/ s* j# [0 c+ n                revbuffer = revbuffer + Hex(inbyte(i))
( T5 [( z$ p. V0 F: o3 C9 G4 N            Next i
1 k8 T& W  q. O# D4 o* s0 y            txtHex.Text = revbuffer; b) E% U9 O/ l2 {& z
            If Mid(revbuffer, 1, 6) = "480310" Then
& V" R. _# o4 s, i                Timer1.Enabled = False
( M$ y1 d# ^; i                Timer1.Enabled = True* {$ A0 ]" ]% n+ r1 |
            End If/ U/ H6 n* E2 n. E* J
        End Select) X0 k+ R5 i# h  S! v6 h. D) E
        Case comEvSend1 L5 i- T" N% P: h
    End Select+ C+ Z/ q' f! Q5 s
Private Sub timer2_timer()' Q) v3 k; J1 A5 r! Q3 O/ X, `
        MSComm1.OutBufferCount = 0 '先清空緩存7 ]% f9 z) X, c% t9 |3 u
        sendbuffer = "R00000016U"( Z6 L8 P) q# H( A8 ~1 _  q2 w$ b
        MSComm1.Output = sendbuffer% A5 T& [7 H6 Y2 O, @
End Sub( P; d; D( i6 N  k
Private Sub MSComm1_oncomm()
0 L" O. Q+ T% D$ W" ~3 I. D    Select Case MSComm1.CommEvent
# M- c: J: c1 k8 T9 h8 E        Case comEvReceive
4 {: Z% g: ~, ~% @: g9 {        inbyte = MSComm1.Input4 V- j3 W; |" |5 n
        For i = LBound(inbyte) To UBound(inbyte)            '返回數(shù)據(jù)轉換為十六進制; |' z& y) X; z) O2 a+ V& I
            revbuffer = revbuffer + Hex(inbyte(i))
: a# M/ X& j0 `/ K8 E" {        Next i- Q- `& ~/ d; s9 `8 o
        txtHex.Text = revbuffer* y& {  {1 s# n5 G2 V
        If Mid(revbuffer, 1, 4) = "6030" Then
- ^8 x8 \% C8 K' T            Timer2.Enabled = False. p. [; v- X9 _8 q" g& |6 K
            Timer3.Enabled = True
+ X6 L* f& W6 ?. P2 N5 O        End If# F/ {) Q& d9 l: p
        Case comEvSend) \8 T9 Q1 B/ ], Z
    End Select
" m2 q$ s3 {, b, ^! ~End Sub
$ R' J& [0 L1 OPrivate Sub timer3_timer()
8 [  f9 V' J$ W, N% L% E0 ~& M    MSComm1.OutBufferCount = 0 '先清空緩存6 ^- V/ k9 [" r( l
    sendbuffer = "STX"9 k- X% j+ I/ y7 i3 e0 r6 P9 o
    MSComm1.Output = sendbuffer- A" y9 a& v0 A( W- r
    Select Case MSComm1.CommEvent
6 S  F( j. U5 {  w' n& }$ \        Case comEvReceive0 o# x( ]# {" u9 e; p4 U
            inbyte = MSComm1.Input1 K4 ~1 h1 d& @4 V
            For i = LBound(inbyte) To UBound(inbyte)            '返回數(shù)據(jù)轉換為十六進制- u1 L* ~/ ]6 G/ R- _- P4 Z5 B
                revbuffer = revbuffer + Hex(inbyte(i))
8 H& d6 X9 y1 x  F( m5 G' }: d            Next i, o: g' `' n! l
            txtHex.Text = revbuffer& d. `9 ?: V& |) T
            Case comEvSend$ g! C( o. L' h1 C; g7 q
    End Select3 S9 q! ?( X% ?1 Y9 F- {, c4 l6 S
End Sub
$ a' }5 M7 g; K3 u  d/ N$ y& [' \, W! P: t0 D, N3 ?! o: W
7 Z6 A0 P5 K* v2 _% B0 f

" e1 e3 G4 t" j& a) l) g
回復

使用道具 舉報

2#
發(fā)表于 2011-4-1 09:22:34 | 只看該作者
這個問題感覺不難,但你描述的有些亂,讓人看不明白。* c2 J: A" p' }* |4 s
我也用Vb編過一些東西,歡迎交流。

點評

只是,直接拿源碼來問,比較浪費人時間。最好是拿流程來問,流程沒問題才考慮語法的問題。  發(fā)表于 2011-4-6 19:41
呵呵,是這樣的,在那壇子里有個ID和大俠的郵箱居然一樣,故有此猜測。那壇子現(xiàn)在注冊要邀請碼,而且居然有人賣ID,可見比較搶手,俺還是頭次見非“黃”網(wǎng)站這樣搞的。 編程,俺多年不上手了。  發(fā)表于 2011-4-6 19:40
g了一下“博學天下”,還真有這個論壇,看來不是大俠取笑在下了。鄙人以前為了畫圖偷懶,就學了下編程,后來貿貿然想轉行程序員,沒成功,但興趣一直不減,見笑了。  發(fā)表于 2011-4-6 16:58
難道大俠在博學天下有號? 方便幫俺下個標準不?先謝了  發(fā)表于 2011-4-6 16:54
前輩好像是韓劇里面的稱呼啊,鄙人愧不敢當……  發(fā)表于 2011-4-1 09:36
謝謝前輩!  發(fā)表于 2011-4-1 09:27

評分

參與人數(shù) 2威望 +2 收起 理由
happqiwei + 1
robi + 1

查看全部評分

回復 支持 反對

使用道具 舉報

3#
發(fā)表于 2011-4-6 16:50:39 | 只看該作者
不知解決的如何了?三個Timer確實很混亂。

點評

大俠博學啊,哈哈  發(fā)表于 2011-4-6 18:37
回復 支持 反對

使用道具 舉報

4#
 樓主| 發(fā)表于 2011-4-6 22:47:31 | 只看該作者
回復 無能 的帖子
. O3 n$ d& t2 j/ K8 X% `2 @- n5 m( m' {& \* E  {  p0 P- c. j7 |
快了。
: D6 ~( _; N) |3 d! H4 U9 q* w設備通信協(xié)議我沒看清,這個設備的通信不用timer。0 o- }; Y" \* C4 l
回復 支持 反對

使用道具 舉報

5#
發(fā)表于 2011-5-4 22:34:47 | 只看該作者
學習、、、、、、、、、、、、、、、、、、、、
回復 支持 反對

使用道具 舉報

6#
 樓主| 發(fā)表于 2011-8-15 20:09:08 | 只看該作者
后來發(fā)現(xiàn)其實這個通信程序的關鍵在于要弄清收發(fā)信息的格式,也就是MSComm初始設置時,是二進制還是文本。這個很重要,否則通信會出錯。
回復 支持 反對

使用道具 舉報

7#
發(fā)表于 2012-11-15 11:31:42 | 只看該作者
讓我想起了,我畢業(yè)論文就搞的這個。
回復 支持 反對

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊會員

本版積分規(guī)則

小黑屋|手機版|Archiver|機械社區(qū) ( 京ICP備10217105號-1,京ICP證050210號,浙公網(wǎng)安備33038202004372號 )

GMT+8, 2024-11-20 03:34 , Processed in 0.055257 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回復 返回頂部 返回列表