找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 8686|回复: 6

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

  [复制链接]
发表于 2011-3-31 21:03:06 | 显示全部楼层 |阅读模式
项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:6 F2 D- _$ c% X& l3 v. C, {
. k* U" @7 T( R. c! O+ m; |
当发送命令"H!i"时,为寻找芯片。/ A) ~: c; |6 S1 H" o
当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537/ p6 j( c# @# \" b6 _5 g6 L
当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息" a$ D- n  i( N- ]5 a5 L) W
5 G+ v* M: x* t7 x( J9 t5 g" g. V
当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据; I" i1 ]- Q: l' _2 H: d. Q8 c% Q
没有错误时,设备返回:06301 n# l* E3 x# P; H
此时,发送命令“STX”,或十六进制命令“02”
6 U5 i# c! @+ m8 Q' @& j0 S7 W设备返回前十六字节数据
. @' j3 F0 n% Q: ~" U& \5 S5 F
5 p# U& g6 [0 U  |( Z1 r之后继续发送命令“H!i”,寻找下一个芯片" b, n3 f- A; }1 f: b& W+ {
--------------------------------------------------------------------5 c2 Y. L; P# M& I+ j' i
项目用MSComm进行串口通信
9 y" h, [5 ^( u. d6 R( \需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。$ `! j" E& j$ K$ g/ w
用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。
5 Z% s; d/ ?+ b) B但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?
! ]. F( f3 A& R4 @  b) k----------------------------------------------------------------------------
6 H$ V/ G& A9 v: G其实程序说简单些就是:
( t$ _: A# @$ r9 Y发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据
* n) y- m# e0 x这个循环要怎么实现呢?5 y2 s# t7 ~* B8 j# z" a" L. z$ L- ]
先谢谢各位!# P  |3 P& P, t0 A

& x; @6 X2 T& W3 A9 }' Z, x--------------------------------------------------------------------; p7 K( i6 X% V8 R$ O
下面是循环部分的代码。系统报错
- n" m3 m( s+ {3 y- y/ U8 y+ Y- uPrivate Sub cmdStart_click()$ {2 V3 B9 q( N7 @0 w. d  U
    Timer1.Enabled = True
  @$ l2 I2 G  \5 g, e) [: ^    8 _" g4 S3 V& d- r* {- O
   
) k, i# w. E7 a; K6 K    $ l; H# Z8 e# J
End Sub
) l5 {2 i, m/ B/ b6 v! rPrivate Sub timer1_timer()
/ ?, ~4 j5 j7 n* i) l% J0 r; g2 M   % e0 x+ V" ]4 z% e/ y
   MSComm1.OutBufferCount = 0 '先清空缓存
, {3 ?. b3 N2 s% u7 f   sendbuffer = "H!i") D  b' }( s7 \2 [5 w, H( [" z
   MSComm1.Output = sendbuffer
+ Y. F% m* ?6 \End Sub0 u* e0 e9 j3 Z# ~
'结束" J: f7 B# w, S. B$ I2 q
Private Sub cmdStop_click()) k9 h3 u9 k; L6 N9 E/ d" l9 r
    Timer1.Enabled = False4 R, D+ b- P0 b3 T6 }% m8 P
    Timer2.Enabled = False
6 E3 c' y2 E. t/ e6 M% C    Timer3.Enabled = False# |6 Y7 c0 M, D4 m9 I" W: w
End Sub) g6 A3 O+ k3 `4 Z8 C* n% w- r0 Y
* c6 U3 Z% m, B4 |) K
'接收数据! [0 I9 y" @3 ?
Private Sub MSComm1_oncomm(): z/ o) w% O  U6 c/ r0 a
    Dim inbyte() As Byte
6 k' ^* h0 b2 f7 a    Dim revbuffer As String# d% Z% l  ]' k5 ]$ p! K: B; _
    Dim a, i, b6 `2 m- |! |6 Y! A$ b
    Select Case MSComm1.CommEvent+ {1 y9 E. k; e1 y
       '如果有CT在感应区
+ q$ u; k- e% i, m5 ^5 S6 f) f$ Q0 z( L        + [7 R. R/ X+ Q  ]7 h1 t/ |  @
        Case comEvReceive4 s$ o/ K1 h! S/ Q* V; b
            inbyte = MSComm1.Input* ]/ T* B+ {* g/ y; l6 X; P
            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制+ D: Z/ z4 Q% u
                revbuffer = revbuffer + Hex(inbyte(i))
  ]) ~, F8 l. y  W: g2 v* [  E            Next i% K' B9 \; D5 Q' S& D5 k! X4 k
            txtHex.Text = revbuffer# _  A1 C# P+ B6 G9 R) H
            If Mid(revbuffer, 1, 6) = "480310" Then
# S" y3 B$ f; T# O                Timer1.Enabled = False( g4 v& Q1 Q# l9 J6 ?$ G
                Timer1.Enabled = True/ B5 n% y2 A  T) e2 [2 r
            End If- z$ ~, N% Y2 S+ h% b
        End Select: t" w9 X3 J' S
        Case comEvSend  I% l7 A9 I/ G$ D0 _% ~. O& s
    End Select
/ c/ p$ d2 ]6 Z. OPrivate Sub timer2_timer()
) Y! b& a; g  i2 _* ^        MSComm1.OutBufferCount = 0 '先清空缓存
$ x# K0 j0 I: ^        sendbuffer = "R00000016U"
: x0 x: |  a2 u0 M: Y3 p2 k+ @        MSComm1.Output = sendbuffer
3 @/ t; s: T( s+ \' @5 I3 I' @End Sub3 f6 G) s# W, `7 _  `* g
Private Sub MSComm1_oncomm()& v" g- V( m/ g3 D4 h
    Select Case MSComm1.CommEvent# n, B( H% B% t: }/ F
        Case comEvReceive6 i# \+ \/ A/ T8 G! C  t7 n% L2 U
        inbyte = MSComm1.Input
# d# c5 t0 A. h; y        For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制( X& o- Q: T8 s
            revbuffer = revbuffer + Hex(inbyte(i))) i0 h: n0 H' L/ B3 s) D- l. x: V" Y
        Next i
+ H$ ~( x* C" ?        txtHex.Text = revbuffer; ?+ V* t0 v. J7 u2 C* P% H
        If Mid(revbuffer, 1, 4) = "6030" Then
' E1 T8 P+ `9 t6 {            Timer2.Enabled = False# \& r5 S3 b/ f! A! ?( y; g& r
            Timer3.Enabled = True
- k3 y5 U3 N+ a: ?& T8 m  N        End If; s' U# k9 H+ o5 f" ~2 N" P; w  J
        Case comEvSend5 Y" B0 A5 l1 z+ H+ k- L+ _
    End Select
$ W9 n6 u5 |4 h* p  iEnd Sub+ j! Y" E( M) R# {' b
Private Sub timer3_timer()4 g7 o4 Z4 q+ M" G$ Q
    MSComm1.OutBufferCount = 0 '先清空缓存
5 U* ~1 x0 L& t    sendbuffer = "STX"; q! X6 a1 q8 A2 g, h: e2 i" j
    MSComm1.Output = sendbuffer
4 |& y" w8 `6 Y# D    Select Case MSComm1.CommEvent
6 |4 e) H1 ~. Q% ~8 l0 b6 V# k$ c2 F        Case comEvReceive
/ {0 E  p! H! j            inbyte = MSComm1.Input
. K- U( ?4 t& S7 ]            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制
. u$ g: P) a1 z/ N. J- z; F                revbuffer = revbuffer + Hex(inbyte(i))2 P* m: ?1 Y( P0 s' T' R6 }
            Next i6 u* Z. k4 A; }5 x+ d9 m5 G
            txtHex.Text = revbuffer
2 p5 e$ G7 W: b& ~, s            Case comEvSend6 t5 s3 \9 ?9 J5 z: ~$ Y
    End Select
6 n" C- g0 x8 k+ f% rEnd Sub
6 T: ?6 K0 ^; T1 E+ S2 ^; d1 d* @0 J
/ o& z2 s6 M& d1 f, s  {: v' H
$ ?0 ^# F8 \  n! {) Z" w& Q
) F  l/ C* i/ f* |" {
回复

使用道具 举报

发表于 2011-4-1 09:22:34 | 显示全部楼层
这个问题感觉不难,但你描述的有些乱,让人看不明白。
. `0 ]" h& @& U$ r我也用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 | 显示全部楼层
回复 无能 的帖子& j9 j2 P& V5 N+ k
8 s! H  h% r1 E
快了。
) a: a' N' \4 ~* k  J6 U7 C. h设备通信协议我没看清,这个设备的通信不用timer。
$ a7 h; e* J+ o$ E- Y
发表于 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-10-21 14:03 , Processed in 0.082924 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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