找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 8573|回复: 6

求助:VB6.0 MSComm控件串口通信发送循环

[复制链接]
发表于 2011-3-31 21:03:06 | 显示全部楼层 |阅读模式
项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:
) m, L% i5 j  u$ H- m% f3 e' F6 e2 x3 u5 L, \0 o! l" ?
当发送命令"H!i"时,为寻找芯片。3 j& U# L/ t% e. }
当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537
# J, ?7 g. y0 G, T) O2 o当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息
  a4 |+ i" |" ]1 |. Q8 B0 E0 z5 o$ q/ U8 w, q
当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据# Z6 N/ s" x$ l* L' t! e* z% V& `' r$ ^
没有错误时,设备返回:0630, R' q) ?0 [  n3 ^
此时,发送命令“STX”,或十六进制命令“02”, {/ m: i0 v' ]- P8 |5 ^3 T6 l1 S& M
设备返回前十六字节数据
9 g* F5 V5 v2 J) G0 |  f; a, R4 z  t; c: i% N7 G" X+ [5 K0 N
之后继续发送命令“H!i”,寻找下一个芯片# L; A1 ]/ e6 y3 X. r
--------------------------------------------------------------------& [0 G% {9 \; j# J  S
项目用MSComm进行串口通信
& k. i% _+ w3 y1 A5 X5 e. n8 z/ ]需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。
2 J: Z$ |4 X7 ~3 c: h) F用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。, n# R1 [- p4 j+ v) {$ N( ^
但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?( ^3 e# ?& j- {! r+ Q4 X- i2 F; H. P
----------------------------------------------------------------------------
; ^. @' @, ?* K9 r其实程序说简单些就是:
6 T4 y) ?1 n: M6 ]0 F* p- H发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据; ?9 e; x- w4 A5 J1 `# j
这个循环要怎么实现呢?+ t! ?/ r% `) n6 o* r9 L
先谢谢各位!( J- k5 z2 t- w: I

% b% |4 @& E& _" ^--------------------------------------------------------------------
) ?. R3 x6 |& l- l: B# [, K下面是循环部分的代码。系统报错
: _4 z8 T7 d0 ?' nPrivate Sub cmdStart_click()
1 a2 `* U) Y0 h$ N! P- W    Timer1.Enabled = True6 Y6 X  C0 D4 m- s; P( ~) z+ N
   
4 e. `- w0 h$ {8 s! q! \   
' q$ v% X+ g8 T   
  N5 Z* W: w5 n3 N: p& I% MEnd Sub7 X9 I8 h" u; G8 L7 p. n- G6 |
Private Sub timer1_timer()
& w& D% W" l6 Z. w9 _  {5 X: H& D% T8 S   1 J9 i- \; E1 F3 G7 d' w
   MSComm1.OutBufferCount = 0 '先清空缓存3 |$ V) T4 A0 s3 M' P& Z6 @, y
   sendbuffer = "H!i"* u8 _; N3 \% D) n# u- {; Z  C7 }
   MSComm1.Output = sendbuffer
) ]9 T( Y6 ~: g& G8 K8 w( YEnd Sub- L7 g( ^, \) l* G& b8 d7 A
'结束. K. f# o; \6 Z4 l8 e
Private Sub cmdStop_click()
. S$ H! V2 P. P, Q% c    Timer1.Enabled = False
9 M; R) [% L; w1 b' m, O4 f    Timer2.Enabled = False
- b- G/ e; T" [$ Q+ w8 S  D    Timer3.Enabled = False7 D- L# I8 R# E7 O
End Sub
7 q/ t4 A) J* q3 e# R
6 M, w( ~5 n  K9 V1 z( c'接收数据
4 f4 r. i( h6 e- P7 PPrivate Sub MSComm1_oncomm()" q% a. z7 Y7 e; l
    Dim inbyte() As Byte
: C$ ?- ?: i4 n    Dim revbuffer As String
# i9 Z' k. Z! V: R    Dim a, i, b
) D9 G2 ^1 t- u% j9 Q" }    Select Case MSComm1.CommEvent
; ]7 R+ P" n7 Q* ^6 T7 B       '如果有CT在感应区1 }1 m2 A$ H( F0 X  }
        
# }  i' J1 M3 Z        Case comEvReceive& ~7 e. [* N" Q6 R& M. P5 }' {
            inbyte = MSComm1.Input& G7 x+ A, k! ]3 I' a' x
            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制( \; w8 B1 y& R' }8 F& q. I. j0 X
                revbuffer = revbuffer + Hex(inbyte(i))
- o7 J4 m9 e# g3 `# p            Next i
/ V' W. {" Z' @& m' k2 v; }            txtHex.Text = revbuffer  n, ~1 w7 ~- i3 F, O4 T( N
            If Mid(revbuffer, 1, 6) = "480310" Then
0 T$ A: p; k* S, d/ u; k1 b                Timer1.Enabled = False
. U3 J& Y% @; |. a* E, M                Timer1.Enabled = True
- p+ e! b6 T" @( d/ v1 M            End If* M" e! f/ m1 x  _" f
        End Select+ o+ ?; {7 L5 U8 N1 C
        Case comEvSend& P+ O$ P- S9 i4 I: h
    End Select
5 I9 N- O; a* d" cPrivate Sub timer2_timer()* \+ Q$ v$ S/ T8 M" p
        MSComm1.OutBufferCount = 0 '先清空缓存
: G  V* ~) n/ \& w* ?8 F        sendbuffer = "R00000016U". a& B; Z! @8 |7 n' d
        MSComm1.Output = sendbuffer
$ I' q+ Z$ Q! E/ uEnd Sub7 |- \8 t2 ?3 F
Private Sub MSComm1_oncomm()
, l+ l' d4 Q) b( C( u5 i% D7 G    Select Case MSComm1.CommEvent* a' f& O) w: E4 D* z" V
        Case comEvReceive7 K& X' W9 r: a0 y! h
        inbyte = MSComm1.Input0 w$ r9 Y# O. ^, d
        For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制
# O  H( u% D1 Z1 ^6 |; K            revbuffer = revbuffer + Hex(inbyte(i))
3 O; Y- d6 O8 Y3 @  c& [/ X, s        Next i# |4 C- q- h, J  R+ t8 a. u
        txtHex.Text = revbuffer
# Y  o- `3 c4 A" d( a: ?        If Mid(revbuffer, 1, 4) = "6030" Then
$ v/ ]: g+ e+ m* c! f            Timer2.Enabled = False( @9 [/ u1 m( Q/ M/ {' N: H+ ~
            Timer3.Enabled = True
. g, I" S4 d- q" P        End If
2 `2 M2 h  q1 n+ Z6 w        Case comEvSend
. u3 D5 e$ }; n; P! K    End Select/ {$ {! |- M1 f+ _: B% O5 \2 Q* G" I5 Q
End Sub
8 [8 ]9 n# y0 l/ _4 zPrivate Sub timer3_timer()
/ D1 j4 V- M- Y! e- I    MSComm1.OutBufferCount = 0 '先清空缓存
" R! D8 z5 ]) @( ^/ m5 x3 |. P2 q) o    sendbuffer = "STX"
( V  m- u0 U8 d9 ^3 h- V9 V" E4 g    MSComm1.Output = sendbuffer' a% }6 C, W7 [% X8 N6 N# d
    Select Case MSComm1.CommEvent
5 N" @# `& T$ D5 B( f. O0 F        Case comEvReceive
  L% G5 ]7 l4 X. W2 J3 J9 D9 P            inbyte = MSComm1.Input
& w3 l  `" C1 r' g9 z; {) f            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制6 V. B! ^* P" M3 y
                revbuffer = revbuffer + Hex(inbyte(i))
: p) Q) V0 ~' [5 F            Next i
* P/ R1 Z* c0 [3 w: b# p  d            txtHex.Text = revbuffer
( R" |* h0 f" ~9 N: Y) e            Case comEvSend
7 V* F# m, N. e& q3 `0 v    End Select8 K( W- f) F8 w1 t, S
End Sub
" i0 R# p2 t! t" @( a+ h- Q0 W0 q8 b7 \) R  m3 N

" y# J; @, H7 D. J. [( q# [, Z* R/ f5 {) f2 J) y/ Y+ b/ \
回复

使用道具 举报

发表于 2011-4-1 09:22:34 | 显示全部楼层
这个问题感觉不难,但你描述的有些乱,让人看不明白。$ s' M0 q3 Z) N% c' c
我也用Vb编过一些东西,欢迎交流。

点评

只是,直接拿源码来问,比较浪费人时间。最好是拿流程来问,流程没问题才考虑语法的问题。  发表于 2011-4-6 19:41
呵呵,是这样的,在那坛子里有个ID和大侠的邮箱居然一样,故有此猜测。那坛子现在注册要邀请码,而且居然有人卖ID,可见比较抢手,俺还是头次见非“黄”网站这样搞的。 编程,俺多年不上手了。  发表于 2011-4-6 19:40
g了一下“博学天下”,还真有这个论坛,看来不是大侠取笑在下了。鄙人以前为了画图偷懒,就学了下编程,后来贸贸然想转行程序员,没成功,但兴趣一直不减,见笑了。  发表于 2011-4-6 16:58
难道大侠在博学天下有号? 方便帮俺下个标准不?先谢了  发表于 2011-4-6 16:54
前辈好像是韩剧里面的称呼啊,鄙人愧不敢当……  发表于 2011-4-1 09:36
谢谢前辈!  发表于 2011-4-1 09:27

评分

参与人数 2威望 +2 收起 理由
happqiwei + 1
robi + 1

查看全部评分

发表于 2011-4-6 16:50:39 | 显示全部楼层
不知解决的如何了?三个Timer确实很混乱。

点评

大侠博学啊,哈哈  发表于 2011-4-6 18:37
 楼主| 发表于 2011-4-6 22:47:31 | 显示全部楼层
回复 无能 的帖子# X! h; Z6 O* Y: W, y
' `# |( O* @$ J0 K8 ^" Q
快了。
  f+ n9 u& L- s. p设备通信协议我没看清,这个设备的通信不用timer。
6 m; p& N8 m# ^# {, h3 x4 d
发表于 2011-5-4 22:34:47 | 显示全部楼层
学习、、、、、、、、、、、、、、、、、、、、
 楼主| 发表于 2011-8-15 20:09:08 | 显示全部楼层
后来发现其实这个通信程序的关键在于要弄清收发信息的格式,也就是MSComm初始设置时,是二进制还是文本。这个很重要,否则通信会出错。
发表于 2012-11-15 11:31:42 | 显示全部楼层
让我想起了,我毕业论文就搞的这个。
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Archiver|手机版|小黑屋|机械社区 ( 京ICP备10217105号-1,京ICP证050210号,浙公网安备33038202004372号 )

GMT+8, 2025-8-14 21:53 , Processed in 0.064455 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表