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

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

QQ登錄

只需一步,快速開始

搜索
查看: 8230|回復(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的串口通信。先說一下設(shè)備發(fā)送命令后會(huì)返回的相應(yīng)的數(shù)據(jù):+ G5 M6 j/ S8 F) f; O1 X

! e. m9 Z' }) V: _* j: j當(dāng)發(fā)送命令"H!i"時(shí),為尋找芯片。
( H: {% P# {% [0 w當(dāng)設(shè)備連接正確又無芯片在感應(yīng)區(qū)時(shí),設(shè)備循環(huán)返回:0630 和 1537
2 \9 W  ?7 e% v0 ?1 J! D  y1 \! W當(dāng)設(shè)備當(dāng)設(shè)備連接正確而芯片又在感應(yīng)區(qū)時(shí),設(shè)備返回0630,稍有停頓,繼續(xù)返回4831+其他信息8 ?6 {% m4 p3 X; s3 n- d

2 B6 I% z+ T4 o, k. K, ^$ E當(dāng)芯片在感應(yīng)區(qū)時(shí),發(fā)送命令“R00000016U”,讀取芯片前十六字節(jié)數(shù)據(jù)) H5 x( s' @* j. U) A0 A
沒有錯(cuò)誤時(shí),設(shè)備返回:06307 d! |" X. ^& A5 e
此時(shí),發(fā)送命令“STX”,或十六進(jìn)制命令“02”
% L1 ^/ ~- C5 n4 s$ E設(shè)備返回前十六字節(jié)數(shù)據(jù)
3 `4 u6 `+ m7 u2 o' T8 \+ n) u+ m: J
之后繼續(xù)發(fā)送命令“H!i”,尋找下一個(gè)芯片2 P* ], f4 ^) }' K& S
--------------------------------------------------------------------
( ]" \1 ~' z* u# p項(xiàng)目用MSComm進(jìn)行串口通信
  _/ ^+ Y% l, Q# }需要將上述幾條命令循環(huán)起來。我用的是比較MSComm1.Input是否為爭(zhēng)取的返回值“4831”和“0630”。5 x2 o! F; \- U4 b4 R
用了三個(gè)timer來控制三條命令“H!i”、“R00000016U”和“STX”的發(fā)送。把發(fā)送命令都放在了timer_timer下。
5 A% Z+ h; V" i" u- ^% l4 |. e; k但是這樣的話,就用到了三個(gè)Private Sub MSComm1_oncomm()。系統(tǒng)報(bào)錯(cuò),“發(fā)現(xiàn)二義性名稱”。意思應(yīng)該是不能重復(fù)定義Private Sub MSComm1_oncomm()吧?) u$ i  K4 k: }7 S
----------------------------------------------------------------------------
, Y5 j% c3 E* V其實(shí)程序說簡(jiǎn)單些就是:7 B9 R# n9 e  E. I5 L* v6 I2 ^, C
發(fā)送命令—>從數(shù)據(jù)返回區(qū)判定->發(fā)送命令->數(shù)據(jù)返回區(qū)判定->再發(fā)送命令->接收數(shù)據(jù)* }+ i+ e" r4 q7 j$ T
這個(gè)循環(huán)要怎么實(shí)現(xiàn)呢?4 a" K6 U+ t+ O# _& R! f- f7 o
先謝謝各位!
( j+ D  O8 `' s2 h3 D+ C; B3 {. S" o
& x2 t: N  _# j2 f--------------------------------------------------------------------
+ R+ S+ \" j" V1 w$ A0 J; G下面是循環(huán)部分的代碼。系統(tǒng)報(bào)錯(cuò)
0 l, ~3 x/ ~! z( K' s+ ?Private Sub cmdStart_click(), U) `; u: P- v7 r: p: t: `$ K' \
    Timer1.Enabled = True
' j/ L7 ~2 ]1 C# c0 H8 N   
. o3 e8 g* M6 c4 |* E   
- p/ z( t5 k6 ?1 o0 N, ]8 Q: g   
# _3 U, U+ J5 O- Z1 ~: h& DEnd Sub4 f& m+ B# [& H+ @/ \+ i
Private Sub timer1_timer()
! t- _/ U/ M% h' l5 p1 ^" B   
6 ~" M: r% _+ e: ]0 ~   MSComm1.OutBufferCount = 0 '先清空緩存, u9 \  z  t1 W, v1 G
   sendbuffer = "H!i"
  ?$ C$ X+ N$ E6 y6 N   MSComm1.Output = sendbuffer
, g2 J; Z8 l3 J8 w5 N0 MEnd Sub1 P& h! h1 U% f( `2 i
'結(jié)束
9 |0 V& k( o+ m# Y9 L+ K$ Y' gPrivate Sub cmdStop_click()4 d) l3 ]& K( R- C& }
    Timer1.Enabled = False
) ^+ v( M/ Q3 J    Timer2.Enabled = False& u; ^" T0 d  c9 K
    Timer3.Enabled = False! L2 ^4 G3 F8 V* B
End Sub
' l* f; u( z( u+ w7 l  Z
: B3 B' W6 a8 ]+ R; y'接收數(shù)據(jù); s6 X: f, |1 c+ j- r7 y! B  S
Private Sub MSComm1_oncomm()
; I$ T5 ]6 }7 S8 i, d3 i    Dim inbyte() As Byte
, B; E- f, ^% L& j    Dim revbuffer As String
8 L8 ]: `9 E$ G: c1 s7 e    Dim a, i, b
* X+ ?( O& X! A" w    Select Case MSComm1.CommEvent2 |$ T) y. f3 H" q4 ^1 h( m5 V  T
       '如果有CT在感應(yīng)區(qū)9 e6 t0 [* P% L+ @3 C# o% B% i
        . ?! i0 L/ L+ a8 x% ]2 A) Z
        Case comEvReceive
5 M1 A2 d  r4 l4 b) q  V5 H            inbyte = MSComm1.Input1 V; j4 x8 r7 {+ E
            For i = LBound(inbyte) To UBound(inbyte)            '返回?cái)?shù)據(jù)轉(zhuǎn)換為十六進(jìn)制
& r6 q# S% Q7 ]+ V+ D9 E; K" Z5 |* n                revbuffer = revbuffer + Hex(inbyte(i))
$ L  u5 c8 o; h            Next i
+ N: y! B% _- P            txtHex.Text = revbuffer: L8 d( q, O7 G& i4 z
            If Mid(revbuffer, 1, 6) = "480310" Then1 q  L% V  F  K4 w9 C  ]- j
                Timer1.Enabled = False$ R2 x+ }/ ^7 h/ c$ o2 d+ N
                Timer1.Enabled = True
$ h3 @/ C8 }# ]$ E# _; f            End If
+ u! z4 Y* a9 Y2 N        End Select
6 ^4 b7 R% Q' s' R- q        Case comEvSend
3 n% O5 J) o( y" q  P2 d) l& s    End Select
3 w+ M* \7 w; h9 R/ M# f4 Z! m+ S- gPrivate Sub timer2_timer()3 U+ b$ Y& X0 k! r
        MSComm1.OutBufferCount = 0 '先清空緩存
' W* v2 o0 M" n: {* l9 O1 H; P        sendbuffer = "R00000016U", B) Y% @1 c# T
        MSComm1.Output = sendbuffer  [, H& p4 F- j& N9 R0 m
End Sub
$ X& @. w7 K$ W4 Q' z$ C1 s' e' XPrivate Sub MSComm1_oncomm()
& O6 u3 x$ v  Y# L# C    Select Case MSComm1.CommEvent
4 N" i) W( v, y3 i  _        Case comEvReceive1 n/ n/ P0 w0 n# \' U; I+ K3 |
        inbyte = MSComm1.Input8 M+ C' V% I; ]8 c/ U6 b' w
        For i = LBound(inbyte) To UBound(inbyte)            '返回?cái)?shù)據(jù)轉(zhuǎn)換為十六進(jìn)制7 l+ j( A3 o: j+ l/ l
            revbuffer = revbuffer + Hex(inbyte(i))( m0 a- \' D: ]6 Y+ A
        Next i
5 c( o& G! F% }        txtHex.Text = revbuffer$ I. N* E* O* r. B
        If Mid(revbuffer, 1, 4) = "6030" Then: U$ O$ ^& Y* `& Y( u
            Timer2.Enabled = False  m9 V4 |& h1 Z8 k
            Timer3.Enabled = True& r  d4 w# r# B+ f! }# l' E( C
        End If
' ?+ D* C" H) {  ?' r& \! k        Case comEvSend
* O3 j) X8 [; ^$ ^' D; Z    End Select2 i4 i. D) I. F
End Sub
6 t0 s( g3 j- q/ A( yPrivate Sub timer3_timer()
& _0 z2 Z/ ?7 ]# k- ?7 t: D    MSComm1.OutBufferCount = 0 '先清空緩存
: g% H( O0 p7 \: L    sendbuffer = "STX"( w( f% _& ~- D0 r
    MSComm1.Output = sendbuffer
! h: ?& J2 _6 s2 d) i. z7 F0 t& f    Select Case MSComm1.CommEvent  b$ G( w9 L2 ^  s& B" e
        Case comEvReceive
7 V/ O, {* i/ Y  j5 f% x" f            inbyte = MSComm1.Input
8 T0 y. R! G( ^2 ~. ^2 O            For i = LBound(inbyte) To UBound(inbyte)            '返回?cái)?shù)據(jù)轉(zhuǎn)換為十六進(jìn)制
  V- R& H( j/ L. S3 }, s! k                revbuffer = revbuffer + Hex(inbyte(i))
: d: K) T5 x4 V# U! [3 O5 [3 D" v            Next i  k+ i' V. t# P
            txtHex.Text = revbuffer* `# ~' o* L6 P$ Z. h1 [9 T
            Case comEvSend/ P% R1 {5 _  u/ r1 l
    End Select
' c# C% N) H. ^. O( kEnd Sub
, I* g. ^+ V) ]
% o  W; W) O! H; D/ y1 v; k- c; E6 F0 b( e
4 A, q1 C; }8 ]
回復(fù)

使用道具 舉報(bào)

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

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

只是,直接拿源碼來問,比較浪費(fèi)人時(shí)間。最好是拿流程來問,流程沒問題才考慮語法的問題。  發(fā)表于 2011-4-6 19:41
呵呵,是這樣的,在那壇子里有個(gè)ID和大俠的郵箱居然一樣,故有此猜測(cè)。那壇子現(xiàn)在注冊(cè)要邀請(qǐng)碼,而且居然有人賣ID,可見比較搶手,俺還是頭次見非“黃”網(wǎng)站這樣搞的。 編程,俺多年不上手了。  發(fā)表于 2011-4-6 19:40
g了一下“博學(xué)天下”,還真有這個(gè)論壇,看來不是大俠取笑在下了。鄙人以前為了畫圖偷懶,就學(xué)了下編程,后來貿(mào)貿(mào)然想轉(zhuǎ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ù) 無能 的帖子( m, K$ Y# Y5 R7 C- j
3 y0 {: |1 B, ?* W2 S/ {
快了。. X4 p( N+ \9 }7 h& a$ M9 E
設(shè)備通信協(xié)議我沒看清,這個(gè)設(shè)備的通信不用timer。
( `4 d. K5 M5 `
5#
發(fā)表于 2011-5-4 22:34:47 | 只看該作者
學(xué)習(xí)、、、、、、、、、、、、、、、、、、、、
6#
 樓主| 發(fā)表于 2011-8-15 20:09:08 | 只看該作者
后來發(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-11-20 01:26 , Processed in 0.049828 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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