找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 8687|回复: 6

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

  [复制链接]
发表于 2011-3-31 21:03:06 | 显示全部楼层 |阅读模式
项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:
! M. W: u4 o. K' C  F( N. u1 N. s" j: ~) W
当发送命令"H!i"时,为寻找芯片。; f; Q: A- n/ Z2 `/ g0 v0 ~! h
当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 15379 B% ]  ^& u* g% S
当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息% ?6 d$ K7 t: P
! W  u9 N: |- ^9 M' ^0 u5 H
当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据- ~2 y2 `8 z# C( j
没有错误时,设备返回:0630
+ w% w% X4 b! M6 ^; f1 }此时,发送命令“STX”,或十六进制命令“02”
( I& Z& T+ ~: O$ Z4 W, ^: D! W3 B设备返回前十六字节数据
) D' [. P- V0 F9 e6 [" \" V; ^6 K' z' ~/ a6 W$ X  R
之后继续发送命令“H!i”,寻找下一个芯片
( H5 e: f4 t! K/ k) j* q; P--------------------------------------------------------------------
- X% n8 d6 \. [; H- J( E! U项目用MSComm进行串口通信
; p7 B) b" Q) f2 V, \需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。8 d2 s" G- U' D7 t- D
用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。
4 m. f2 K# i' i  j% T  e但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?
$ ]; l! G7 I1 a( y/ V& s: R6 d* q----------------------------------------------------------------------------+ ]3 E& Q+ z# I& q! n# O" [
其实程序说简单些就是:1 i3 k5 F4 M# s5 ?' t$ A. V4 X
发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据4 _" \# ]# E9 \; G1 P/ M
这个循环要怎么实现呢?8 z& Z6 b2 E% r& s/ b
先谢谢各位!. g7 [) t/ o7 t3 z% ?9 }9 c* g8 q
' R1 x6 [5 h3 D1 a% A6 u* S9 X
--------------------------------------------------------------------
$ l8 l) S/ j2 b. `下面是循环部分的代码。系统报错
7 y. d3 ?. f- n' I1 B' cPrivate Sub cmdStart_click()
- Z8 b! R+ m, Q/ y7 ^6 w) q9 _    Timer1.Enabled = True2 n7 {3 |( ~  h( |3 \+ A- \
    2 k$ j7 M; P' G! b3 T
   
) n6 K1 V. ?6 {! o5 R   
! |7 _' y" H+ {End Sub
. |+ Y7 C8 r& t5 K$ x/ O6 t& VPrivate Sub timer1_timer()$ j6 k1 z' u& B( H0 s2 n
   + ?2 u5 O. j+ q; p: f7 I' A8 B1 Y( [
   MSComm1.OutBufferCount = 0 '先清空缓存3 _" q# ?) v. ]- ~
   sendbuffer = "H!i"
% n' ~# j( M$ @) O; G; z+ N& x! u   MSComm1.Output = sendbuffer
# F6 W. _* x) Y9 ^4 b7 KEnd Sub  N8 @# C7 Z) c+ A) A0 W) }
'结束/ r4 D9 M) v  f- M9 W/ ]
Private Sub cmdStop_click()
$ D% i- j' \" b7 v7 H% R* o    Timer1.Enabled = False
+ q7 o2 B( }1 K    Timer2.Enabled = False
8 F1 F: {8 j) `9 _    Timer3.Enabled = False
& L. Y7 z: ^+ r# h" \5 T6 vEnd Sub, l! r. t4 Y. }' C0 O: U) M2 m
' p; H1 ?1 k* e
'接收数据) a0 a  H( `! U. B: P4 o
Private Sub MSComm1_oncomm()
: m) E  L& X5 n& o8 ?+ B  x2 T    Dim inbyte() As Byte
' T( \& B. H+ G% B8 o    Dim revbuffer As String; B3 z( C8 j3 Z" {3 \5 n
    Dim a, i, b
; c/ t2 a3 |  U: D    Select Case MSComm1.CommEvent
% }$ k( E0 J1 I8 L  w       '如果有CT在感应区/ B: i0 \, T# [
        
. Z% P# R9 m4 i$ a& g0 F, F) ~, `4 @0 V        Case comEvReceive; _  d2 H9 M4 k! g
            inbyte = MSComm1.Input2 e# ^( V; I% O/ C$ @, P
            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制# [% T" {9 u( b
                revbuffer = revbuffer + Hex(inbyte(i))* R1 P, _1 @& C- b5 @% }0 ~; K. x
            Next i
9 R6 r6 p! I9 [$ g) P: A3 r7 b3 L            txtHex.Text = revbuffer. h' C' Y$ |! u9 x
            If Mid(revbuffer, 1, 6) = "480310" Then
: m5 h1 J* W5 s1 N5 M7 w  G                Timer1.Enabled = False
6 n2 y6 a5 }2 a6 l, x                Timer1.Enabled = True' T6 c, h2 C/ z8 z7 t% e/ q
            End If
# |3 W' V+ y8 ?8 }2 b6 u6 F        End Select
" R/ |' h# o) [7 W/ P; G        Case comEvSend5 m9 ]8 @$ {. X7 }; v
    End Select5 I# V2 ]  |2 S
Private Sub timer2_timer()
  H4 ^3 X. k: b$ n$ _1 u7 Y' D        MSComm1.OutBufferCount = 0 '先清空缓存
6 l$ z8 b- a, W: o2 O/ A        sendbuffer = "R00000016U"; p, D6 [+ J6 L4 X
        MSComm1.Output = sendbuffer/ F. X. L( z/ o& C0 n5 o
End Sub
( y) E7 x, z+ i5 f7 A# A. vPrivate Sub MSComm1_oncomm()
# q3 v- h+ j9 p- U    Select Case MSComm1.CommEvent
, ?9 I  J( c3 n' X5 ?        Case comEvReceive. ~* z9 L6 @+ b# Z
        inbyte = MSComm1.Input
3 k" i# C3 d% ^        For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制9 W. g* `8 L4 c4 J/ _* x& W
            revbuffer = revbuffer + Hex(inbyte(i))$ _8 u! h" A* ]2 z0 g
        Next i. y$ S. s! |: D3 L
        txtHex.Text = revbuffer
7 `4 z' u7 l" s        If Mid(revbuffer, 1, 4) = "6030" Then/ G. {( z. V: E1 ]5 x0 J' x7 C
            Timer2.Enabled = False
& t; u) T* H7 ]( o- ]            Timer3.Enabled = True( H& y0 Y& t* k$ N' C2 f; U/ a) T
        End If
1 C& {5 l" R( x- P6 U+ b( A% V5 d        Case comEvSend
# K; ~5 h9 K8 j6 V7 P' p    End Select
  d2 u, `3 w# L8 q* ~) c. h9 ~# eEnd Sub& Q0 D/ h3 v. _/ @( N( y
Private Sub timer3_timer()/ u% z$ m  `- O+ u: O* M
    MSComm1.OutBufferCount = 0 '先清空缓存/ p  _- d; S, W& H% {
    sendbuffer = "STX"
% F" Q! D: U6 J7 X) {    MSComm1.Output = sendbuffer* u5 \& X) Y* r1 L/ D
    Select Case MSComm1.CommEvent3 L+ y! {5 m8 X( r; H8 e
        Case comEvReceive
- {/ s% [7 r9 g1 j2 m            inbyte = MSComm1.Input( p2 _* A) {; Z# V* K' j7 _* k- T
            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制' S1 X& H' S: N. R
                revbuffer = revbuffer + Hex(inbyte(i))
0 G: i' Y) ^' t  U3 L            Next i# Z$ A/ F( W/ l/ i" j- w& I
            txtHex.Text = revbuffer+ ~' k5 P, `$ q; o
            Case comEvSend9 c& A% f# r& N3 ~2 ]
    End Select" H- F. C8 k; D% m
End Sub- ]6 P  I( I! a" U8 m* K

. r8 Y$ e# o5 N, h2 J# R# R3 s+ Q# L: W' j  |- x" R& J

6 X" M% X1 G$ r4 P5 Q; ~
回复

使用道具 举报

发表于 2011-4-1 09:22:34 | 显示全部楼层
这个问题感觉不难,但你描述的有些乱,让人看不明白。
3 D$ \1 H) Z9 P3 [5 D7 t我也用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 | 显示全部楼层
回复 无能 的帖子
4 d( H# X2 x0 G( u+ H0 x' R+ P0 J# W) d
6 L2 Q& Q) P0 e2 d4 V0 t; s快了。, H4 i5 q) U: d/ g
设备通信协议我没看清,这个设备的通信不用timer。
! N" Q  x. P1 a1 Y7 q6 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 22:29 , Processed in 0.065459 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.5 Licensed

© 2001-2025 Discuz! Team.

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