找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 8532|回复: 6

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

[复制链接]
发表于 2011-3-31 21:03:06 | 显示全部楼层 |阅读模式
项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:( U6 u( ?0 j( m0 \
: c) c* [; {2 ?
当发送命令"H!i"时,为寻找芯片。$ R% L% P" k/ b; `
当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537
9 b. X/ v, C! n: @$ S当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息
7 s- h3 F0 u6 p5 ~3 x
1 ?% B  W5 G; F) C. [当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据
1 g! r, }+ _1 g* [  e没有错误时,设备返回:0630& {8 Z5 Q- l4 f
此时,发送命令“STX”,或十六进制命令“02”. i$ A+ @( v1 r, o) T# Q* N
设备返回前十六字节数据1 n! ~% O* W1 p; W

# g- }$ ]3 U4 t6 I# B; d: d& ]8 J之后继续发送命令“H!i”,寻找下一个芯片. c/ S- T2 x+ U) b) t% d
--------------------------------------------------------------------
, v7 h% M" c: `7 M& i$ F7 c6 w项目用MSComm进行串口通信" }; [" U) j! s( ?1 d. @5 |
需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。8 i+ B# ^6 C# \5 p3 ]
用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。
. D8 w/ S& r7 T$ O* A8 v  s1 x但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?$ ~3 }+ N4 C9 W
----------------------------------------------------------------------------/ }: t( B+ O2 M1 J4 e! O
其实程序说简单些就是:( I( V7 ^+ j$ V$ }" ]5 r
发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据3 }, d- l. A& y
这个循环要怎么实现呢?0 U' G5 x3 ^& R; l9 n
先谢谢各位!9 T9 c' X" l% H+ ^
$ z. B, t9 ^, H, I9 l5 c
--------------------------------------------------------------------
7 z1 O& P# _- w) K下面是循环部分的代码。系统报错! D3 t# E& O" l! K4 A2 v
Private Sub cmdStart_click()
8 A) c) m4 h* i0 v    Timer1.Enabled = True
+ B. ?8 @& Q) s. N    5 Y6 n& p5 A5 t3 S6 k  x
     w8 ]5 v: `6 j/ L" {7 Z
   
* P9 e" l; q' @/ R" G+ }/ C& eEnd Sub7 O6 B# n/ J( k/ z- j
Private Sub timer1_timer()
  b& }6 }9 a, G; h   ! |$ X* V2 t9 m8 t
   MSComm1.OutBufferCount = 0 '先清空缓存2 `; F. m; Z* F" L$ O- x9 N& b
   sendbuffer = "H!i"
7 n& M# f# F6 l# [   MSComm1.Output = sendbuffer6 E# Z3 c% ~2 o/ Z$ x/ D( ?- M
End Sub
% u# Q0 B+ A$ M9 V'结束/ e9 b+ s! T7 |$ t0 m2 {" e+ r
Private Sub cmdStop_click()  X/ ]$ T6 W/ G$ }$ B+ S0 c1 J) A/ B
    Timer1.Enabled = False$ q* U5 k; J' B3 Q7 Z4 d
    Timer2.Enabled = False
2 h* ^0 A2 _7 v1 s4 @2 g5 \2 F    Timer3.Enabled = False  f" e, B6 o7 K0 u, f
End Sub; S/ `! d$ j5 h+ x1 F0 l9 r" m, W* j
+ a0 c8 M4 r0 R' Q  U5 ?
'接收数据0 c6 ?8 s! j' j# i- E1 s
Private Sub MSComm1_oncomm()
! V2 H* E# _- R/ w! }3 }  ?( h    Dim inbyte() As Byte
7 ~; d* n- }* O( ~7 x0 k+ L    Dim revbuffer As String
- ?8 }3 W' j) v# b$ }5 F( F    Dim a, i, b$ M1 {! _4 g# R( m$ x' q0 ~
    Select Case MSComm1.CommEvent
+ g; c8 f6 J/ }7 Y       '如果有CT在感应区9 ?7 ]$ Q: z, ]7 Y4 D3 M
        / K, l* T) L. U* D( i
        Case comEvReceive, W- p. k; J- F
            inbyte = MSComm1.Input
  [& ~3 x' Q6 V7 R4 \2 ?            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制
  y, X  ?: ]  F  ?- f5 R) C4 D                revbuffer = revbuffer + Hex(inbyte(i))
. l  @6 S) r- g            Next i9 T/ [) n  C) y8 u1 I" h2 v
            txtHex.Text = revbuffer3 U7 ?" U* @: q$ Y: l
            If Mid(revbuffer, 1, 6) = "480310" Then
/ D& u5 X& M6 o: ]; P6 X                Timer1.Enabled = False
- V" m- w/ Q/ a7 s' G3 H                Timer1.Enabled = True
: [2 [# g% j% e4 e" {            End If
: O5 a4 }7 k, h: W        End Select% d& ~$ s: w( r) ?$ ~  B
        Case comEvSend# @! u- S# o( i' P7 M2 a' `
    End Select
" u: G- f6 ^* Z5 S/ _8 H. i. m: sPrivate Sub timer2_timer()
7 X% F7 f; t/ t7 b" Z" L        MSComm1.OutBufferCount = 0 '先清空缓存) w$ C* ^9 H5 s, s7 G1 }
        sendbuffer = "R00000016U"
+ }5 c' m  a# u; D* t* ]        MSComm1.Output = sendbuffer( P# L! V+ p1 d% E( i: I
End Sub
3 a" X) U, r  m/ e8 b0 u0 BPrivate Sub MSComm1_oncomm(): ~0 ~! M7 r. F2 [  F
    Select Case MSComm1.CommEvent
' f9 W& l1 K4 a        Case comEvReceive
' A3 m4 [2 K: d3 V( }" b6 C        inbyte = MSComm1.Input" M) m: Y" @# b0 i2 U6 C
        For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制+ ]. y7 \) K( E4 Y; x! b
            revbuffer = revbuffer + Hex(inbyte(i))8 ~1 R2 `& J. R# ~
        Next i
  J8 a% \3 G- B        txtHex.Text = revbuffer5 F. `/ r6 y6 [% l* A' ?2 B
        If Mid(revbuffer, 1, 4) = "6030" Then
1 T8 g; F, ]6 V+ Y& p            Timer2.Enabled = False/ x" E6 @+ B- ~1 ^
            Timer3.Enabled = True6 i% y4 v: ]3 B9 t7 Y# ]- w
        End If8 G* X$ d1 u6 }2 L8 f/ ]+ Y9 R
        Case comEvSend) V; C: ~& @: a$ a
    End Select
' X8 y3 ~2 J, r) K; w. z+ NEnd Sub
1 z. c, J. K2 J; j2 e6 lPrivate Sub timer3_timer()- V9 O) m" E  `$ q
    MSComm1.OutBufferCount = 0 '先清空缓存
* f6 ~! M* G6 y5 G  F6 p7 }7 `4 e; ?    sendbuffer = "STX"
* M5 @7 N1 D/ \9 _- n    MSComm1.Output = sendbuffer
' H9 A: q2 p8 B& E- i    Select Case MSComm1.CommEvent
3 a% i, {8 c1 u9 [4 u: `        Case comEvReceive
( O; M6 E0 \3 L5 L2 L  o1 W            inbyte = MSComm1.Input
6 K( d8 w1 N3 h- M; v  F% R. I9 j            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制
& `) p4 e% E0 s8 A7 c- ?) D- S                revbuffer = revbuffer + Hex(inbyte(i))% a2 j. k9 d" p/ x
            Next i
1 V+ U1 W5 j- G, ~- U4 c, g! s            txtHex.Text = revbuffer' C$ K" Z+ V+ e
            Case comEvSend: k" E$ t* j' F
    End Select
5 e1 I! G9 W# p' h3 |) {End Sub! w+ R  n/ u5 w* _; q" g

# b8 R4 v  R0 L& z9 r- u
1 W- B7 ?% \! F( z% p% D+ z! c" x) u- y* P+ w; c6 o1 {3 L; |
回复

使用道具 举报

发表于 2011-4-1 09:22:34 | 显示全部楼层
这个问题感觉不难,但你描述的有些乱,让人看不明白。
3 F# H  m6 g, B! U8 f我也用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 | 显示全部楼层
回复 无能 的帖子' u" m- H0 |9 v6 c
& O% y5 O- H, X8 E; j; @
快了。
% H) X5 Y2 |5 I/ o+ G  R设备通信协议我没看清,这个设备的通信不用timer。
, O: F9 S. v4 z8 [& O) 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-7-12 15:39 , Processed in 0.065083 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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