数学建模社区-数学中国
标题:
串口转tcp工具
[打印本页]
作者:
2744557306
时间:
2024-3-31 17:19
标题:
串口转tcp工具
#coding=utf-8
' Q6 b. S7 x8 o$ e" A4 r5 f
7 Y+ B. M# ^1 b5 [- j- c
. _9 N9 ]& a/ b. A3 x
import sys,threading,time;
: w" S8 O, R- D N2 ~+ A
import serial;
* r, R. M: I% l8 O i; X
import binascii,encodings;
1 s5 i- U; u3 I: } t! i; g
import re;
* F! j9 C( m" a9 g& B! }
import os;
2 c& F5 E$ K1 L* R/ _
from socket import *
$ V. z+ r* x% @" q
from struct import *;
& I: E* z4 Q: F* }
#from myutil import *;
0 U- f: X, d. `# y1 j5 ]3 G
#name: myutil.py
1 x1 s/ p# z4 J. v
2 f2 R& I6 }* |" w q7 d
mylock = threading.RLock()
9 d% Q5 h! Y! W" [3 l
8 j$ H+ {! U# [" c1 L8 p7 V' d2 @
Server_IP = ''
3 T+ n; }4 e; s% H* {
Srever_Port = ''
' H ~2 F& j% k3 H
6 D; {5 D( s- p/ f3 {7 |
def print_hex1(s,prev='0x'):
! E9 J9 F0 o5 N n, w" @
for c in s:
6 r% \) U9 }. `; P8 `2 U& @
print '%s%02x' %(prev,ord(c)),
* V- m) o1 W2 U& A# R' J
print
6 } m* E7 e/ l; z8 n
def print_hex(s):
+ l m/ y1 y# i8 m
for c in s:
% t m! }2 L; `6 s/ u6 j
print '%02x' %(ord(c)),
% _' `# }" n) a" `$ E
print
. M k. W/ N( N, t) z3 v6 a' l7 ~! _
! n9 d f" }# z7 c: ^$ q
def hexto_str(s):
0 V* @. ^! x3 [6 o
r =''
/ M2 n# z% g3 K: }( U8 J: I
for c in s:
! I3 M' N) i, h% n! z0 X
r += '%02x' %(ord(c))
# z6 I4 Y; E! t) V
return r
+ z# F( \/ f* b
def strto_hex(s):
2 M8 U0 z7 q0 o/ A9 c, {' i
r = s.decode('hex')
5 B! N$ U& b0 }9 ?, z8 ]$ b$ \" ~
return r
) V* x* L6 j% t; n( O
#''代表服务器为localhost
' a* s8 e) W* W, r' n8 F
: g) o; o# b2 y7 g
#在一个非保留端口号上进行监听
1 ^, F) C/ }5 X
3 B* E. w% a! ?9 P8 f6 d+ R
8 ~9 F3 B6 r/ H
class ComThread:
4 w6 Q# w# l& _. v# r
def __init__(self, Port=0):
/ j) O) P9 _% u1 W7 D$ Q
self.l_serial = None;
' X/ X* g3 U* G U6 B
self.alive = False;
. u3 N ^0 Z' F$ C. }4 X
self.waitEnd = None;
9 ]9 \$ F$ D, S. T& N' B, K
self.port = Port;
; ?4 q, B, Q6 ~& f+ Z1 O
! R+ _ e' a S) q; l
#TCP部分
, V+ M5 u M; }
#self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
1 ?% W% C, S6 p. r
self.connection = None
3 P! }+ c# @! `. s: ]5 I- I) p0 ~
#数据
7 X: G9 I3 C$ U' X0 h: A3 _
self.snddata = ''
Z4 F- V% V( y* [6 H
self.rcvdata = ''
* L+ e( K/ ^9 Y) ^' q2 r0 _
, W6 z* G, d, _: T& t
def waiting(self):
5 z. g. n8 W) Y5 C% S5 o
if not self.waitEnd is None:
6 I. s+ V3 n: l% J* K
self.waitEnd.wait();
$ ^3 `. `* ]0 l" V
1 _+ A/ W. o" s# J: `; }
# N, [1 D B7 ~# J% ~7 H$ k, h% C
def SetStopEvent(self):
& O( x% H( H- G5 J5 \
if not self.waitEnd is None:
% d- a; ?- v+ `; Y7 c% T
self.waitEnd.set();
! q. n* z' e" r* F* L7 B# C# @
self.alive = False;
- z: K: X% _4 S s" E+ U
self.stop();
( c8 Q; G4 N- \. r
, S( D J+ m4 k' z
; z2 X, R9 ^- V- L
def start(self):
3 X4 Q" W7 g/ O) `4 k7 E
self.l_serial = serial.Serial();
' ^0 `/ p7 F6 C/ q) h5 j" g
self.l_serial.port = self.port;
9 r* P/ T* o5 s4 e
self.l_serial.baudrate = 115200;
7 Q' h! |- o0 w& ?/ g/ j6 J; h& r Y
self.l_serial.timeout = 2; #秒
0 S; h% _; ~+ M+ _9 I( D
self.l_serial.open();
) c' w7 V* U$ |: [
* G9 Y9 @' i, |
if self.l_serial.isOpen():
) G! D D2 f. i9 p' y
self.waitEnd = threading.Event();
}; c( y% W r0 {8 N0 M" ]; d
self.alive = True;
. X4 a3 v* ]( y: @ ^
print 'open serial port %d ok!\n' %(self.port+1)
3 ]/ q4 j2 t' T% t, Y4 D5 m4 B, Z1 b
print 'baudrate:115200 \n'
1 Y _. q3 ^' O# e
self.thread_read = None;
0 [& p* V# d! {! h% s# e+ v9 c( ]1 |
self.thread_read = threading.Thread(target=self.FirstReader);
) _4 A1 h* J( o
self.thread_read.setDaemon(1);
' ?4 M5 y$ Y: r0 w
self.thread_read.start();
) B' q- L. U4 G6 z; K+ b
0 z4 k2 |" `1 u1 J
self.thread_write = None;
: g. l% n0 w/ S+ _- |) i6 c+ \! S
self.thread_write = threading.Thread(target=self.FirstWriter);
5 z4 B p1 c+ X1 N
self.thread_write.setDaemon(1);
9 s8 I2 m& N- e; W8 U( n
self.thread_write.start();
/ s: Q0 y! m6 ~( \0 R, @4 l
/ E# S0 P5 B& R/ i. Z. _1 L
#TCP部分
0 Z7 N$ g* H7 [; ~8 U. U0 e h' c
self.thread_TcpClient = None;
5 Y3 u J' `3 ]) d
self.thread_TcpClient = threading.Thread(target=self.TcpClient);
5 H2 a6 W6 Y' q5 i- D9 ^
self.thread_TcpClient.setDaemon(1);
4 @3 g" q v. j D' M9 e
self.thread_TcpClient.start();
2 t2 K5 R2 b5 t
2 y$ `& h' M4 X' W) L9 @# p
self.thread_TcpSend = None;
. J" q7 y1 n/ J/ s
self.thread_TcpSend = threading.Thread(target=self.TcpSend);
3 u8 h7 @ n) B% q& L' e
self.thread_TcpSend.setDaemon(1);
) T7 \; ^$ S7 {/ y6 r
self.thread_TcpSend.start();
3 I9 ?, M: O/ B' O
, q# @ Y% L/ A
return True;
% X! _* X4 e0 ` z
else:
1 P8 F w5 r. T* K$ x
return False;
- Z6 U6 ~" d5 [0 G
. @. h3 h M2 M, K
8 P$ x @8 F3 j( a
def FirstReader(self):
* {$ b1 C0 b4 m" Q) _- X" J! S" k
while self.alive:
% c9 m9 _0 T3 \9 v+ [' \
# 接收间隔
) d3 J0 R5 d" U- ?9 r, w
time.sleep(0.1);
- G8 y: Q: i" `/ H! I/ n$ ?
try:
" j1 }( B. y2 Z5 ?8 E
data = '';
/ W1 f* f3 N W( G# t, X
n = self.l_serial.inWaiting();
: c) T4 v" o6 S9 A4 q. Y
if n:
! W* [" s3 Y# N( k; F1 @/ J9 P, T
data = data+self.l_serial.read(n);
3 ~) ]. k, m- k& H& Q5 r
#for l in xrange(len(data)):
9 X; w2 n, `- M0 Y" ^+ D* Z- G
#print '%02X' % ord(data[l]),
8 ^1 d! W4 Q) X/ U8 F
# 发送数据
4 |& D7 D% u- P. a h
print u'->请求:'
: h7 c8 r& _4 R7 z3 P
print data;
6 ]1 L% W7 W: n3 @- C
mylock.acquire()
4 `" r7 ~; X) k
self.snddata = data
& ^( P! w1 @6 n
mylock.release()
2 s4 i B O3 D0 U. R
#print_hex(data);
& {3 A) o9 u! u0 H
1 S1 ]9 _- b+ c/ h
- s4 J# ~7 c' {! R2 q3 `: a7 _2 a
# 判断结束
% ]* Y r( V& L. ` ?+ e, t
9 F4 y# E4 M; F. {6 e: A
except Exception, ex:
% H1 _% V, _, F* }- m4 J! }$ @+ m
print str(ex);
8 V5 K! l- {8 S, F, l) C
* P8 f7 W t( ? f- |% y
self.waitEnd.set();
) @+ D: f( G% X9 B g3 p
self.alive = False;
- W, P1 d \0 }$ x- {( `
/ g, T9 O$ Q( f3 B# ^
def FirstWriter(self):
1 y- ?5 c2 E' a6 K- K9 w2 h
while self.alive:
! { n( b; i, |$ B0 w" I l
# 接收间隔
9 r& l2 L' b' Q- M
time.sleep(0.1);
. H9 N9 `8 A2 z! Y& F5 K# t* Y
try:
; V- T7 a% l5 l
#snddata = raw_input('\nenter data send:\n')
2 A) ~/ `' O% G/ X
if self.rcvdata!='':
3 F- o, h7 g6 r0 x5 y9 T
self.l_serial.write(self.rcvdata);
* j; _( ]; M. ~3 _+ I* v. M' I% U
print u'-<应答:'
& B- k+ @2 K' |
print self.rcvdata;
; A7 _; h% a0 D% Z; d. p) Z
mylock.acquire()
6 l1 R9 ^8 U% e4 H% O- M
self.rcvdata = '';
) r" a9 E' \8 z: p( F
mylock.release()
- f4 u- P7 P$ a: j
#print_hex(snddata);
2 C9 l$ y3 |& {, X
: U# ^, G$ Z, R9 `7 ]% F- M* c+ u7 G
except Exception, ex:
' @! ?% o5 I! q0 T" V& m% x, [* C
print str(ex);
( i% Y8 |9 A; X1 @
self.waitEnd.set();
- \) ` x: Z" K f7 b& k
self.alive = False;
. I- [- M Z- b% X5 W' U
! w7 _1 Z$ f4 n& ?5 k* _. c
def TcpClient(self):
% q+ O# s# ` b) H3 Q1 ^
while True:
4 V7 B0 p0 G* U6 W/ b
# 接收间隔
I2 j/ c- n# N5 x) g9 s' K" N
time.sleep(0.1);
, v' j9 {$ s: d9 R2 M& _
self.connection = socket(AF_INET, SOCK_STREAM);
; j& k1 S! d: [; _) ~ a9 C/ C9 @% C
self.connection.connect((Server_IP, int(Server_Port)));
5 u; R) U% h; B% j# ?6 w' i! ]
print 'Connect to Server OK!';
# V( M+ I/ ?8 P3 Z
self.snddata = ''
. S+ [5 x& J6 \3 b7 T/ n" S( I
self.rcvdata = ''
# M$ w |7 }! m8 q( p2 u8 ?1 `9 Q( S# H& X
while True:
1 V8 Y9 B2 `: K1 w/ `
#读取客户端套接字的下一行
# L4 m1 p+ M' `8 q" @- k
data = self.connection.recv(1024)
: v8 H- C& b z! ]4 W0 c7 H0 N
#如果没有数量的话,那么跳出循环
- u6 [% m3 y* K% r. f: p; l
if not data: break
( H& f& A8 n M+ z
#发送一个回复至客户端
9 l- T* M: R9 E. F" v
mylock.acquire()
6 P1 W0 d6 g6 f! t6 t. f$ d8 i) e: }
self.snddata = ''
) }/ l( G9 A* ]' n
self.rcvdata = data
' F* D r2 B1 {' K4 P
mylock.release()
9 e1 F8 b$ z* d8 e2 I4 K$ g, X
#connection.send('Echo=>' + data)
' ]7 \9 w, X8 \ c' X% F
self.connection.close()
$ ~. R6 t6 x/ K% B U: K, \2 d
% M6 M' l( ^& L9 L! P! ^
self.waitEnd.set();
) ?! C( D" P; f+ T \
self.alive = False;
9 a: Q5 X6 D" z
$ E! @( b0 h$ c8 j7 e. t
def TcpSend(self):
/ h+ Q; P* D: p4 m/ C/ l
while True:
' x' ^8 c% [0 w/ A) h. g8 ~2 S
# 接收间隔
3 Q* O# J. `, n4 D
time.sleep(0.1);
: M. @; a, i5 b3 x5 o7 H6 Y
while True:
L8 b) l/ {2 M/ J
time.sleep(0.1);
& g( E/ G6 J' ~" x4 ?3 p
try:
5 B% [) N8 w+ _6 w9 R& s- Y5 \
if not self.connection is None:
& R1 i& V5 L' W
if self.snddata != '':
- C0 J! S: t" {! A
self.connection.send(self.snddata)
" p" U1 R+ v, R$ U: E# ^ m8 [) D
mylock.acquire()
3 e+ }5 R$ o7 c' E, c
self.rcvdata = ''
# s7 G8 _" F2 s+ Q8 W2 _/ L
self.snddata = ''
$ j- V6 C9 o! X% W/ `
mylock.release()
- s% U5 C4 g, S* U9 M& G- @
except Exception, ex:
: J s( \. n6 k$ U) {
pass
4 b5 H5 J2 r+ d# o2 ?0 g
def stop(self):
& r q7 s/ r6 i) x' v# l9 ]
self.alive = False;
) Y! f) o: _8 p8 |. y4 g: o' W# \
self.thread_read.join();
% p; v, G: V; P" ^
if self.l_serial.isOpen():
3 c) u1 Q1 m$ r
self.l_serial.close();
& Z7 w% h# J, F) ?; m
' X3 Z; B0 j. u. x! m# ^7 E- ^
+ L2 n. h) i. O" i1 q6 x, T4 i
5 ~) q. l5 \6 C$ Y) O
#测试用部分
; T, f! b: ~0 a$ i$ H3 J
if __name__ == '__main__':
+ l, t5 M2 l9 P, ?# E
print 'Serial to Tcp Tool 1.00\n'
+ r: N5 o" {0 ^5 s% F8 u$ ^
print 'Author:yangyongzhen\n'
0 n( W" h+ {& H8 `0 S9 c
print 'QQ:534117529\n'
$ H& p. E. u* b* G; U5 U& Y
print 'Copyright (c) **cap 2015-2016.\n'
" }6 L% E' D8 w* j+ [$ {* g% v0 Z
, p! W. c/ u' R9 q! [( u
Server_IP = raw_input('please enter ServerIP:')
9 U' q, O/ v! f
print 'Server_IP: %s' %(Server_IP)
2 l3 A) Z: X& X* g
Server_Port = raw_input('please enter ServerPort:')
$ u6 X9 c2 I- T$ f3 E6 f) i- F
print 'Server_Port: %s' %(Server_Port)
6 h( u# {; Q+ W, k# C
com =raw_input('please enter com port(1-9):')
0 b4 _" n4 n+ k! X& P4 z
rt = ComThread(int(com)-1);
& g; ]' Q' O4 U' N) _$ X
try:
, O7 W. I6 e5 R5 \5 Q5 R
if rt.start():
) q3 z8 c( ^+ s- q
rt.waiting();
4 e0 M6 {. A- h& ]
rt.stop();
" T: q" T# I+ ^, u
else:
/ W8 q8 o4 U) Z+ S* e* M2 O
pass;
, }3 j4 z$ [- w m7 i+ c6 A
except Exception,se:
$ ?6 L" o' P: E3 A( V
print str(se);
1 U# a) L* e, l/ X
! W7 `' Z# Q4 i: @: N# S" K0 E7 ?
if rt.alive:
9 |6 e' {. @# ]& e7 t9 `9 _0 e- N: _
rt.stop();
. C# N" ?* g# ?$ D
os.system("pause")
( m& n, S- @, v) R1 w
( J7 |8 K# f0 B5 X1 [
print '';
; \4 z3 Y8 [1 n' e- `( g
print 'End OK .';
; Z+ }' u( S9 O
del rt;
复制代码
1 }! {: N: o7 Z; S) C$ |
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5