机械社区

 找回密码
 注册会员

QQ登录

只需一步,快速开始

搜索
查看: 8326|回复: 6

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

[复制链接]
发表于 2011-3-31 21:03:06 | 显示全部楼层 |阅读模式
项目需要用MSComm控件实现射频设备与PC的串口通信。先说一下设备发送命令后会返回的相应的数据:
' b: A; Y4 r6 @/ y' v3 _, i; M
( a7 N5 D5 I9 S8 ?# i当发送命令"H!i"时,为寻找芯片。
; F+ S' z9 q4 |当设备连接正确又无芯片在感应区时,设备循环返回:0630 和 1537
! ~1 i, X# F. \9 q7 C: p, Z; Z, k当设备当设备连接正确而芯片又在感应区时,设备返回0630,稍有停顿,继续返回4831+其他信息2 @! M/ K2 W2 @: J3 Z4 b9 C$ O0 U
5 i& f. p% {9 C- }! ?. B
当芯片在感应区时,发送命令“R00000016U”,读取芯片前十六字节数据2 l# D8 M+ `- g* ?6 P/ B
没有错误时,设备返回:0630
1 c) z, v. k, u7 q. W6 `3 \此时,发送命令“STX”,或十六进制命令“02”+ A$ q3 X5 ?, F- J+ t- s
设备返回前十六字节数据5 }! d% o8 R( e, Q% ]

: ^( F6 P  O* V1 g$ J$ R之后继续发送命令“H!i”,寻找下一个芯片5 @1 n4 \; ?; S+ C2 H# C
--------------------------------------------------------------------5 X( T! o2 H! ~1 x
项目用MSComm进行串口通信9 _' j/ K$ K/ }% N. i$ c
需要将上述几条命令循环起来。我用的是比较MSComm1.Input是否为争取的返回值“4831”和“0630”。5 d) d2 V) }* ]5 f" d. U
用了三个timer来控制三条命令“H!i”、“R00000016U”和“STX”的发送。把发送命令都放在了timer_timer下。
2 W; w8 c# i# ~- K4 q但是这样的话,就用到了三个Private Sub MSComm1_oncomm()。系统报错,“发现二义性名称”。意思应该是不能重复定义Private Sub MSComm1_oncomm()吧?
* x# W3 m4 f& u/ @" j. n6 s----------------------------------------------------------------------------) m5 H, ?' s7 v. |
其实程序说简单些就是:
1 G% O0 E% V3 B/ B发送命令—>从数据返回区判定->发送命令->数据返回区判定->再发送命令->接收数据, G6 u; [) j" ~1 q% ]1 V
这个循环要怎么实现呢?
* R* x- z6 y0 |: m3 ]. b5 P/ n先谢谢各位!
. n0 M, m  a* _# I$ [! P  H: n/ p1 t0 }. O
--------------------------------------------------------------------
6 c9 [$ @& K: Q7 S; d下面是循环部分的代码。系统报错
! s( Z' }0 A4 k7 F5 r2 fPrivate Sub cmdStart_click()
/ v, d2 p9 E  ]; [; `    Timer1.Enabled = True
6 e8 ~9 M2 \# H" L: `   
4 a- `0 n* @# H3 e1 J% n   
- G* n# l8 ~6 e8 w/ V   
3 u) ^* ~! R& S8 LEnd Sub: n: K" J7 h7 n7 @$ K& A2 s% b
Private Sub timer1_timer()* d2 b0 [. c/ c/ s0 L
   
' L/ K: m- J. F   MSComm1.OutBufferCount = 0 '先清空缓存6 l! W! [6 j! [) r& @* H" P+ ~
   sendbuffer = "H!i"
* b) Y. l5 j4 A6 j   MSComm1.Output = sendbuffer9 @. [  F' k5 k' A3 X
End Sub  }: I: @) i2 w* g
'结束( Y7 m& a* h7 R( R) {  C. l3 v
Private Sub cmdStop_click()( l0 x2 n. l  x
    Timer1.Enabled = False
3 V3 m8 i( M7 l    Timer2.Enabled = False
2 T* i5 i( V3 @* a) w+ J( l$ e    Timer3.Enabled = False
) B# \& {* P  _& z& Q9 `! @+ MEnd Sub
% F4 g! X) d! j1 c% U0 V; i( e4 S5 c7 _; e
'接收数据
9 G$ q6 p0 d% K! r$ J1 e! u0 iPrivate Sub MSComm1_oncomm()
3 M2 \) G( I' s) F/ [+ [; o  q    Dim inbyte() As Byte0 u( J! B2 j: Q5 o4 K% N
    Dim revbuffer As String1 M/ P5 l& U3 e2 ]
    Dim a, i, b1 o! g/ ?7 U" {9 F( d0 b' h
    Select Case MSComm1.CommEvent
# H2 a4 r% L: M       '如果有CT在感应区1 V) ]7 ?2 G$ S5 K+ t+ t9 A
        : g; u5 l  h" g) U. T" {' W" t- S# q
        Case comEvReceive; ~4 K) K; l2 J  b  Z* `
            inbyte = MSComm1.Input
! V; X7 p$ c# f& y            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制/ q  {& p& e- }
                revbuffer = revbuffer + Hex(inbyte(i))1 Q+ s5 M  M9 p* R  X! U; b
            Next i
  j! f. i( p4 I; ]/ X2 B# |            txtHex.Text = revbuffer
# f2 S& W* {2 ^! i# s4 G4 I            If Mid(revbuffer, 1, 6) = "480310" Then
" e5 g# Q0 x7 H* Z1 [' U8 ]9 s2 ^                Timer1.Enabled = False
/ a8 M9 t: a, v) h. i+ c2 [# C- j* P                Timer1.Enabled = True( Y2 \7 \4 g4 W: `" T$ \3 k. h
            End If! O. k4 I4 ^: X( G% x& m! [0 {
        End Select
, ]. O, ~+ ~2 H5 ]7 U% |9 ]# F* m        Case comEvSend
( t) Q6 N5 e! }& ^& K/ i9 r    End Select' V& X7 X0 h4 d( R8 q) m1 N- |
Private Sub timer2_timer()1 v" D  W1 t3 z: Q4 A' N8 L5 P" l
        MSComm1.OutBufferCount = 0 '先清空缓存1 m6 M. W- T/ m5 y) Q9 U" w/ x
        sendbuffer = "R00000016U") t1 |; \6 M( t% h* i" h8 h! J+ \/ R9 A
        MSComm1.Output = sendbuffer
4 h' l4 U( B' ?: e. W) H1 HEnd Sub/ g. e  h% z9 k0 @
Private Sub MSComm1_oncomm()
# X" y2 [! P5 Y6 U  m5 K    Select Case MSComm1.CommEvent
* c" p5 ?; \  w( R+ X5 D        Case comEvReceive' A# f  U- G% ]7 e
        inbyte = MSComm1.Input7 o$ f( P4 L4 l  v) D
        For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制5 W2 @( t3 c2 Z. C, ?. Z" m1 q4 i% x
            revbuffer = revbuffer + Hex(inbyte(i))8 @; L7 n) }& _7 {+ {
        Next i
5 V, T& L  X7 Q7 a& I1 G) J* a        txtHex.Text = revbuffer+ @4 |/ B1 l/ K) y' Y. h
        If Mid(revbuffer, 1, 4) = "6030" Then  W4 s. c8 G5 r7 x( ]$ L; _
            Timer2.Enabled = False! r/ v% G! p1 o- A$ X3 j1 E
            Timer3.Enabled = True9 E( f& h$ V9 I% I
        End If$ f& r1 R- {9 e8 G/ a6 k
        Case comEvSend/ t1 y% m1 m  X0 L/ }
    End Select& W( D" M1 ^- `) N, ^
End Sub/ ~3 {! n6 P8 B3 \4 n
Private Sub timer3_timer()& u( ?& ~# W( S, G! `
    MSComm1.OutBufferCount = 0 '先清空缓存  D3 i& i8 C' x$ Y( [# y6 |( i
    sendbuffer = "STX"
: d1 b3 @! m4 _    MSComm1.Output = sendbuffer
/ ^: l" d4 e5 j4 Z& _, r6 N5 h, A6 x& l    Select Case MSComm1.CommEvent% a" k8 \  b1 M3 t
        Case comEvReceive
3 z7 O4 l. U2 C+ t" G0 y) R            inbyte = MSComm1.Input6 E/ e! k# B& S9 @. I3 u
            For i = LBound(inbyte) To UBound(inbyte)            '返回数据转换为十六进制
' x7 b8 p! ~( p+ J5 W" {. X- y  V/ T* c                revbuffer = revbuffer + Hex(inbyte(i))
7 }9 k% z/ g! Q7 k) Q9 r1 f  G            Next i
$ c. X' d/ O# ]4 g0 v            txtHex.Text = revbuffer
) j/ n) ^# ~) b            Case comEvSend
5 F2 ?5 o% u( _    End Select( J. P6 E. j' v( P% H+ r
End Sub. C1 D8 B5 g" d0 ~; {  m9 h6 p
7 p4 S8 j! y6 r5 ^. ]1 @& b! O
+ w( s( ~' @# }7 A4 C+ a  V7 \

. S6 j3 m+ S1 w: {, C+ K  Y: i. Q
回复

使用道具 举报

发表于 2011-4-1 09:22:34 | 显示全部楼层
这个问题感觉不难,但你描述的有些乱,让人看不明白。
+ M' k, H# L9 L6 X7 _我也用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 | 显示全部楼层
回复 无能 的帖子7 M; A. W# _- {4 H. j

* {* h0 Z# L* I; H快了。% R2 H2 A5 B! ~% ]" t' M
设备通信协议我没看清,这个设备的通信不用timer。: x0 w5 [3 w7 a# T$ K
回复 支持 反对

使用道具 举报

发表于 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-2-23 23:42 , Processed in 0.068988 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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