找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 8574|回复: 6

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

[复制链接]
发表于 2011-3-31 21:03:06 | 显示全部楼层 |阅读模式
项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:
( m3 L) g" h9 A2 {/ V0 Z/ p( x  V; J# b/ l* l& R( l
当发送命令"H!i"时,为寻找芯片。
& C# P. w( l& {: i4 P1 |当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537+ V& v: t  W# p. e' ]
当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息, `1 I5 u; o  l$ m: u1 A
' S% n( W) J+ q
当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据
# ?- O2 g9 ^3 i# f没有错误时,设备返回:0630- a% D; B# ^* i' V9 y6 C) @" d# i
此时,发送命令“STX”,或十六进制命令“02”1 |5 ~" u1 w3 `2 X1 ]3 e
设备返回前十六字节数据
4 C" m, u# R! D# q: k" N( b5 A* Q* m
  W4 W! J& `( c之后继续发送命令“H!i”,寻找下一个芯片
# U5 z, X/ f" L& _+ [# q( E' d--------------------------------------------------------------------9 c+ {# w( P( Q, Y+ F$ g- t
项目用MSComm进行串口通信
( d8 h* k) n6 Z' `4 u. g0 O需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。
3 C: v: Y4 N, ^2 r用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。
  F  L4 j5 y& b但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?
( F5 g8 M2 y, J----------------------------------------------------------------------------# L9 @6 b8 X: P7 j
其实程序说简单些就是:
' K. k; |# O# z9 J8 ~. A发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据2 u# c9 \3 @. O8 w* U  \# T( b' w
这个循环要怎么实现呢?( H  z: i/ b$ f: I* m& p
先谢谢各位!- O# Z  ~# X; @% V- o

) E% b5 D5 C% w8 c! s& ^--------------------------------------------------------------------
/ z' Y' n% D+ d! M! ?下面是循环部分的代码。系统报错& U3 ~1 v& A; {1 S' D4 v
Private Sub cmdStart_click()3 |9 j0 L+ d( J8 K' {0 ^: N
    Timer1.Enabled = True- O2 o$ U/ |1 ^. q8 |  y
    ; d7 D4 [- w; C5 {3 e) R8 ]
   4 W2 n! X# b2 b" @  i  ^
    , _% r2 t* T3 Q1 f% W3 M. S
End Sub6 Z# H% V: [0 R) }: c: U
Private Sub timer1_timer()
5 j: s  a  k8 u   6 {9 y! {5 Z% b7 d9 h7 K
   MSComm1.OutBufferCount = 0 '先清空缓存
) t, e5 o1 X/ w; n) s- x3 ~   sendbuffer = "H!i"0 D& Q& p  [; ^( d7 m1 a$ m8 U- b
   MSComm1.Output = sendbuffer) @5 t# F) V' ^( q' b
End Sub
8 I2 q" t0 V7 p* i/ ?& Z8 {'结束
: y9 K! ]6 [: ?Private Sub cmdStop_click()
3 I. J( L5 j+ w- R' }! w    Timer1.Enabled = False) |1 B' M( x, k: o7 S$ L" y% W" \
    Timer2.Enabled = False2 r  _6 P% [7 ~/ Z
    Timer3.Enabled = False  p  b7 D- o8 X1 k2 y" e3 |' _
End Sub; a) e' {2 Y; j: ^0 A$ C
" B4 h! u* w& E( n" f7 u
'接收数据
! o$ S. O" h8 p$ cPrivate Sub MSComm1_oncomm()
5 k' [# y0 s: y  s2 I) g, b7 m    Dim inbyte() As Byte( i6 r& L% E! f  d2 g9 ^, ^
    Dim revbuffer As String( y( T+ V7 D- |
    Dim a, i, b' v) U1 T4 W0 c; m. N, e4 w
    Select Case MSComm1.CommEvent
* k% B1 i9 [/ c; f       '如果有CT在感应区
7 _% M+ ~$ X. _3 ~/ |        ( q1 |1 M9 s0 e$ {
        Case comEvReceive
6 s/ u  v$ T6 O! `6 U7 q6 X            inbyte = MSComm1.Input
+ z; t" r8 z+ U9 ?* j5 K/ T            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制1 g, e3 f2 O- T. z3 @
                revbuffer = revbuffer + Hex(inbyte(i))
) o+ O- n/ e0 e  z% A* _5 n            Next i7 }8 u  s) ^" s' b" h8 r
            txtHex.Text = revbuffer
5 ]0 v$ l) Q% ~) B, P            If Mid(revbuffer, 1, 6) = "480310" Then
* r* h! o+ ?) }                Timer1.Enabled = False
. T9 x9 c$ ~" {- b% v' Y3 Z5 ?- m                Timer1.Enabled = True
1 [5 w0 l7 Z6 t            End If
4 r/ V) E- ]- d5 V/ i* C        End Select1 B4 |8 D  i; u2 j( p' c. x
        Case comEvSend
  V# H3 a3 x5 |7 h4 r    End Select
4 K5 R9 ^2 D' [Private Sub timer2_timer()$ e& k9 l7 U# |7 ]  b) t- t
        MSComm1.OutBufferCount = 0 '先清空缓存/ Y5 W+ {' o+ m3 A1 P" Y
        sendbuffer = "R00000016U"
% P% B8 o& W- g% x. p4 F" @        MSComm1.Output = sendbuffer
* K5 M* G- r: U, P) |End Sub* Y+ ^+ U& i3 z5 h$ Q' f2 U3 u
Private Sub MSComm1_oncomm()
4 r$ _) g- R* K5 K    Select Case MSComm1.CommEvent  G: [! i1 J4 y1 m* \: Q
        Case comEvReceive
9 Q. O' R/ Z! Y- @0 `: Y        inbyte = MSComm1.Input
( m2 w" y" q4 {' ^5 v        For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制
* W! L8 r8 P% L6 i% D& t9 [            revbuffer = revbuffer + Hex(inbyte(i))
+ ^) i& ~% m" t        Next i
$ b& }' a9 M8 k        txtHex.Text = revbuffer% B8 J- Y" k6 _: r
        If Mid(revbuffer, 1, 4) = "6030" Then
& Y7 U% q' Q6 v  w' W  s            Timer2.Enabled = False
# f- D5 p7 _' T8 Y            Timer3.Enabled = True8 m$ s3 A3 E1 z* y1 b
        End If; h) S5 n& x1 t, D
        Case comEvSend' l, X( l* m+ f9 a9 g% c
    End Select* q7 m% I( u% H, m: q+ w
End Sub
5 U. m6 q& i2 jPrivate Sub timer3_timer()3 P; ^+ I, ]8 ^9 X! ~/ A! q" o
    MSComm1.OutBufferCount = 0 '先清空缓存
9 n: W2 c! [& [5 }3 l! a    sendbuffer = "STX"2 f( f$ P6 m( w8 @8 h5 V7 l
    MSComm1.Output = sendbuffer
+ v7 G2 X: B  I+ e% [" B, E    Select Case MSComm1.CommEvent
* `" h1 J$ I5 `/ J! ~. p0 d: T        Case comEvReceive
$ V8 n+ A( E+ @( o            inbyte = MSComm1.Input6 T- h, A/ `- l2 h% ?& M
            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制, {0 n4 Q/ n+ @0 q
                revbuffer = revbuffer + Hex(inbyte(i))/ N. Z0 y) R8 D' |- m- t
            Next i3 V" p; P! @# |
            txtHex.Text = revbuffer
8 }# r: }. u: Q) l            Case comEvSend
/ H) C6 {9 r1 i0 a9 {4 l) i    End Select
( T8 Y, ]& k/ E6 UEnd Sub3 f% Y* c  }) n" E
8 c* L2 t; n: r4 E* L0 S
2 D; Z' H% ?) T2 j+ W
1 r/ R$ }1 i# c' g
回复

使用道具 举报

发表于 2011-4-1 09:22:34 | 显示全部楼层
这个问题感觉不难,但你描述的有些乱,让人看不明白。
9 N- M6 V! F1 b3 m7 @9 u. [6 Z我也用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 | 显示全部楼层
回复 无能 的帖子
, A7 k4 x6 u4 ?/ ~/ ]
! A% d8 ?" P1 `  ]) @: z快了。0 X$ m& O; ^# f8 g* q0 X: D; K
设备通信协议我没看清,这个设备的通信不用timer。7 I: ~' V" ^1 F" S* A' x7 Q) C
发表于 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:58 , Processed in 0.087989 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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