人妻暴雨中被强制侵犯在线,亚洲国产欧美日韩精品一区二区三区,四虎影免看黄,国产无人区二卡三卡四卡不见星空
機械社區(qū)
標題:
求助:VB6.0 MSComm控件串口通信發(fā)送循環(huán)
[打印本頁]
作者:
robi
時間:
2011-3-31 21:03
標題:
求助:VB6.0 MSComm控件串口通信發(fā)送循環(huán)
項目需要用MSComm控件實現(xiàn)射頻設備與PC的串口通信。先說一下設備發(fā)送命令后會返回的相應的數(shù)據(jù):
( F& ^$ G y. I& {2 z! i
& N6 }# E/ I6 l4 d3 c* d
當發(fā)送命令"H!i"時,為尋找芯片。
F3 Y2 f% h4 W4 c: D
當設備連接正確又無芯片在感應區(qū)時,設備循環(huán)返回:0630 和 1537
4 h) x3 k* D8 L% X
當設備當設備連接正確而芯片又在感應區(qū)時,設備返回0630,稍有停頓,繼續(xù)返回4831+其他信息
7 I5 G, o$ M2 E! I* f! @, ]
' K4 R! [, G5 S8 t! o7 I/ B( h
當芯片在感應區(qū)時,發(fā)送命令“R00000016U”,讀取芯片前十六字節(jié)數(shù)據(jù)
0 n! v5 N2 V- x3 ]$ w
沒有錯誤時,設備返回:0630
5 g/ H: M3 j( O! @1 z
此時,發(fā)送命令“STX”,或十六進制命令“02”
( E: v1 g9 d; _- C- Q
設備返回前十六字節(jié)數(shù)據(jù)
2 x6 \! U3 Z0 q% K5 |$ P b6 l
" v$ _) d. z) x' ?4 [
之后繼續(xù)發(fā)送命令“H!i”,尋找下一個芯片
4 S3 W g% ]( t+ i
--------------------------------------------------------------------
6 n& S1 P+ \3 v [
項目用MSComm進行串口通信
. s/ t5 B z, s. Z3 r8 @0 b
需要將上述幾條命令循環(huán)起來。我用的是比較MSComm1.Input是否為爭取的返回值“4831”和“0630”。
8 ]3 B: e/ G; r* H" C, [- l
用了三個timer來控制三條命令“H!i”、“R00000016U”和“STX”的發(fā)送。把發(fā)送命令都放在了timer_timer下。
1 I I2 m/ Z2 T" v
但是這樣的話,就用到了三個Private Sub MSComm1_oncomm()。系統(tǒng)報錯,“發(fā)現(xiàn)二義性名稱”。意思應該是不能重復定義Private Sub MSComm1_oncomm()吧?
9 Y+ C3 s& u" k( d6 ~$ W3 p
----------------------------------------------------------------------------
$ H; ]( K3 H) o# D/ \- B+ h
其實程序說簡單些就是:
) X, }2 q5 k1 n3 z$ u
發(fā)送命令—>從數(shù)據(jù)返回區(qū)判定->發(fā)送命令->數(shù)據(jù)返回區(qū)判定->再發(fā)送命令->接收數(shù)據(jù)
$ l" m7 x; h% B& e: @' Y
這個循環(huán)要怎么實現(xiàn)呢?
! R. G8 @# F+ e6 ]) i
先謝謝各位!
5 a' E% k2 E8 G6 e" c+ n) T4 K
2 B. @! d$ @4 B" l
--------------------------------------------------------------------
! j" x# _- P8 `7 Z
下面是循環(huán)部分的代碼。系統(tǒng)報錯
& N1 D1 g. O6 v! {
Private Sub cmdStart_click()
/ g/ q9 N" v8 L, l) O. ?6 p
Timer1.Enabled = True
. [4 N# F6 S3 w, @
3 d2 M7 `9 u9 Y7 H/ B- k$ t& ]
0 i7 j; j! p/ c% U9 o
0 d' [2 f, I! t& m& l1 n" q
End Sub
, {3 y" L( H0 B* D& \
Private Sub timer1_timer()
6 Y8 \8 S" t% x# I7 X
4 a& ]$ E9 p4 j0 p' h1 O
MSComm1.OutBufferCount = 0 '先清空緩存
3 Z# w5 |! E4 d/ R# P! z' B
sendbuffer = "H!i"
( x2 O( x( C+ \4 O
MSComm1.Output = sendbuffer
4 M8 e; P& F- q3 w/ q% M
End Sub
% W3 G; f8 }# N
'結束
' |6 T. o3 E& Q
Private Sub cmdStop_click()
B& M, u& L$ j; P& V+ q* G
Timer1.Enabled = False
* {9 a0 r" t( l) n: z" r
Timer2.Enabled = False
7 O, T# J. f: E; }5 L/ B; n
Timer3.Enabled = False
7 l ]; a& q: h, \/ _- J) U# y
End Sub
- B% K6 O. w2 y5 k
' E( a" J5 M7 d( W
'接收數(shù)據(jù)
* ]- R# r# u* u6 q
Private Sub MSComm1_oncomm()
4 A3 j! U' Q* J9 X2 O6 X3 U
Dim inbyte() As Byte
6 l$ A9 A2 A- ?8 I5 g
Dim revbuffer As String
' ?! ^9 |8 `) M, o3 \
Dim a, i, b
6 ^1 O3 h6 I$ W5 I: Q8 T0 y
Select Case MSComm1.CommEvent
1 E$ A% P% |- o6 i: \+ ]: t* d
'如果有CT在感應區(qū)
8 g4 r2 x/ r5 y) I* x) W* l
: b: J9 m* c* [9 d4 n/ [5 U
Case comEvReceive
* z5 ^3 M+ ~; F [) Y
inbyte = MSComm1.Input
+ F( t9 P6 g% x9 l$ b
For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉換為十六進制
5 Q' w2 `( |, G. Z d
revbuffer = revbuffer + Hex(inbyte(i))
, z) T& f; E$ w% f- j
Next i
. p* x& o/ z" J" r/ S2 ^
txtHex.Text = revbuffer
; l5 G- n+ y" C9 ]: o$ d
If Mid(revbuffer, 1, 6) = "480310" Then
, b* O; x# X4 H; V+ C
Timer1.Enabled = False
. M0 A2 z* u T* Q9 v5 T3 r
Timer1.Enabled = True
1 S0 ~* N9 w8 c+ l* X) S# _" x
End If
$ m+ z& g4 T; z0 O
End Select
3 |( l( S/ s8 L# f5 a
Case comEvSend
$ `! U* V0 z% y) X; G+ g3 ?
End Select
6 e+ K7 L# m, O# G9 M. W4 Q; w- u
Private Sub timer2_timer()
/ T9 d, } @, O
MSComm1.OutBufferCount = 0 '先清空緩存
* ]5 L7 u0 T: K! P/ n4 t5 d3 `
sendbuffer = "R00000016U"
6 ~1 Y, e. T( e- B* L! B
MSComm1.Output = sendbuffer
. m- a w8 t6 V; |) k
End Sub
8 A7 z( ~2 @% e# |3 I# c/ x# ^/ v6 {
Private Sub MSComm1_oncomm()
8 ~: v/ S1 t3 W) e! B8 h
Select Case MSComm1.CommEvent
) x( l6 a; H# R$ S1 k4 L6 V& P
Case comEvReceive
5 L, E9 q, ^( Z( x4 ]
inbyte = MSComm1.Input
& p9 _: L6 u8 E3 d
For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉換為十六進制
6 R7 z/ I6 p1 M5 F9 N
revbuffer = revbuffer + Hex(inbyte(i))
& r7 J( m4 O5 b
Next i
& v% r5 B4 S, ~* }! ^; P
txtHex.Text = revbuffer
" w/ V* ]5 W" ?+ i q! _5 f2 c
If Mid(revbuffer, 1, 4) = "6030" Then
4 C7 p) d7 u* w* @- n
Timer2.Enabled = False
' g% `: k, u) V
Timer3.Enabled = True
: w' ^- t+ b% o: X5 k6 i, b
End If
- D2 s' Y v7 r2 Q9 b4 M: R# I
Case comEvSend
3 {, l$ c, k+ A
End Select
- j+ a, c% L( B1 o }, m; q, s% a' r$ ?
End Sub
+ ~0 [) X7 a( T$ H- T! a* Z
Private Sub timer3_timer()
( k& e6 H. q J: v* Z
MSComm1.OutBufferCount = 0 '先清空緩存
. s$ L( ]- W- Z8 Z' Z/ H
sendbuffer = "STX"
6 m0 K# A+ ]8 F# n) d
MSComm1.Output = sendbuffer
5 H& o I+ Q O; J9 j
Select Case MSComm1.CommEvent
$ n4 N3 l* B# z3 j5 A+ Y
Case comEvReceive
/ r& e/ M) u, i. d. b
inbyte = MSComm1.Input
5 C6 L' h2 v% L- K/ n- w
For i = LBound(inbyte) To UBound(inbyte) '返回數(shù)據(jù)轉換為十六進制
( f3 F4 I' w K* y8 G
revbuffer = revbuffer + Hex(inbyte(i))
% \ X b! `; [
Next i
; [2 h0 ] F' y. N% n
txtHex.Text = revbuffer
% c* @4 U2 x( b0 n
Case comEvSend
0 ~* |" H0 V& |* J, `
End Select
9 G, J" g7 x8 N
End Sub
# e# _7 c+ v) O$ Z' W
8 A1 t4 K: Q$ A* o& |) A3 Z' O, O
) F0 W: R+ m/ F, m/ [0 {
4 j$ K* O0 _7 D+ b- H
作者:
無能
時間:
2011-4-1 09:22
這個問題感覺不難,但你描述的有些亂,讓人看不明白。
1 }4 i! _9 E- L# E6 n) d3 z
我也用Vb編過一些東西,歡迎交流。
作者:
無能
時間:
2011-4-6 16:50
不知解決的如何了?三個Timer確實很混亂。
作者:
robi
時間:
2011-4-6 22:47
回復
無能
的帖子
5 S- W f, n+ k& k8 \ h
( x# h, J6 p6 Z! V
快了。
$ w: p! P9 [" o9 _/ t
設備通信協(xié)議我沒看清,這個設備的通信不用timer。
p. j/ C' i# ~2 E0 v4 G
作者:
1393065141
時間:
2011-5-4 22:34
學習、、、、、、、、、、、、、、、、、、、、
作者:
robi
時間:
2011-8-15 20:09
后來發(fā)現(xiàn)其實這個通信程序的關鍵在于要弄清收發(fā)信息的格式,也就是MSComm初始設置時,是二進制還是文本。這個很重要,否則通信會出錯。
作者:
機械電氣編程
時間:
2012-11-15 11:31
讓我想起了,我畢業(yè)論文就搞的這個。
歡迎光臨 機械社區(qū) (http://www.xa-space.com/)
Powered by Discuz! X3.5