数学建模社区-数学中国
标题:
串口转tcp工具
[打印本页]
作者:
2744557306
时间:
2024-3-31 17:19
标题:
串口转tcp工具
#coding=utf-8
0 W" I, S' s+ d/ e5 K
6 D* s! |1 [7 Z# Z6 q9 m/ P
/ I" i0 _2 R* n+ _& T. X" C
import sys,threading,time;
/ m8 @) e: c) i6 i9 y
import serial;
1 q" o" e& V7 P) g! B7 G L9 d, T0 C
import binascii,encodings;
, p3 _7 V( g4 `/ V9 z/ N8 U# O
import re;
. K x' z4 x% t' x1 i
import os;
, |% J6 J3 O- H$ e" G
from socket import *
& B- \2 t4 Y; M- h a4 y' |
from struct import *;
- o4 k6 T8 _* E7 w: c7 h! @# a/ n
#from myutil import *;
7 D: ]8 D! d$ P$ H6 Y
#name: myutil.py
* g m* N8 K# @8 O# T
9 d( y6 H' y: m
mylock = threading.RLock()
" G& N$ ?# r6 K$ q6 h1 s
* Y3 ~/ C2 ~* j, w$ B' y. U
Server_IP = ''
- `" A d4 L2 |4 h- u1 `9 ^
Srever_Port = ''
6 {1 L. d. M3 L5 I+ }" ^ h
) V9 w; W+ Y4 d# I( {+ }
def print_hex1(s,prev='0x'):
; d i4 s$ b, c* l' h2 G
for c in s:
' a: t7 l( N4 T/ A. R
print '%s%02x' %(prev,ord(c)),
5 A9 f0 F0 G" R& ?6 O H7 w
print
. N" W+ c3 v/ \1 |
def print_hex(s):
. M" v& h# G$ ]5 M
for c in s:
) U! s, D6 }( g+ s
print '%02x' %(ord(c)),
3 F6 Y* p b+ T
print
2 c9 K. j6 ]# ~9 p" n" U
2 t, ?7 k& B o
def hexto_str(s):
( N0 K4 u. R! L! h$ j
r =''
) I$ ?1 J( Q) s
for c in s:
( y7 X$ v q0 j* e1 A+ c
r += '%02x' %(ord(c))
5 e7 ^ O: y6 q
return r
. y* G% Y. L u' n5 R
def strto_hex(s):
$ e2 V# \$ m6 Z# S) b
r = s.decode('hex')
/ W4 j z% N3 Y( N2 E% C ?# k
return r
4 d+ q' n* z' x; b( F: }
#''代表服务器为localhost
6 x" v/ X/ A+ n. [* D3 A
5 ^" S: j h* N+ Q0 {
#在一个非保留端口号上进行监听
; x' x" N2 d% M" q/ d
/ C# E' u S7 c; ?: Z2 ?3 p
* Z' r8 t0 G' P6 R5 n
class ComThread:
1 a5 ^+ Y2 ]: J& e
def __init__(self, Port=0):
# |0 Q: G8 P! {1 c; g2 v9 ~3 k* j4 O
self.l_serial = None;
$ M' `8 ?3 a2 x: B0 J0 ?
self.alive = False;
+ ~1 x1 U8 v4 x* `. j3 ^! D" S, [
self.waitEnd = None;
6 @ g* i! c; Q& Y6 h3 F/ e& E- h
self.port = Port;
8 P1 ~* `) M3 D. O
5 i: h4 ]# I% j8 k: U& n) c
#TCP部分
6 A; ~% |; H0 {
#self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
5 c+ f5 \) i. `+ k) r$ W' z
self.connection = None
2 m7 a% @: {5 W) l; M# P; E" T
#数据
- a2 u- z9 r0 q
self.snddata = ''
9 F F# F" ]9 i: T4 H% J
self.rcvdata = ''
4 k/ P- X6 k: Z
6 r$ H: N& A9 ~( ?# D0 Q6 ~% s& g. @9 l
def waiting(self):
; w# d0 ^- A. i! j5 }2 U6 I" R
if not self.waitEnd is None:
+ m# [8 H% X7 F: w% T* B) R
self.waitEnd.wait();
' B+ i {; I+ B4 ~1 T: R4 E
) \6 e4 v) Y; R; |3 o
7 a% y& Y% y, |, L. a
def SetStopEvent(self):
/ j$ u! y* i1 U/ p) d2 c
if not self.waitEnd is None:
9 @+ N% A# s: [# F
self.waitEnd.set();
; Z y J a2 K2 B0 y- ^# H
self.alive = False;
* U! X R7 i- c* M6 S3 N, e
self.stop();
! g; R3 V0 Q; v5 A
- a4 \" T& T5 N) Z/ P' A5 _- y
+ t: B& |( [# p& g0 H2 T
def start(self):
j0 O3 r, |( Z- e; Q" r$ T1 ?3 `& q
self.l_serial = serial.Serial();
0 z- d$ F( W- z* }9 j
self.l_serial.port = self.port;
8 n( ~* x; ?6 X8 B
self.l_serial.baudrate = 115200;
* c4 s7 H! \4 k% d- @
self.l_serial.timeout = 2; #秒
! p P! e* y( h, w8 t* X; [/ g, y
self.l_serial.open();
& i2 e" q2 ^& T: O+ W& V
0 H; i: h2 K/ G6 c# |* I. i" n
if self.l_serial.isOpen():
. l5 o4 u/ v5 }. H9 H) v
self.waitEnd = threading.Event();
6 y0 r* m8 i) \- J% X2 d
self.alive = True;
* U- g7 \6 \; l. F" |" |# Z. M
print 'open serial port %d ok!\n' %(self.port+1)
$ R3 O h/ R. s$ |$ M- o
print 'baudrate:115200 \n'
1 E* P, e- B8 ]" g! J( s9 ~. c8 f; c
self.thread_read = None;
! a$ J0 o/ g6 S- h" @$ F
self.thread_read = threading.Thread(target=self.FirstReader);
% Q1 D9 e6 L& } i
self.thread_read.setDaemon(1);
" Q6 o" P# J1 D9 P0 N/ R0 [
self.thread_read.start();
" h$ o, u+ r" f: A" ]
8 V* o* A2 d- `: ?& l
self.thread_write = None;
. c, } P6 `/ j3 u; l- d
self.thread_write = threading.Thread(target=self.FirstWriter);
% T/ i* A4 i2 I/ U4 @
self.thread_write.setDaemon(1);
5 o- u0 U; r& C# j; ?
self.thread_write.start();
1 y$ _6 k: k. p
# E/ l+ m! W; F4 O
#TCP部分
( h/ y( l1 _/ a. p6 v' n1 g
self.thread_TcpClient = None;
+ U0 b' C. \7 P' r8 G' b+ u
self.thread_TcpClient = threading.Thread(target=self.TcpClient);
' w8 s( H5 Y7 P9 e# i
self.thread_TcpClient.setDaemon(1);
; c+ G d2 V0 Q* l% ^
self.thread_TcpClient.start();
7 V+ C8 }. B' e% K+ T
3 B1 z- q9 Z; x. J) A' q5 t
self.thread_TcpSend = None;
3 R- W; E. R# [+ | x, O8 N
self.thread_TcpSend = threading.Thread(target=self.TcpSend);
$ y% Y- M% N9 A9 a4 t/ ?. X' e/ H9 ]
self.thread_TcpSend.setDaemon(1);
9 E8 x ^% w1 Y% I: t) \. F* k6 a( H
self.thread_TcpSend.start();
$ Y3 m% b# d6 h5 |' Q; k( V" Z
+ c7 W5 x- V2 O( b, a
return True;
$ r) a3 H, I2 p% P( T
else:
3 A& O- }( ~% @, W1 |
return False;
, \+ m. N, q M' b g
! X' j( }, M x, p, O7 z( X
$ F- x) s" B3 B3 \$ I( E$ b) A
def FirstReader(self):
, C* E4 o; y3 [1 E& ?7 X# E
while self.alive:
6 ^1 |- t+ w" a' y! U
# 接收间隔
- q p# x0 C7 b; ~. n) B
time.sleep(0.1);
' N0 V9 O& X0 R' u7 Y
try:
5 S; ~9 \' B$ Q8 D7 K; }
data = '';
0 z% i* k. | s! i0 H. f! B
n = self.l_serial.inWaiting();
4 F7 p: h C. A: |2 G9 x
if n:
/ |- _& ~. O e; s) Q; Z
data = data+self.l_serial.read(n);
/ K4 N4 V1 Z9 v' e# H% o, D
#for l in xrange(len(data)):
( a5 i8 h! |0 T1 e
#print '%02X' % ord(data[l]),
7 @4 X/ W+ X3 e! L
# 发送数据
+ K) w$ T- O( D/ L5 x- J
print u'->请求:'
, P! v# d- _1 F
print data;
h6 b* h1 ^- L7 W6 `- y
mylock.acquire()
/ ?, J" ~7 A: u- ?7 q
self.snddata = data
$ T9 D5 { M& ?: F4 w- j: F2 k
mylock.release()
7 f, M% i* Q6 h& I K& L) O
#print_hex(data);
5 U( o2 X" \+ o5 ?
- \& {9 y# t# g0 `
1 e2 v* C2 H# D6 }- n
# 判断结束
; b1 @+ w% s# J2 F- C
3 ~- G5 n5 v+ p# P9 [0 n( b& W
except Exception, ex:
. O) _- |* }: T/ X$ U( E8 ^+ ^
print str(ex);
# l/ x O; K, i# @5 P8 M
% T9 B8 m2 P* `1 s7 s
self.waitEnd.set();
* y# X/ f* a% M a$ u
self.alive = False;
Z8 z- f, z1 `, @& ^$ F
+ n6 G6 Y1 m8 X7 ~2 _+ U
def FirstWriter(self):
$ \2 {/ z& W& V4 c/ _! Y
while self.alive:
2 f9 K+ `4 ]8 z R3 e7 ]% W
# 接收间隔
, S4 C1 M) d5 R6 W
time.sleep(0.1);
7 e; E* ^: h- k T. z; G# N+ N
try:
: U6 t! B; f9 v8 R! |$ h
#snddata = raw_input('\nenter data send:\n')
; ^# q9 d9 f- e7 T2 I) P
if self.rcvdata!='':
! f0 [% @! e! ]: m4 ]# T
self.l_serial.write(self.rcvdata);
$ @8 W2 r$ p d% s0 {
print u'-<应答:'
8 o& m/ [' X/ k% c
print self.rcvdata;
% D: |7 \' A- Z1 G0 \# |1 Z
mylock.acquire()
, V6 N; f/ _, @
self.rcvdata = '';
; C4 ~: l9 @1 q- m7 N2 f; g( x7 ~
mylock.release()
0 I4 c8 z3 {0 p- z! {
#print_hex(snddata);
/ M- @3 t2 r7 v% W2 ~
% I5 F; C; T% h" e( ^6 I' O9 o& A. x
except Exception, ex:
w4 }, E6 \9 O7 ] v
print str(ex);
8 I0 A' o( f: a' }
self.waitEnd.set();
4 I+ j* M* N& J" \" S3 l
self.alive = False;
* a" q% ^) L( O: R3 @. ~# ?4 Y
6 D$ S# m! N2 T0 N
def TcpClient(self):
+ s9 N% O+ n: ^8 {
while True:
. a; V3 B! v" T& q( i
# 接收间隔
5 W$ J& M! o# }1 G- u
time.sleep(0.1);
2 B6 ?' @1 Z! S1 G1 l; c
self.connection = socket(AF_INET, SOCK_STREAM);
7 }& x% U8 F' G; I( H6 R
self.connection.connect((Server_IP, int(Server_Port)));
& k# ?% G3 b! B, \( [
print 'Connect to Server OK!';
% K9 v5 {: y; d* z
self.snddata = ''
$ z n* m6 b0 q
self.rcvdata = ''
* h( l3 J6 ?3 J+ d
while True:
2 V# L% W' q- u2 u4 |. {% J
#读取客户端套接字的下一行
2 P8 x( r. D/ U3 I5 Q7 c
data = self.connection.recv(1024)
, t7 C9 m$ \5 R, o% S g/ ]
#如果没有数量的话,那么跳出循环
7 i4 B- V0 s' Z" z
if not data: break
4 t$ ~* f; b+ w5 q& `" Z8 P7 U6 k8 H! W
#发送一个回复至客户端
8 a' L6 U# {0 q# l% R
mylock.acquire()
4 [' S5 d6 E# H
self.snddata = ''
: y) @9 W5 r$ X0 J) j- p( R
self.rcvdata = data
6 ~; n1 S/ A$ z; `4 Q* }3 L3 ]; \
mylock.release()
" q% Y r# }- a ~5 u7 y$ m
#connection.send('Echo=>' + data)
. W h0 j+ s, L+ _. b# H! \" }
self.connection.close()
: I& M* H u' k8 C; A% G
9 y2 q4 ^- K9 @7 C% L
self.waitEnd.set();
4 R4 K$ U& a0 q( n
self.alive = False;
9 I! K* ]* {) b9 k t
7 R! A5 l+ @; o
def TcpSend(self):
2 k* D0 L! W1 c; w6 i
while True:
9 N" F: ~: [/ k7 z' I- A: d* N
# 接收间隔
% \( T: @# e8 c0 K
time.sleep(0.1);
0 d; O) i5 Y, l; \ ~7 g( U
while True:
, ^* R% B# S# C7 M [
time.sleep(0.1);
% c, G3 G% D" F- _ B4 s
try:
, w* x0 ~: w0 t2 O: k
if not self.connection is None:
' V+ ~7 N5 M# o7 a9 L
if self.snddata != '':
% V: i, y" u2 V6 S; T9 J( O- K
self.connection.send(self.snddata)
, |8 @9 v) l2 [( o* l9 u$ `
mylock.acquire()
2 R( a5 }" c5 e9 D& A5 j$ i2 s
self.rcvdata = ''
5 T ]* g! Z7 J4 e
self.snddata = ''
0 e5 I! K7 }3 z T
mylock.release()
4 b5 W6 h6 x; s
except Exception, ex:
; ?* f4 A% r: D
pass
& O1 \2 m% C) l( x9 K$ Z
def stop(self):
8 B) G- O' [. Y' A: M7 i
self.alive = False;
( ], I, m$ q" T* {, C' z
self.thread_read.join();
+ E6 W* A Q2 P) N. E# f8 ?! E! w
if self.l_serial.isOpen():
6 T4 B. }$ G1 j- x
self.l_serial.close();
( V9 Y& g+ p" B0 R& S
0 i* B1 k- Z8 ?1 }
; k4 N/ {% U: d/ Q ]2 P3 K5 e8 c
/ i! X. l. u) S( v, [2 q( T
#测试用部分
& n% q/ _( X' o: B1 I9 g. i
if __name__ == '__main__':
5 y9 K" y1 D9 x" G8 g- w1 \
print 'Serial to Tcp Tool 1.00\n'
& P% f3 Q. I+ ?( ^3 t
print 'Author:yangyongzhen\n'
( d8 B1 K- Q- E4 _8 w! w# `4 W# G4 u
print 'QQ:534117529\n'
_6 k Z) }- B3 J' J# f
print 'Copyright (c) **cap 2015-2016.\n'
; x7 b, |$ X! H: m; m+ v) ^9 ?2 B' m2 w
" R5 ?1 W# [ \6 w/ ^
Server_IP = raw_input('please enter ServerIP:')
% x* t" ^! T: d& P- H3 g$ M% t
print 'Server_IP: %s' %(Server_IP)
* _/ v! C- u V- R: Y2 M; b& T2 A
Server_Port = raw_input('please enter ServerPort:')
3 f/ f. m4 X. A4 C3 F
print 'Server_Port: %s' %(Server_Port)
; E9 L; {* h" N' p$ X% Z
com =raw_input('please enter com port(1-9):')
$ i# a0 u3 m Z1 ~( Q# k+ j% b2 q
rt = ComThread(int(com)-1);
$ l3 q5 @$ l% u
try:
5 ~1 \2 Z% J6 W3 h5 O2 t
if rt.start():
- n" ^7 n+ W' Z$ L
rt.waiting();
% h! \7 Q5 L' n5 m7 @; g; f& F8 m
rt.stop();
# ?. t" E+ b& @7 s! H4 u
else:
* K h, ^3 y+ f' Z
pass;
3 d6 s! m2 S7 C0 O u+ z
except Exception,se:
; Y% J8 @$ n+ r7 P, b0 A; x
print str(se);
2 Y7 V- R4 @+ T% U" X% h. Y
) e9 f& D2 l- S( h
if rt.alive:
! b2 Z" Z+ V" F
rt.stop();
3 ?( C. d9 L2 N- l$ |
os.system("pause")
$ m, G. u0 s* w. b. {. r* S9 I
2 F7 A1 \/ v+ h4 }5 ~0 j' e8 D
print '';
. g: c8 c1 g" s
print 'End OK .';
; m$ m2 Y. U* t6 f1 W- q. F% s: }
del rt;
复制代码
1 ~ y; l9 O$ ?1 N
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5