数学建模社区-数学中国

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

作者: 2744557306    时间: 2024-3-31 17:19
标题: 串口转tcp工具
  1. #coding=utf-8
    ' Q6 b. S7 x8 o$ e" A4 r5 f

  2. 7 Y+ B. M# ^1 b5 [- j- c

  3. . _9 N9 ]& a/ b. A3 x
  4. import sys,threading,time;: w" S8 O, R- D  N2 ~+ A
  5. import serial;
    * r, R. M: I% l8 O  i; X
  6. import binascii,encodings;
    1 s5 i- U; u3 I: }  t! i; g
  7. import re;
    * F! j9 C( m" a9 g& B! }
  8. import os;
    2 c& F5 E$ K1 L* R/ _
  9. from socket import *
    $ V. z+ r* x% @" q
  10. from struct import *;
    & I: E* z4 Q: F* }
  11. #from myutil import *;0 U- f: X, d. `# y1 j5 ]3 G
  12. #name: myutil.py
    1 x1 s/ p# z4 J. v

  13. 2 f2 R& I6 }* |" w  q7 d
  14. mylock = threading.RLock()
    9 d% Q5 h! Y! W" [3 l
  15. 8 j$ H+ {! U# [" c1 L8 p7 V' d2 @
  16. Server_IP = ''3 T+ n; }4 e; s% H* {
  17. Srever_Port = ''' H  ~2 F& j% k3 H
  18. 6 D; {5 D( s- p/ f3 {7 |
  19. def print_hex1(s,prev='0x'):
    ! E9 J9 F0 o5 N  n, w" @
  20.     for c in s:6 r% \) U9 }. `; P8 `2 U& @
  21.         print '%s%02x' %(prev,ord(c)),
    * V- m) o1 W2 U& A# R' J
  22.     print
    6 }  m* E7 e/ l; z8 n
  23. def print_hex(s):
    + l  m/ y1 y# i8 m
  24.     for c in s:% t  m! }2 L; `6 s/ u6 j
  25.       print '%02x' %(ord(c)),% _' `# }" n) a" `$ E
  26.     print. M  k. W/ N( N, t) z3 v6 a' l7 ~! _
  27. ! n9 d  f" }# z7 c: ^$ q
  28. def hexto_str(s):0 V* @. ^! x3 [6 o
  29.   r =''
    / M2 n# z% g3 K: }( U8 J: I
  30.   for c in s:! I3 M' N) i, h% n! z0 X
  31.     r += '%02x' %(ord(c))
    # z6 I4 Y; E! t) V
  32.   return r+ z# F( \/ f* b
  33. def strto_hex(s):2 M8 U0 z7 q0 o/ A9 c, {' i
  34.   r = s.decode('hex')5 B! N$ U& b0 }9 ?, z8 ]$ b$ \" ~
  35.   return r
    ) V* x* L6 j% t; n( O
  36. #''代表服务器为localhost
    ' a* s8 e) W* W, r' n8 F

  37. : g) o; o# b2 y7 g
  38. #在一个非保留端口号上进行监听1 ^, F) C/ }5 X
  39. 3 B* E. w% a! ?9 P8 f6 d+ R

  40. 8 ~9 F3 B6 r/ H
  41. class ComThread:
    4 w6 Q# w# l& _. v# r
  42.     def __init__(self, Port=0):/ j) O) P9 _% u1 W7 D$ Q
  43.         self.l_serial = None;
    ' X/ X* g3 U* G  U6 B
  44.         self.alive = False;
    . u3 N  ^0 Z' F$ C. }4 X
  45.         self.waitEnd = None;
    9 ]9 \$ F$ D, S. T& N' B, K
  46.         self.port = Port;
    ; ?4 q, B, Q6 ~& f+ Z1 O

  47. ! R+ _  e' a  S) q; l
  48.         #TCP部分
    , V+ M5 u  M; }
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)1 ?% W% C, S6 p. r
  50.         self.connection = None
    3 P! }+ c# @! `. s: ]5 I- I) p0 ~
  51.         #数据7 X: G9 I3 C$ U' X0 h: A3 _
  52.         self.snddata = ''
      Z4 F- V% V( y* [6 H
  53.         self.rcvdata = ''
    * L+ e( K/ ^9 Y) ^' q2 r0 _
  54. , W6 z* G, d, _: T& t
  55.     def waiting(self):5 z. g. n8 W) Y5 C% S5 o
  56.         if not self.waitEnd is None:6 I. s+ V3 n: l% J* K
  57.             self.waitEnd.wait();$ ^3 `. `* ]0 l" V

  58. 1 _+ A/ W. o" s# J: `; }

  59. # N, [1 D  B7 ~# J% ~7 H$ k, h% C
  60.     def SetStopEvent(self):& O( x% H( H- G5 J5 \
  61.         if not self.waitEnd is None:% d- a; ?- v+ `; Y7 c% T
  62.             self.waitEnd.set();
    ! q. n* z' e" r* F* L7 B# C# @
  63.         self.alive = False;
    - z: K: X% _4 S  s" E+ U
  64.         self.stop();
    ( c8 Q; G4 N- \. r

  65. , S( D  J+ m4 k' z
  66. ; z2 X, R9 ^- V- L
  67.     def start(self):3 X4 Q" W7 g/ O) `4 k7 E
  68.         self.l_serial = serial.Serial();
    ' ^0 `/ p7 F6 C/ q) h5 j" g
  69.         self.l_serial.port = self.port;9 r* P/ T* o5 s4 e
  70.         self.l_serial.baudrate = 115200;7 Q' h! |- o0 w& ?/ g/ j6 J; h& r  Y
  71.         self.l_serial.timeout = 2;  #秒0 S; h% _; ~+ M+ _9 I( D
  72.         self.l_serial.open();
    ) c' w7 V* U$ |: [
  73. * G9 Y9 @' i, |
  74.         if self.l_serial.isOpen():
    ) G! D  D2 f. i9 p' y
  75.             self.waitEnd = threading.Event();
      }; c( y% W  r0 {8 N0 M" ]; d
  76.             self.alive = True;. X4 a3 v* ]( y: @  ^
  77.             print 'open serial port %d ok!\n' %(self.port+1)
    3 ]/ q4 j2 t' T% t, Y4 D5 m4 B, Z1 b
  78.             print 'baudrate:115200 \n'1 Y  _. q3 ^' O# e
  79.             self.thread_read = None;0 [& p* V# d! {! h% s# e+ v9 c( ]1 |
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    ) _4 A1 h* J( o
  81.             self.thread_read.setDaemon(1);' ?4 M5 y$ Y: r0 w
  82.             self.thread_read.start();
    ) B' q- L. U4 G6 z; K+ b
  83. 0 z4 k2 |" `1 u1 J
  84.             self.thread_write = None;
    : g. l% n0 w/ S+ _- |) i6 c+ \! S
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    5 z4 B  p1 c+ X1 N
  86.             self.thread_write.setDaemon(1);
    9 s8 I2 m& N- e; W8 U( n
  87.             self.thread_write.start();/ s: Q0 y! m6 ~( \0 R, @4 l

  88. / E# S0 P5 B& R/ i. Z. _1 L
  89.             #TCP部分0 Z7 N$ g* H7 [; ~8 U. U0 e  h' c
  90.             self.thread_TcpClient = None;5 Y3 u  J' `3 ]) d
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);
    5 H2 a6 W6 Y' q5 i- D9 ^
  92.             self.thread_TcpClient.setDaemon(1);4 @3 g" q  v. j  D' M9 e
  93.             self.thread_TcpClient.start();2 t2 K5 R2 b5 t
  94. 2 y$ `& h' M4 X' W) L9 @# p
  95.             self.thread_TcpSend = None;
    . J" q7 y1 n/ J/ s
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);3 u8 h7 @  n) B% q& L' e
  97.             self.thread_TcpSend.setDaemon(1);) T7 \; ^$ S7 {/ y6 r
  98.             self.thread_TcpSend.start();3 I9 ?, M: O/ B' O
  99. , q# @  Y% L/ A
  100.             return True;% X! _* X4 e0 `  z
  101.         else:
    1 P8 F  w5 r. T* K$ x
  102.             return False;- Z6 U6 ~" d5 [0 G
  103. . @. h3 h  M2 M, K

  104. 8 P$ x  @8 F3 j( a
  105.     def FirstReader(self):
    * {$ b1 C0 b4 m" Q) _- X" J! S" k
  106.         while self.alive:% c9 m9 _0 T3 \9 v+ [' \
  107.             # 接收间隔) d3 J0 R5 d" U- ?9 r, w
  108.             time.sleep(0.1);
    - G8 y: Q: i" `/ H! I/ n$ ?
  109.             try:" j1 }( B. y2 Z5 ?8 E
  110.                 data = '';
    / W1 f* f3 N  W( G# t, X
  111.                 n = self.l_serial.inWaiting();: c) T4 v" o6 S9 A4 q. Y
  112.                 if n:! W* [" s3 Y# N( k; F1 @/ J9 P, T
  113.                     data = data+self.l_serial.read(n);3 ~) ]. k, m- k& H& Q5 r
  114.                     #for l in xrange(len(data)):9 X; w2 n, `- M0 Y" ^+ D* Z- G
  115.                         #print '%02X' % ord(data[l]),
    8 ^1 d! W4 Q) X/ U8 F
  116.                     # 发送数据
    4 |& D7 D% u- P. a  h
  117.                     print u'->请求:'
    : h7 c8 r& _4 R7 z3 P
  118.                     print data;
    6 ]1 L% W7 W: n3 @- C
  119.                     mylock.acquire() 4 `" r7 ~; X) k
  120.                     self.snddata = data& ^( P! w1 @6 n
  121.                     mylock.release()2 s4 i  B  O3 D0 U. R
  122.                     #print_hex(data);
    & {3 A) o9 u! u0 H
  123.                
    1 S1 ]9 _- b+ c/ h
  124.                     - s4 J# ~7 c' {! R2 q3 `: a7 _2 a
  125.                 # 判断结束
    % ]* Y  r( V& L. `  ?+ e, t
  126.                
    9 F4 y# E4 M; F. {6 e: A
  127.             except Exception, ex:% H1 _% V, _, F* }- m4 J! }$ @+ m
  128.                 print str(ex);8 V5 K! l- {8 S, F, l) C
  129. * P8 f7 W  t( ?  f- |% y
  130.         self.waitEnd.set();
    ) @+ D: f( G% X9 B  g3 p
  131.         self.alive = False;
    - W, P1 d  \0 }$ x- {( `

  132. / g, T9 O$ Q( f3 B# ^
  133.     def FirstWriter(self):1 y- ?5 c2 E' a6 K- K9 w2 h
  134.         while self.alive:! {  n( b; i, |$ B0 w" I  l
  135.             # 接收间隔
    9 r& l2 L' b' Q- M
  136.             time.sleep(0.1);. H9 N9 `8 A2 z! Y& F5 K# t* Y
  137.             try:; V- T7 a% l5 l
  138.                 #snddata = raw_input('\nenter data send:\n')
    2 A) ~/ `' O% G/ X
  139.                 if self.rcvdata!='':3 F- o, h7 g6 r0 x5 y9 T
  140.                     self.l_serial.write(self.rcvdata); * j; _( ]; M. ~3 _+ I* v. M' I% U
  141.                     print u'-<应答:'& B- k+ @2 K' |
  142.                     print self.rcvdata;
    ; A7 _; h% a0 D% Z; d. p) Z
  143.                     mylock.acquire() 6 l1 R9 ^8 U% e4 H% O- M
  144.                     self.rcvdata = '';) r" a9 E' \8 z: p( F
  145.                     mylock.release()- f4 u- P7 P$ a: j
  146.                 #print_hex(snddata);2 C9 l$ y3 |& {, X
  147.                 : U# ^, G$ Z, R9 `7 ]% F- M* c+ u7 G
  148.             except Exception, ex:' @! ?% o5 I! q0 T" V& m% x, [* C
  149.                 print str(ex);
    ( i% Y8 |9 A; X1 @
  150.         self.waitEnd.set();- \) `  x: Z" K  f7 b& k
  151.         self.alive = False;. I- [- M  Z- b% X5 W' U

  152. ! w7 _1 Z$ f4 n& ?5 k* _. c
  153.     def TcpClient(self):
    % q+ O# s# `  b) H3 Q1 ^
  154.         while True:
    4 V7 B0 p0 G* U6 W/ b
  155.             # 接收间隔  I2 j/ c- n# N5 x) g9 s' K" N
  156.             time.sleep(0.1);, v' j9 {$ s: d9 R2 M& _
  157.             self.connection = socket(AF_INET, SOCK_STREAM);; j& k1 S! d: [; _) ~  a9 C/ C9 @% C
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    5 u; R) U% h; B% j# ?6 w' i! ]
  159.             print 'Connect to Server OK!';# V( M+ I/ ?8 P3 Z
  160.             self.snddata = ''
    . S+ [5 x& J6 \3 b7 T/ n" S( I
  161.             self.rcvdata = ''
    # M$ w  |7 }! m8 q( p2 u8 ?1 `9 Q( S# H& X
  162.             while True:
    1 V8 Y9 B2 `: K1 w/ `
  163.             #读取客户端套接字的下一行
    # L4 m1 p+ M' `8 q" @- k
  164.             data = self.connection.recv(1024)
    : v8 H- C& b  z! ]4 W0 c7 H0 N
  165.             #如果没有数量的话,那么跳出循环- u6 [% m3 y* K% r. f: p; l
  166.             if not data: break( H& f& A8 n  M+ z
  167.             #发送一个回复至客户端9 l- T* M: R9 E. F" v
  168.             mylock.acquire()
    6 P1 W0 d6 g6 f! t6 t. f$ d8 i) e: }
  169.             self.snddata = ''
    ) }/ l( G9 A* ]' n
  170.             self.rcvdata = data' F* D  r2 B1 {' K4 P
  171.             mylock.release()
    9 e1 F8 b$ z* d8 e2 I4 K$ g, X
  172.             #connection.send('Echo=>' + data)
    ' ]7 \9 w, X8 \  c' X% F
  173.             self.connection.close()
    $ ~. R6 t6 x/ K% B  U: K, \2 d
  174. % M6 M' l( ^& L9 L! P! ^
  175.         self.waitEnd.set();
    ) ?! C( D" P; f+ T  \
  176.         self.alive = False;
    9 a: Q5 X6 D" z

  177. $ E! @( b0 h$ c8 j7 e. t
  178.     def TcpSend(self):/ h+ Q; P* D: p4 m/ C/ l
  179.         while True:
    ' x' ^8 c% [0 w/ A) h. g8 ~2 S
  180.             # 接收间隔3 Q* O# J. `, n4 D
  181.             time.sleep(0.1);
    : M. @; a, i5 b3 x5 o7 H6 Y
  182.             while True:
      L8 b) l/ {2 M/ J
  183.               time.sleep(0.1);& g( E/ G6 J' ~" x4 ?3 p
  184.               try:5 B% [) N8 w+ _6 w9 R& s- Y5 \
  185.                 if not self.connection is None:
    & R1 i& V5 L' W
  186.                   if self.snddata != '':
    - C0 J! S: t" {! A
  187.                     self.connection.send(self.snddata)" p" U1 R+ v, R$ U: E# ^  m8 [) D
  188.                     mylock.acquire() 3 e+ }5 R$ o7 c' E, c
  189.                     self.rcvdata = ''# s7 G8 _" F2 s+ Q8 W2 _/ L
  190.                     self.snddata = ''
    $ j- V6 C9 o! X% W/ `
  191.                     mylock.release()
    - s% U5 C4 g, S* U9 M& G- @
  192.               except Exception, ex:: J  s( \. n6 k$ U) {
  193.             pass        4 b5 H5 J2 r+ d# o2 ?0 g
  194.     def stop(self):
    & r  q7 s/ r6 i) x' v# l9 ]
  195.         self.alive = False;) Y! f) o: _8 p8 |. y4 g: o' W# \
  196.         self.thread_read.join();% p; v, G: V; P" ^
  197.         if self.l_serial.isOpen():
    3 c) u1 Q1 m$ r
  198.             self.l_serial.close();
    & Z7 w% h# J, F) ?; m

  199. ' X3 Z; B0 j. u. x! m# ^7 E- ^

  200. + L2 n. h) i. O" i1 q6 x, T4 i
  201. 5 ~) q. l5 \6 C$ Y) O
  202. #测试用部分; T, f! b: ~0 a$ i$ H3 J
  203. if __name__ == '__main__':
    + l, t5 M2 l9 P, ?# E
  204.     print 'Serial to Tcp Tool 1.00\n'
    + r: N5 o" {0 ^5 s% F8 u$ ^
  205.     print 'Author:yangyongzhen\n'0 n( W" h+ {& H8 `0 S9 c
  206.     print 'QQ:534117529\n'$ H& p. E. u* b* G; U5 U& Y
  207.     print 'Copyright (c) **cap 2015-2016.\n'" }6 L% E' D8 w* j+ [$ {* g% v0 Z

  208. , p! W. c/ u' R9 q! [( u
  209.     Server_IP = raw_input('please enter ServerIP:')9 U' q, O/ v! f
  210.     print 'Server_IP: %s' %(Server_IP)2 l3 A) Z: X& X* g
  211.     Server_Port = raw_input('please enter ServerPort:')
    $ u6 X9 c2 I- T$ f3 E6 f) i- F
  212.     print 'Server_Port: %s' %(Server_Port)6 h( u# {; Q+ W, k# C
  213.     com =raw_input('please enter com port(1-9):')0 b4 _" n4 n+ k! X& P4 z
  214.     rt = ComThread(int(com)-1);& g; ]' Q' O4 U' N) _$ X
  215.     try:
    , O7 W. I6 e5 R5 \5 Q5 R
  216.         if rt.start():
    ) q3 z8 c( ^+ s- q
  217.             rt.waiting();4 e0 M6 {. A- h& ]
  218.             rt.stop();
    " T: q" T# I+ ^, u
  219.         else:
    / W8 q8 o4 U) Z+ S* e* M2 O
  220.             pass;            , }3 j4 z$ [- w  m7 i+ c6 A
  221.     except Exception,se:
    $ ?6 L" o' P: E3 A( V
  222.         print str(se);
    1 U# a) L* e, l/ X
  223. ! W7 `' Z# Q4 i: @: N# S" K0 E7 ?
  224.     if rt.alive:9 |6 e' {. @# ]& e7 t9 `9 _0 e- N: _
  225.         rt.stop();. C# N" ?* g# ?$ D
  226.     os.system("pause")( m& n, S- @, v) R1 w
  227. ( J7 |8 K# f0 B5 X1 [
  228.     print '';; \4 z3 Y8 [1 n' e- `( g
  229.     print 'End OK .';
    ; Z+ }' u( S9 O
  230.     del rt;
复制代码
1 }! {: N: o7 Z; S) C$ |





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