機(jī)械社區(qū)

 找回密碼
 注冊(cè)會(huì)員

QQ登錄

只需一步,快速開(kāi)始

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

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2011-3-31 21:03:06 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
項(xiàng)目需要用MSComm控件實(shí)現(xiàn)射頻設(shè)備與PC的串口通信。先說(shuō)一下設(shè)備發(fā)送命令后會(huì)返回的相應(yīng)的數(shù)據(jù):
" \: @8 [, o+ F$ Z) n  h7 {  g+ _# T& x$ @( v
當(dāng)發(fā)送命令"H!i"時(shí),為尋找芯片。
+ I1 H/ ~+ F- D# p/ I  Z當(dāng)設(shè)備連接正確又無(wú)芯片在感應(yīng)區(qū)時(shí),設(shè)備循環(huán)返回:0630 和 1537" A0 V" L, A3 m; Q1 x
當(dāng)設(shè)備當(dāng)設(shè)備連接正確而芯片又在感應(yīng)區(qū)時(shí),設(shè)備返回0630,稍有停頓,繼續(xù)返回4831+其他信息4 X; w8 N$ C- K5 N9 y# u/ n
4 D" c7 U8 d. Q3 H6 G7 E
當(dāng)芯片在感應(yīng)區(qū)時(shí),發(fā)送命令“R00000016U”,讀取芯片前十六字節(jié)數(shù)據(jù)
; l3 \7 q& \" S% n' D沒(méi)有錯(cuò)誤時(shí),設(shè)備返回:0630
* f+ P5 }- O; J2 u% R: ?; a- B此時(shí),發(fā)送命令“STX”,或十六進(jìn)制命令“02”
) R- x  ]2 ]. c% V5 e設(shè)備返回前十六字節(jié)數(shù)據(jù); u, \! Z7 ^$ G- x

5 c2 T7 d4 G: X6 c之后繼續(xù)發(fā)送命令“H!i”,尋找下一個(gè)芯片1 g/ @2 {( l: s5 y; k
--------------------------------------------------------------------
6 e; X" A) j+ ]" L% {項(xiàng)目用MSComm進(jìn)行串口通信
+ s  \0 j8 M8 w2 t9 q需要將上述幾條命令循環(huán)起來(lái)。我用的是比較MSComm1.Input是否為爭(zhēng)取的返回值“4831”和“0630”。; ~$ d/ F+ L* ^* e1 U* C
用了三個(gè)timer來(lái)控制三條命令“H!i”、“R00000016U”和“STX”的發(fā)送。把發(fā)送命令都放在了timer_timer下。
# |" L: U% L; q- x6 C) j" W但是這樣的話,就用到了三個(gè)Private Sub MSComm1_oncomm()。系統(tǒng)報(bào)錯(cuò),“發(fā)現(xiàn)二義性名稱”。意思應(yīng)該是不能重復(fù)定義Private Sub MSComm1_oncomm()吧?7 H8 ?( q2 w! d$ ^! T, z
----------------------------------------------------------------------------% T( u& C0 l. J! Z' P4 B
其實(shí)程序說(shuō)簡(jiǎn)單些就是:
) r: Y- H0 e+ Y* p3 ]- ~5 s發(fā)送命令—>從數(shù)據(jù)返回區(qū)判定->發(fā)送命令->數(shù)據(jù)返回區(qū)判定->再發(fā)送命令->接收數(shù)據(jù)
; Q9 p, y: Y% \/ K1 O/ r# l2 @這個(gè)循環(huán)要怎么實(shí)現(xiàn)呢?
2 y3 R: l' c8 F; p" Y. V先謝謝各位!
! r1 {) Y  I* _4 y. N
) B- C8 F. c- H" l--------------------------------------------------------------------- m0 E9 `9 b! j4 H
下面是循環(huán)部分的代碼。系統(tǒng)報(bào)錯(cuò)
% k4 H: ^2 a, M4 Q) r, z! `4 ePrivate Sub cmdStart_click()
9 n5 K5 B4 z6 i$ r  T* F* B$ Q# M    Timer1.Enabled = True( y4 O0 l4 D3 E3 V  I3 V" @/ Q
    ' S1 \4 K$ d! }$ m- e
   
. x  J3 @6 W% h0 F   
! F$ N( S& L7 f% A9 X+ T1 r' d  Q' QEnd Sub
, a) z& X* z! ]3 c* D1 EPrivate Sub timer1_timer()
, ?3 E; g) n0 K4 ^- O   
, }5 u8 H* l, B; S   MSComm1.OutBufferCount = 0 '先清空緩存
! a! U+ n4 b# E4 M; ?- Z   sendbuffer = "H!i"; S' N! h9 p4 `
   MSComm1.Output = sendbuffer
8 O1 J* `/ G+ v, kEnd Sub
# h# c6 m' z* g) U5 a/ L'結(jié)束
) P6 r7 ]) }+ p+ H* GPrivate Sub cmdStop_click()$ L6 m& Y: `% J( w
    Timer1.Enabled = False- g+ @: a# I$ J) _9 f/ x/ L
    Timer2.Enabled = False
& k' _! U# F9 G8 ]0 C6 s$ d( ]    Timer3.Enabled = False
" J6 w! j8 H2 V0 R5 L7 \, @End Sub
& W9 i  q- H  n- p
9 \2 f8 q. y1 ~# i" E; L'接收數(shù)據(jù)  |2 F" Y+ a5 p0 C
Private Sub MSComm1_oncomm()8 l8 Y* _6 E+ g2 T7 ]
    Dim inbyte() As Byte/ M. _8 z# T: C- b
    Dim revbuffer As String& @& C. H' E" ]+ ?7 W( W
    Dim a, i, b' X5 p4 v7 a6 y1 l' K+ Y0 U' C( o
    Select Case MSComm1.CommEvent
- C9 f0 B$ f2 Y1 Z       '如果有CT在感應(yīng)區(qū)
5 p: R0 X- g* u9 }0 {* f& D        
4 F2 i1 X3 M- V! v% x' j0 y/ P        Case comEvReceive
# {6 }! {1 k4 g) k5 k6 l& z6 s            inbyte = MSComm1.Input+ m6 B  c( W6 A1 z
            For i = LBound(inbyte) To UBound(inbyte)            '返回?cái)?shù)據(jù)轉(zhuǎn)換為十六進(jìn)制
7 r5 L% t3 }  i                revbuffer = revbuffer + Hex(inbyte(i))
6 o- }; ?. a" r( H8 ?  |            Next i+ A$ k5 W: @9 X4 C: O
            txtHex.Text = revbuffer+ U4 i; _% N# f( C! b
            If Mid(revbuffer, 1, 6) = "480310" Then3 Y) D! u/ \) t: c8 I8 H1 \
                Timer1.Enabled = False/ D; v$ c, s" c: [% b6 \' y6 z
                Timer1.Enabled = True
( O2 W" R6 D1 |/ ?( e; K            End If
8 p( l( N* o* q8 V        End Select& H5 b) d) c0 h( d# \9 P' _
        Case comEvSend2 @/ k, b" O; O: p% t5 ^, e& Z5 H
    End Select/ Y& f: T% ]9 s
Private Sub timer2_timer()! @5 ^1 k# y& ?% f9 C; G
        MSComm1.OutBufferCount = 0 '先清空緩存( x8 b- F6 N3 L# T6 y
        sendbuffer = "R00000016U"/ G# {$ i7 \" c' N$ t
        MSComm1.Output = sendbuffer
" L4 d+ S+ w# Z! A+ s* ?" XEnd Sub
0 S  A) q) [3 h! v: kPrivate Sub MSComm1_oncomm()3 s# P( Q. H' c
    Select Case MSComm1.CommEvent
  C5 Z' H2 F7 G        Case comEvReceive$ c7 y7 W; O# p7 j( b
        inbyte = MSComm1.Input2 Y7 H$ m! J" ^" O# X' ]
        For i = LBound(inbyte) To UBound(inbyte)            '返回?cái)?shù)據(jù)轉(zhuǎn)換為十六進(jìn)制5 ~  s6 U+ i' U3 b
            revbuffer = revbuffer + Hex(inbyte(i))/ \1 B5 U& z7 {, S
        Next i: g) J& k* k, x, z* M+ _+ y
        txtHex.Text = revbuffer
  L8 ^' K% P! i. m9 V8 E  J- C' ~        If Mid(revbuffer, 1, 4) = "6030" Then
$ t- o# N% T! a; Y            Timer2.Enabled = False
5 r9 i; l, _0 Z( \. T  r            Timer3.Enabled = True- h# s4 _' _- x! N7 v
        End If
: W" a9 P& \2 r5 o        Case comEvSend3 B' B9 B8 o+ r. m
    End Select& W, p6 k' S2 [  S3 I
End Sub; V0 _4 h2 G. T  a7 ]( Z
Private Sub timer3_timer()
& m5 W* G* q& ?, N% @; ~7 }    MSComm1.OutBufferCount = 0 '先清空緩存6 z2 h% ?. H. x/ }6 k! G/ K
    sendbuffer = "STX"
; i7 ~  s( v; h+ k6 h    MSComm1.Output = sendbuffer
' O1 M' {8 J7 p1 ~2 q3 M: L    Select Case MSComm1.CommEvent3 a3 ^# L/ g: r' d% a
        Case comEvReceive' m5 j# w) a$ _3 _: R
            inbyte = MSComm1.Input
0 ?: \# Y! V9 w) [& W            For i = LBound(inbyte) To UBound(inbyte)            '返回?cái)?shù)據(jù)轉(zhuǎn)換為十六進(jìn)制; Q3 v9 G" \7 `. _( Q
                revbuffer = revbuffer + Hex(inbyte(i))
& X9 y: y. j' [% A  L$ N4 }            Next i
9 x' |6 `+ o3 X6 p/ `2 v            txtHex.Text = revbuffer* n+ r0 h5 n; T
            Case comEvSend- U$ h, {# o6 w6 V& ^6 M0 `
    End Select# e( U8 f  d9 [0 h. @* L5 L
End Sub
9 h1 g- C8 ]& H. V* b
0 r* R7 G0 J% {$ J
" W! [' q' j) V
6 n: W* g$ f: ]  X$ \
回復(fù)

使用道具 舉報(bào)

2#
發(fā)表于 2011-4-1 09:22:34 | 只看該作者
這個(gè)問(wèn)題感覺(jué)不難,但你描述的有些亂,讓人看不明白。) i3 x. o0 n& P, p% z+ X9 |: H
我也用Vb編過(guò)一些東西,歡迎交流。

點(diǎn)評(píng)

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

評(píng)分

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

查看全部評(píng)分

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

點(diǎn)評(píng)

大俠博學(xué)啊,哈哈  發(fā)表于 2011-4-6 18:37
4#
 樓主| 發(fā)表于 2011-4-6 22:47:31 | 只看該作者
回復(fù) 無(wú)能 的帖子8 P: z: E, ?" b( U
  @' [3 _7 `. ], ?& X7 _$ ~/ L
快了。
9 w3 u* l/ ]3 P3 [' e# }設(shè)備通信協(xié)議我沒(méi)看清,這個(gè)設(shè)備的通信不用timer。' z* {8 h4 i! |$ B! n% s1 U" M
5#
發(fā)表于 2011-5-4 22:34:47 | 只看該作者
學(xué)習(xí)、、、、、、、、、、、、、、、、、、、、
6#
 樓主| 發(fā)表于 2011-8-15 20:09:08 | 只看該作者
后來(lái)發(fā)現(xiàn)其實(shí)這個(gè)通信程序的關(guān)鍵在于要弄清收發(fā)信息的格式,也就是MSComm初始設(shè)置時(shí),是二進(jìn)制還是文本。這個(gè)很重要,否則通信會(huì)出錯(cuò)。
7#
發(fā)表于 2012-11-15 11:31:42 | 只看該作者
讓我想起了,我畢業(yè)論文就搞的這個(gè)。

本版積分規(guī)則

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

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

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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