数学建模社区-数学中国

标题: 串口转tcp工具 [打印本页]

作者: 2744557306    时间: 2024-3-31 17:19
标题: 串口转tcp工具
  1. #coding=utf-8
    0 W" I, S' s+ d/ e5 K

  2. 6 D* s! |1 [7 Z# Z6 q9 m/ P
  3. / I" i0 _2 R* n+ _& T. X" C
  4. import sys,threading,time;
    / m8 @) e: c) i6 i9 y
  5. import serial;1 q" o" e& V7 P) g! B7 G  L9 d, T0 C
  6. import binascii,encodings;
    , p3 _7 V( g4 `/ V9 z/ N8 U# O
  7. import re;. K  x' z4 x% t' x1 i
  8. import os;
    , |% J6 J3 O- H$ e" G
  9. from socket import *& B- \2 t4 Y; M- h  a4 y' |
  10. from struct import *;
    - o4 k6 T8 _* E7 w: c7 h! @# a/ n
  11. #from myutil import *;7 D: ]8 D! d$ P$ H6 Y
  12. #name: myutil.py* g  m* N8 K# @8 O# T
  13. 9 d( y6 H' y: m
  14. mylock = threading.RLock() " G& N$ ?# r6 K$ q6 h1 s

  15. * Y3 ~/ C2 ~* j, w$ B' y. U
  16. Server_IP = ''
    - `" A  d4 L2 |4 h- u1 `9 ^
  17. Srever_Port = ''6 {1 L. d. M3 L5 I+ }" ^  h

  18. ) V9 w; W+ Y4 d# I( {+ }
  19. def print_hex1(s,prev='0x'):; d  i4 s$ b, c* l' h2 G
  20.     for c in s:' a: t7 l( N4 T/ A. R
  21.         print '%s%02x' %(prev,ord(c)),
    5 A9 f0 F0 G" R& ?6 O  H7 w
  22.     print
    . N" W+ c3 v/ \1 |
  23. def print_hex(s):
    . M" v& h# G$ ]5 M
  24.     for c in s:) U! s, D6 }( g+ s
  25.       print '%02x' %(ord(c)),
    3 F6 Y* p  b+ T
  26.     print2 c9 K. j6 ]# ~9 p" n" U

  27. 2 t, ?7 k& B  o
  28. def hexto_str(s):
    ( N0 K4 u. R! L! h$ j
  29.   r ='') I$ ?1 J( Q) s
  30.   for c in s:
    ( y7 X$ v  q0 j* e1 A+ c
  31.     r += '%02x' %(ord(c))5 e7 ^  O: y6 q
  32.   return r
    . y* G% Y. L  u' n5 R
  33. def strto_hex(s):$ e2 V# \$ m6 Z# S) b
  34.   r = s.decode('hex')
    / W4 j  z% N3 Y( N2 E% C  ?# k
  35.   return r4 d+ q' n* z' x; b( F: }
  36. #''代表服务器为localhost
    6 x" v/ X/ A+ n. [* D3 A
  37. 5 ^" S: j  h* N+ Q0 {
  38. #在一个非保留端口号上进行监听; x' x" N2 d% M" q/ d
  39. / C# E' u  S7 c; ?: Z2 ?3 p
  40. * Z' r8 t0 G' P6 R5 n
  41. class ComThread:
    1 a5 ^+ Y2 ]: J& e
  42.     def __init__(self, Port=0):# |0 Q: G8 P! {1 c; g2 v9 ~3 k* j4 O
  43.         self.l_serial = None;
    $ M' `8 ?3 a2 x: B0 J0 ?
  44.         self.alive = False;+ ~1 x1 U8 v4 x* `. j3 ^! D" S, [
  45.         self.waitEnd = None;6 @  g* i! c; Q& Y6 h3 F/ e& E- h
  46.         self.port = Port;
    8 P1 ~* `) M3 D. O

  47. 5 i: h4 ]# I% j8 k: U& n) c
  48.         #TCP部分
    6 A; ~% |; H0 {
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    5 c+ f5 \) i. `+ k) r$ W' z
  50.         self.connection = None
    2 m7 a% @: {5 W) l; M# P; E" T
  51.         #数据
    - a2 u- z9 r0 q
  52.         self.snddata = ''9 F  F# F" ]9 i: T4 H% J
  53.         self.rcvdata = ''
    4 k/ P- X6 k: Z

  54. 6 r$ H: N& A9 ~( ?# D0 Q6 ~% s& g. @9 l
  55.     def waiting(self):
    ; w# d0 ^- A. i! j5 }2 U6 I" R
  56.         if not self.waitEnd is None:+ m# [8 H% X7 F: w% T* B) R
  57.             self.waitEnd.wait();' B+ i  {; I+ B4 ~1 T: R4 E
  58. ) \6 e4 v) Y; R; |3 o
  59. 7 a% y& Y% y, |, L. a
  60.     def SetStopEvent(self):
    / j$ u! y* i1 U/ p) d2 c
  61.         if not self.waitEnd is None:9 @+ N% A# s: [# F
  62.             self.waitEnd.set();
    ; Z  y  J  a2 K2 B0 y- ^# H
  63.         self.alive = False;
    * U! X  R7 i- c* M6 S3 N, e
  64.         self.stop();! g; R3 V0 Q; v5 A

  65. - a4 \" T& T5 N) Z/ P' A5 _- y

  66. + t: B& |( [# p& g0 H2 T
  67.     def start(self):  j0 O3 r, |( Z- e; Q" r$ T1 ?3 `& q
  68.         self.l_serial = serial.Serial();
    0 z- d$ F( W- z* }9 j
  69.         self.l_serial.port = self.port;8 n( ~* x; ?6 X8 B
  70.         self.l_serial.baudrate = 115200;
    * c4 s7 H! \4 k% d- @
  71.         self.l_serial.timeout = 2;  #秒
    ! p  P! e* y( h, w8 t* X; [/ g, y
  72.         self.l_serial.open();
    & i2 e" q2 ^& T: O+ W& V

  73. 0 H; i: h2 K/ G6 c# |* I. i" n
  74.         if self.l_serial.isOpen():
    . l5 o4 u/ v5 }. H9 H) v
  75.             self.waitEnd = threading.Event();
    6 y0 r* m8 i) \- J% X2 d
  76.             self.alive = True;
    * U- g7 \6 \; l. F" |" |# Z. M
  77.             print 'open serial port %d ok!\n' %(self.port+1)$ R3 O  h/ R. s$ |$ M- o
  78.             print 'baudrate:115200 \n'
    1 E* P, e- B8 ]" g! J( s9 ~. c8 f; c
  79.             self.thread_read = None;
    ! a$ J0 o/ g6 S- h" @$ F
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    % Q1 D9 e6 L& }  i
  81.             self.thread_read.setDaemon(1);
    " Q6 o" P# J1 D9 P0 N/ R0 [
  82.             self.thread_read.start();" h$ o, u+ r" f: A" ]
  83. 8 V* o* A2 d- `: ?& l
  84.             self.thread_write = None;. c, }  P6 `/ j3 u; l- d
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);% T/ i* A4 i2 I/ U4 @
  86.             self.thread_write.setDaemon(1);5 o- u0 U; r& C# j; ?
  87.             self.thread_write.start();
    1 y$ _6 k: k. p

  88. # E/ l+ m! W; F4 O
  89.             #TCP部分( h/ y( l1 _/ a. p6 v' n1 g
  90.             self.thread_TcpClient = None;
    + U0 b' C. \7 P' r8 G' b+ u
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);
    ' w8 s( H5 Y7 P9 e# i
  92.             self.thread_TcpClient.setDaemon(1);; c+ G  d2 V0 Q* l% ^
  93.             self.thread_TcpClient.start();
    7 V+ C8 }. B' e% K+ T
  94. 3 B1 z- q9 Z; x. J) A' q5 t
  95.             self.thread_TcpSend = None;
    3 R- W; E. R# [+ |  x, O8 N
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);
    $ y% Y- M% N9 A9 a4 t/ ?. X' e/ H9 ]
  97.             self.thread_TcpSend.setDaemon(1);
    9 E8 x  ^% w1 Y% I: t) \. F* k6 a( H
  98.             self.thread_TcpSend.start();$ Y3 m% b# d6 h5 |' Q; k( V" Z
  99. + c7 W5 x- V2 O( b, a
  100.             return True;$ r) a3 H, I2 p% P( T
  101.         else:
    3 A& O- }( ~% @, W1 |
  102.             return False;, \+ m. N, q  M' b  g

  103. ! X' j( }, M  x, p, O7 z( X

  104. $ F- x) s" B3 B3 \$ I( E$ b) A
  105.     def FirstReader(self):
    , C* E4 o; y3 [1 E& ?7 X# E
  106.         while self.alive:
    6 ^1 |- t+ w" a' y! U
  107.             # 接收间隔
    - q  p# x0 C7 b; ~. n) B
  108.             time.sleep(0.1);
    ' N0 V9 O& X0 R' u7 Y
  109.             try:
    5 S; ~9 \' B$ Q8 D7 K; }
  110.                 data = '';
    0 z% i* k. |  s! i0 H. f! B
  111.                 n = self.l_serial.inWaiting();
    4 F7 p: h  C. A: |2 G9 x
  112.                 if n:
    / |- _& ~. O  e; s) Q; Z
  113.                     data = data+self.l_serial.read(n);/ K4 N4 V1 Z9 v' e# H% o, D
  114.                     #for l in xrange(len(data)):
    ( a5 i8 h! |0 T1 e
  115.                         #print '%02X' % ord(data[l]),7 @4 X/ W+ X3 e! L
  116.                     # 发送数据+ K) w$ T- O( D/ L5 x- J
  117.                     print u'->请求:'
    , P! v# d- _1 F
  118.                     print data;  h6 b* h1 ^- L7 W6 `- y
  119.                     mylock.acquire()
    / ?, J" ~7 A: u- ?7 q
  120.                     self.snddata = data
    $ T9 D5 {  M& ?: F4 w- j: F2 k
  121.                     mylock.release()
    7 f, M% i* Q6 h& I  K& L) O
  122.                     #print_hex(data);5 U( o2 X" \+ o5 ?
  123.                
    - \& {9 y# t# g0 `
  124.                     
    1 e2 v* C2 H# D6 }- n
  125.                 # 判断结束; b1 @+ w% s# J2 F- C
  126.                
    3 ~- G5 n5 v+ p# P9 [0 n( b& W
  127.             except Exception, ex:
    . O) _- |* }: T/ X$ U( E8 ^+ ^
  128.                 print str(ex);
    # l/ x  O; K, i# @5 P8 M
  129. % T9 B8 m2 P* `1 s7 s
  130.         self.waitEnd.set();
    * y# X/ f* a% M  a$ u
  131.         self.alive = False;
      Z8 z- f, z1 `, @& ^$ F

  132. + n6 G6 Y1 m8 X7 ~2 _+ U
  133.     def FirstWriter(self):
    $ \2 {/ z& W& V4 c/ _! Y
  134.         while self.alive:2 f9 K+ `4 ]8 z  R3 e7 ]% W
  135.             # 接收间隔, S4 C1 M) d5 R6 W
  136.             time.sleep(0.1);
    7 e; E* ^: h- k  T. z; G# N+ N
  137.             try:
    : U6 t! B; f9 v8 R! |$ h
  138.                 #snddata = raw_input('\nenter data send:\n'); ^# q9 d9 f- e7 T2 I) P
  139.                 if self.rcvdata!='':
    ! f0 [% @! e! ]: m4 ]# T
  140.                     self.l_serial.write(self.rcvdata);
    $ @8 W2 r$ p  d% s0 {
  141.                     print u'-<应答:'
    8 o& m/ [' X/ k% c
  142.                     print self.rcvdata;% D: |7 \' A- Z1 G0 \# |1 Z
  143.                     mylock.acquire()
    , V6 N; f/ _, @
  144.                     self.rcvdata = '';
    ; C4 ~: l9 @1 q- m7 N2 f; g( x7 ~
  145.                     mylock.release()
    0 I4 c8 z3 {0 p- z! {
  146.                 #print_hex(snddata);/ M- @3 t2 r7 v% W2 ~
  147.                 % I5 F; C; T% h" e( ^6 I' O9 o& A. x
  148.             except Exception, ex:
      w4 }, E6 \9 O7 ]  v
  149.                 print str(ex);8 I0 A' o( f: a' }
  150.         self.waitEnd.set();
    4 I+ j* M* N& J" \" S3 l
  151.         self.alive = False;
    * a" q% ^) L( O: R3 @. ~# ?4 Y

  152. 6 D$ S# m! N2 T0 N
  153.     def TcpClient(self):+ s9 N% O+ n: ^8 {
  154.         while True:
    . a; V3 B! v" T& q( i
  155.             # 接收间隔5 W$ J& M! o# }1 G- u
  156.             time.sleep(0.1);
    2 B6 ?' @1 Z! S1 G1 l; c
  157.             self.connection = socket(AF_INET, SOCK_STREAM);7 }& x% U8 F' G; I( H6 R
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    & k# ?% G3 b! B, \( [
  159.             print 'Connect to Server OK!';% K9 v5 {: y; d* z
  160.             self.snddata = ''
    $ z  n* m6 b0 q
  161.             self.rcvdata = ''
    * h( l3 J6 ?3 J+ d
  162.             while True:2 V# L% W' q- u2 u4 |. {% J
  163.             #读取客户端套接字的下一行
    2 P8 x( r. D/ U3 I5 Q7 c
  164.             data = self.connection.recv(1024)
    , t7 C9 m$ \5 R, o% S  g/ ]
  165.             #如果没有数量的话,那么跳出循环7 i4 B- V0 s' Z" z
  166.             if not data: break4 t$ ~* f; b+ w5 q& `" Z8 P7 U6 k8 H! W
  167.             #发送一个回复至客户端8 a' L6 U# {0 q# l% R
  168.             mylock.acquire()
    4 [' S5 d6 E# H
  169.             self.snddata = '': y) @9 W5 r$ X0 J) j- p( R
  170.             self.rcvdata = data
    6 ~; n1 S/ A$ z; `4 Q* }3 L3 ]; \
  171.             mylock.release()
    " q% Y  r# }- a  ~5 u7 y$ m
  172.             #connection.send('Echo=>' + data)
    . W  h0 j+ s, L+ _. b# H! \" }
  173.             self.connection.close()
    : I& M* H  u' k8 C; A% G
  174. 9 y2 q4 ^- K9 @7 C% L
  175.         self.waitEnd.set();
    4 R4 K$ U& a0 q( n
  176.         self.alive = False;
    9 I! K* ]* {) b9 k  t

  177. 7 R! A5 l+ @; o
  178.     def TcpSend(self):
    2 k* D0 L! W1 c; w6 i
  179.         while True:
    9 N" F: ~: [/ k7 z' I- A: d* N
  180.             # 接收间隔% \( T: @# e8 c0 K
  181.             time.sleep(0.1);
    0 d; O) i5 Y, l; \  ~7 g( U
  182.             while True:, ^* R% B# S# C7 M  [
  183.               time.sleep(0.1);
    % c, G3 G% D" F- _  B4 s
  184.               try:, w* x0 ~: w0 t2 O: k
  185.                 if not self.connection is None:' V+ ~7 N5 M# o7 a9 L
  186.                   if self.snddata != '':% V: i, y" u2 V6 S; T9 J( O- K
  187.                     self.connection.send(self.snddata)
    , |8 @9 v) l2 [( o* l9 u$ `
  188.                     mylock.acquire() 2 R( a5 }" c5 e9 D& A5 j$ i2 s
  189.                     self.rcvdata = ''5 T  ]* g! Z7 J4 e
  190.                     self.snddata = ''
    0 e5 I! K7 }3 z  T
  191.                     mylock.release()4 b5 W6 h6 x; s
  192.               except Exception, ex:
    ; ?* f4 A% r: D
  193.             pass        
    & O1 \2 m% C) l( x9 K$ Z
  194.     def stop(self):8 B) G- O' [. Y' A: M7 i
  195.         self.alive = False;
    ( ], I, m$ q" T* {, C' z
  196.         self.thread_read.join();+ E6 W* A  Q2 P) N. E# f8 ?! E! w
  197.         if self.l_serial.isOpen():
    6 T4 B. }$ G1 j- x
  198.             self.l_serial.close();
    ( V9 Y& g+ p" B0 R& S

  199. 0 i* B1 k- Z8 ?1 }
  200. ; k4 N/ {% U: d/ Q  ]2 P3 K5 e8 c

  201. / i! X. l. u) S( v, [2 q( T
  202. #测试用部分
    & n% q/ _( X' o: B1 I9 g. i
  203. if __name__ == '__main__':5 y9 K" y1 D9 x" G8 g- w1 \
  204.     print 'Serial to Tcp Tool 1.00\n' & P% f3 Q. I+ ?( ^3 t
  205.     print 'Author:yangyongzhen\n'
    ( d8 B1 K- Q- E4 _8 w! w# `4 W# G4 u
  206.     print 'QQ:534117529\n'
      _6 k  Z) }- B3 J' J# f
  207.     print 'Copyright (c) **cap 2015-2016.\n'; x7 b, |$ X! H: m; m+ v) ^9 ?2 B' m2 w
  208. " R5 ?1 W# [  \6 w/ ^
  209.     Server_IP = raw_input('please enter ServerIP:')% x* t" ^! T: d& P- H3 g$ M% t
  210.     print 'Server_IP: %s' %(Server_IP)
    * _/ v! C- u  V- R: Y2 M; b& T2 A
  211.     Server_Port = raw_input('please enter ServerPort:')3 f/ f. m4 X. A4 C3 F
  212.     print 'Server_Port: %s' %(Server_Port); E9 L; {* h" N' p$ X% Z
  213.     com =raw_input('please enter com port(1-9):')
    $ i# a0 u3 m  Z1 ~( Q# k+ j% b2 q
  214.     rt = ComThread(int(com)-1);$ l3 q5 @$ l% u
  215.     try:
    5 ~1 \2 Z% J6 W3 h5 O2 t
  216.         if rt.start():
    - n" ^7 n+ W' Z$ L
  217.             rt.waiting();% h! \7 Q5 L' n5 m7 @; g; f& F8 m
  218.             rt.stop();
    # ?. t" E+ b& @7 s! H4 u
  219.         else:
    * K  h, ^3 y+ f' Z
  220.             pass;            3 d6 s! m2 S7 C0 O  u+ z
  221.     except Exception,se:; Y% J8 @$ n+ r7 P, b0 A; x
  222.         print str(se);2 Y7 V- R4 @+ T% U" X% h. Y

  223. ) e9 f& D2 l- S( h
  224.     if rt.alive:! b2 Z" Z+ V" F
  225.         rt.stop();
    3 ?( C. d9 L2 N- l$ |
  226.     os.system("pause")$ m, G. u0 s* w. b. {. r* S9 I

  227. 2 F7 A1 \/ v+ h4 }5 ~0 j' e8 D
  228.     print '';. g: c8 c1 g" s
  229.     print 'End OK .';; m$ m2 Y. U* t6 f1 W- q. F% s: }
  230.     del rt;
复制代码
1 ~  y; l9 O$ ?1 N





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5