機械社區(qū)

 找回密碼
 注冊會員

QQ登錄

只需一步,快速開始

搜索
查看: 8174|回復(fù): 6
打印 上一主題 下一主題

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2011-3-31 21:03:06 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
項目需要用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' {
回復(fù)

使用道具 舉報

2#
發(fā)表于 2011-4-1 09:22:34 | 只看該作者
這個問題感覺不難,但你描述的有些亂,讓人看不明白。$ U' L. m4 e  h
我也用Vb編過一些東西,歡迎交流。

點評

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

評分

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

查看全部評分

回復(fù) 支持 反對

使用道具 舉報

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

點評

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

使用道具 舉報

4#
 樓主| 發(fā)表于 2011-4-6 22:47:31 | 只看該作者
回復(fù) 無能 的帖子' ~7 d8 T  a3 N' g

# j) I" |. c+ {: a* X  K  U快了。; w, ?3 {) W. Z
設(shè)備通信協(xié)議我沒看清,這個設(shè)備的通信不用timer。0 F: a3 {* z. b* l( V* s7 \
回復(fù) 支持 反對

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

GMT+8, 2024-9-27 05:58 , Processed in 0.054135 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回復(fù) 返回頂部 返回列表