找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 8624|回复: 6

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

  [复制链接]
发表于 2011-3-31 21:03:06 | 显示全部楼层 |阅读模式
项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:
4 \1 G3 n, V! k  a4 m. k' W5 ?) z* m% C1 W7 _
当发送命令"H!i"时,为寻找芯片。4 S; u3 C& x) L: O3 Y
当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537! t4 K' T( n6 v+ T
当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息
8 _$ C* ~& e% ?% h8 \6 b- B  }3 h& ]& K0 g1 X" u* O
当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据
: K, m4 R) S: [# I6 D没有错误时,设备返回:0630
- M7 p) T. R( x" \; _此时,发送命令“STX”,或十六进制命令“02”1 L! e5 L1 L) Q4 x6 J: N8 x
设备返回前十六字节数据
5 u% v, Q0 }; Y- [# g# S) y
2 [8 d. {6 R2 u* U' F3 `, Q之后继续发送命令“H!i”,寻找下一个芯片
% t9 A( H2 @: ~, `--------------------------------------------------------------------
, k4 y1 ~0 ?. T' \( @$ b# P项目用MSComm进行串口通信
! }1 [, I1 t( I* |+ w需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。
9 C1 [+ f. W; t- P2 l: o, b: X用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。
9 _4 Q6 Y  D; R# U" z但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?
& q; B9 Z  M7 b( [9 Z' F----------------------------------------------------------------------------) m. r, e9 A& a
其实程序说简单些就是:9 u/ Q2 h) E  f" s
发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据
/ ^7 p# C+ j/ W5 K( e% T; K这个循环要怎么实现呢?
* B7 `8 F8 T( _  M+ p* L先谢谢各位!8 y5 A- L) t3 M  S9 }

% R, D  S* b& O: X% Z--------------------------------------------------------------------
$ ~0 S6 t5 v9 G% a! ~% }" L下面是循环部分的代码。系统报错
4 ~- `  [/ [2 G6 F: `Private Sub cmdStart_click()
. }2 W  `3 k' O. R" I    Timer1.Enabled = True
! s; R9 p% d# n" o+ U! I8 U    1 e# H* G# r# P1 W- i
   
9 j/ e1 q) L  K; d- q, t   
1 {+ e" U  f* G4 p- Q3 dEnd Sub
& }, v( n+ m( @Private Sub timer1_timer()
0 H8 ]% Y! I; ?! ?   
8 c* f. k* N4 t6 I+ d8 b   MSComm1.OutBufferCount = 0 '先清空缓存
$ @& ~) f5 ^) ^7 N" N   sendbuffer = "H!i"% D  b+ n6 a% l$ M, X% P3 E
   MSComm1.Output = sendbuffer
  a8 U) W6 A' f( Y  iEnd Sub9 i' I/ W! w$ n& X
'结束8 d4 p$ Q: B- ]
Private Sub cmdStop_click()
% U; n# n  C2 K3 S    Timer1.Enabled = False
" _3 F. z- M1 m9 g2 B4 ?( w    Timer2.Enabled = False
2 b. B% S% n. J& w    Timer3.Enabled = False
2 l) w. c9 |. H! p; U% A1 e/ e" fEnd Sub% F. j: b/ v0 }8 h0 N6 \- r

4 J1 H) C, V; v" V' _2 m' h'接收数据
( `7 T; @5 R2 y1 m6 vPrivate Sub MSComm1_oncomm()/ [: A  k; h1 J' u: _
    Dim inbyte() As Byte
$ A: R8 r1 `- c6 ~8 j    Dim revbuffer As String
0 k* `9 x- V3 H% s  a( n4 D& _* _    Dim a, i, b
* i6 j6 L; h! _# ^; l7 o4 f% [    Select Case MSComm1.CommEvent- O5 A8 Z  d  U6 o5 u
       '如果有CT在感应区
- w/ [$ f1 K; L8 V+ E$ I7 `- w        ) g6 E% U  O  c
        Case comEvReceive
4 N3 Q2 d2 F2 k; M( f. G+ [5 t            inbyte = MSComm1.Input! M" ]1 j  n6 a5 T
            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制
/ L! p6 |3 b* q* c                revbuffer = revbuffer + Hex(inbyte(i))1 M2 e+ k) p6 f/ a. d; X1 L; {
            Next i+ l) O1 f0 N+ G  [4 A  g# q! u
            txtHex.Text = revbuffer# S5 v! u. ]( i3 Q9 x
            If Mid(revbuffer, 1, 6) = "480310" Then2 p3 P' P& \( Q0 t
                Timer1.Enabled = False
+ O; U5 y- t0 F4 d( {( x                Timer1.Enabled = True" {9 g$ A, ^( B! Z. J1 E
            End If0 c7 a4 _8 o* o2 X" n
        End Select2 G' J: x2 t8 h& X9 @! S" E
        Case comEvSend. c1 [$ F; Q6 c( J
    End Select$ p/ J$ H) g* T8 ~! B
Private Sub timer2_timer()
' K, e; d. q, t9 J3 ~* Y        MSComm1.OutBufferCount = 0 '先清空缓存
8 H: v% K; k1 C0 X5 q' K6 y        sendbuffer = "R00000016U"+ m5 d$ U- \) ~& o, ^8 R2 ^
        MSComm1.Output = sendbuffer
  N5 x6 P- z2 B# t  XEnd Sub
  D0 S+ V4 L& q/ C* c6 G3 e8 }Private Sub MSComm1_oncomm()$ Z% j; P' U: k
    Select Case MSComm1.CommEvent
" H4 S+ `" M4 a- V+ B1 ~, ~        Case comEvReceive
' Q2 l7 ?1 I2 g: O) S        inbyte = MSComm1.Input2 O7 A- l( w7 Q7 Q
        For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制
8 p) K' h3 S2 |! i3 R2 H: g5 w) m. O            revbuffer = revbuffer + Hex(inbyte(i))& M( _- {0 F* L0 U
        Next i
( ?( M2 }5 K4 J; \        txtHex.Text = revbuffer9 S6 t1 _5 i& X( `
        If Mid(revbuffer, 1, 4) = "6030" Then6 B& u, ~1 f6 c9 o; J; L6 y
            Timer2.Enabled = False+ z% ^! t$ @. {! p3 i
            Timer3.Enabled = True
0 z) r: a$ P9 |9 S3 M0 L0 z        End If6 o9 G$ f# ]8 X0 w
        Case comEvSend
4 f9 A* H5 O' t    End Select
9 v. a1 b$ d1 D6 k) j9 b2 @End Sub3 e5 v5 y/ x; n1 B
Private Sub timer3_timer()9 j, y3 t& u4 e& d9 C: p: j
    MSComm1.OutBufferCount = 0 '先清空缓存% m1 c6 e  ]7 A6 n
    sendbuffer = "STX"
' N8 k/ m# d: a2 P7 V8 i; U    MSComm1.Output = sendbuffer' s$ ~) P" h! H" {; C% [
    Select Case MSComm1.CommEvent
$ H( h8 v7 `1 `* l8 D) [        Case comEvReceive  b: V' L( E4 x
            inbyte = MSComm1.Input
  F8 Z3 X# ^2 o. I1 j- P' R            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制
5 }$ l, M3 E* [' f+ m- m                revbuffer = revbuffer + Hex(inbyte(i))5 P9 V* |# A6 ~& e' P
            Next i: G$ a: N( i8 R9 \6 P6 v
            txtHex.Text = revbuffer
  F  ^) ]/ |+ J            Case comEvSend
9 U* A0 l- Y- r2 E: x" Q3 k    End Select4 }) ]( L0 F$ [2 t
End Sub/ q- s3 s# v$ o6 ?; `" C0 y
1 P! Y/ p9 W3 D4 G  A

" \: j6 T1 b  x
, h" g2 Z/ h+ t) j- p
回复

使用道具 举报

发表于 2011-4-1 09:22:34 | 显示全部楼层
这个问题感觉不难,但你描述的有些乱,让人看不明白。
0 c$ Z+ N3 I( p' X我也用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 | 显示全部楼层
回复 无能 的帖子
3 U, y6 ~: f. a5 j! \
4 A2 g2 }; E4 z* s. L$ Q4 c# }快了。( }3 ?/ U3 M+ A: V
设备通信协议我没看清,这个设备的通信不用timer。
1 Q4 f4 J! W/ q1 z
发表于 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-9-16 18:20 , Processed in 0.076579 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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