找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 8508|回复: 6

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

[复制链接]
发表于 2011-3-31 21:03:06 | 显示全部楼层 |阅读模式
项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:
; ]+ i% _' z' u- D4 T! B# g% h4 {- O. w* c5 y2 a
当发送命令"H!i"时,为寻找芯片。2 h" Q+ Y- \" D7 D* t
当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537' c. S+ J- k, c4 p. ?, U
当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息% N/ u9 r; n, N/ K/ p6 {  f, z
* [3 e: W/ ~( Z
当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据3 }  ?, B0 b& E$ C6 L
没有错误时,设备返回:0630/ \; y" @4 ~' U( w4 K8 }
此时,发送命令“STX”,或十六进制命令“02”
0 A/ g+ y/ e1 l; {设备返回前十六字节数据
7 A% l% o! D, T' k5 P4 F3 K, R- U# H+ C! F
之后继续发送命令“H!i”,寻找下一个芯片
/ q5 Y1 o) N2 v) H# F8 C--------------------------------------------------------------------# i9 q! M! M5 i. Z
项目用MSComm进行串口通信2 `% i2 W9 G) k0 ?5 g4 j* g3 `! Z
需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。
' }0 I& q! e1 q! `用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。/ {- b( f' p( V9 e3 {0 Q
但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?7 G/ A  y; H4 B  }$ D3 s
----------------------------------------------------------------------------% W6 \2 Y, ]' [, l+ t
其实程序说简单些就是:
$ |& r! v/ U  c0 c% s0 W9 R4 u' A, Q发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据/ E# D4 v+ i; V' A8 i3 g) z  L! p; a
这个循环要怎么实现呢?5 x2 d* z( v# M, c) T, U' u
先谢谢各位!
# v3 ~8 V( ]$ ~/ ?0 [: d1 L% @5 R& M8 W6 r9 S8 B
--------------------------------------------------------------------
& T* _4 p( }% N7 F2 b8 k下面是循环部分的代码。系统报错0 t' `, V! ?3 Q* y- Q6 l
Private Sub cmdStart_click()- k' q' b# r) J5 R: b3 |! Q
    Timer1.Enabled = True+ ~+ C, F6 `# n+ k& v+ H$ T
   
% e  f6 T0 u: b  u- P   8 B$ m, h  s7 ~( K. Z8 u! I
   
* P2 m$ ^: L1 a+ b) c* wEnd Sub
) C4 y# [% ]4 q' K, N6 f, {! ^Private Sub timer1_timer()
- P5 H* N& z. U) k7 O  ~3 R- \1 f   + j/ Q7 R6 N8 S  L# p
   MSComm1.OutBufferCount = 0 '先清空缓存
& {# @! W3 ~* R   sendbuffer = "H!i"# E: x( a' q# T5 W
   MSComm1.Output = sendbuffer
- T( d1 r# o0 Z' f& u& }6 M4 ]6 [End Sub
: f* P$ g! {  |3 F# w'结束5 a4 L2 s* ]5 ]4 q7 z
Private Sub cmdStop_click()
# C* k% p, L! ~/ E    Timer1.Enabled = False- O, K8 r! S9 B% r
    Timer2.Enabled = False
! @- X* a0 B& R    Timer3.Enabled = False5 ^, n3 S7 [4 [: t% [, b  c
End Sub
5 o4 D; c* C8 n$ O  q$ k. F4 p2 {' h& @% X- u* c* {
'接收数据) I5 W, @" @0 f1 ^: k4 h% T' C2 q
Private Sub MSComm1_oncomm()3 G0 {5 Q. U& I" a' \
    Dim inbyte() As Byte9 c+ C" N6 R& p$ R, p. n; }# w' y5 |" q
    Dim revbuffer As String, C2 A! c% v. V& Y- Q9 G: B0 h
    Dim a, i, b
+ A+ [/ B1 L; ^) ^3 }& s. Y    Select Case MSComm1.CommEvent" h0 {" k- u) S* ]  g
       '如果有CT在感应区
6 O1 W% t, N1 S( t, o9 \+ \- V          ?/ r% e& C# P  `; R  g
        Case comEvReceive
' ^2 \" B6 l0 V5 S4 c: \  d9 w            inbyte = MSComm1.Input
  b7 Q' l) c  F* t. t            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制
) i& I2 N7 E3 D" Q4 J                revbuffer = revbuffer + Hex(inbyte(i)), Z. ]( ]9 S7 C- [
            Next i* w9 `* V5 |$ D9 i6 |
            txtHex.Text = revbuffer
! q2 u5 n. ?* G' E            If Mid(revbuffer, 1, 6) = "480310" Then
4 q5 s* B" A$ G                Timer1.Enabled = False
; @1 }4 Z! n8 K2 a: R; K                Timer1.Enabled = True' w, p8 J( C, A4 s! Y  z& m
            End If
, h+ L. o1 L0 }, y; C- k        End Select
% i* @/ B- }" b        Case comEvSend
5 l) A, U; w1 J6 c$ Z    End Select* D1 K  o) d: @* w) B
Private Sub timer2_timer()7 C# a: p; p/ \2 A. I. E0 j
        MSComm1.OutBufferCount = 0 '先清空缓存
) a7 A  G5 |, o( M2 R! b        sendbuffer = "R00000016U"
9 e. v6 {, B: z$ B! `+ T        MSComm1.Output = sendbuffer
2 Q- P0 _/ x) J4 k0 G# IEnd Sub
* F; k( W+ U. x7 g) ?' s; fPrivate Sub MSComm1_oncomm()
  _, a' S5 `- g+ K3 v, ]    Select Case MSComm1.CommEvent
8 \; ]" _2 m# N2 D* V5 q        Case comEvReceive9 _  a- q/ w# ?) ]% d/ n5 ~
        inbyte = MSComm1.Input: L2 C6 j( s8 g! ?% c- o, S, I
        For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制
) u* g" D5 m! a. ~! B% z; |- y            revbuffer = revbuffer + Hex(inbyte(i))' U; Z$ @# t  s8 A2 ]$ F- H& [
        Next i7 \& O5 B4 P0 Z& _! v$ t1 ]
        txtHex.Text = revbuffer
7 i. z+ r/ B+ Y8 W$ S        If Mid(revbuffer, 1, 4) = "6030" Then0 D3 ^* J/ H  `
            Timer2.Enabled = False7 d! ~2 x; d( ]5 M7 v5 S$ A
            Timer3.Enabled = True5 y8 A8 L  A6 v+ X8 Z+ e
        End If
  }0 e/ \+ [* \* g& t% F; B: h        Case comEvSend
) Q8 e- z# u. D  @. o. \    End Select# [! ^, V$ W, q/ q) A
End Sub- v. [- t; c# |  D: c
Private Sub timer3_timer(): h7 ]; y3 d; [+ @1 _6 T
    MSComm1.OutBufferCount = 0 '先清空缓存
: p5 X9 X+ {1 W+ T" E0 z* d: b: A    sendbuffer = "STX"7 w. k& [. [, g
    MSComm1.Output = sendbuffer
9 `' }( D4 `: G; N2 H    Select Case MSComm1.CommEvent/ b( F! L9 U, K$ d5 H5 M% [6 i& L
        Case comEvReceive
$ h) i/ @$ ^8 D/ n            inbyte = MSComm1.Input( z! N- c, r$ l
            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制5 A9 L; G4 K" f( F: K& {
                revbuffer = revbuffer + Hex(inbyte(i))) `: h" I4 J' i3 h. b5 T. E7 y
            Next i
9 b3 x& }: o5 C# a, i) a            txtHex.Text = revbuffer
% v5 T1 |2 q5 m* P. }/ o            Case comEvSend4 b9 Q( S0 J: g
    End Select
' @9 O8 l4 f1 n' qEnd Sub
. [' ]4 U; Q+ G1 D2 Y. T. H% i- Y: k6 d" i& y

8 Z" w5 @# L/ ]) ]6 h8 E. H4 J6 T0 k" B: H  Y
回复

使用道具 举报

发表于 2011-4-1 09:22:34 | 显示全部楼层
这个问题感觉不难,但你描述的有些乱,让人看不明白。8 t- U- R; J1 |* O4 {9 ^4 y
我也用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 | 显示全部楼层
回复 无能 的帖子
( U1 w* u3 `9 c( A3 r+ t1 y$ |
1 u( `3 _7 m) G# X/ d: Y快了。
+ M3 q( N$ t/ O1 W) ^6 Y设备通信协议我没看清,这个设备的通信不用timer。
0 [% \% W( J, _6 q+ ^
发表于 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-6-22 17:21 , Processed in 0.201927 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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