QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 748|回复: 0
打印 上一主题 下一主题

串口转tcp工具

[复制链接]
字体大小: 正常 放大

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    8 a  ^# G7 Q: M; X. \
  2. \" G& f$ M. z, A& y2 E0 \\" k

  3. ) T$ x: V5 j1 d' n& H3 b1 s
  4. import sys,threading,time;& h& O- M! w\" R3 @\" e' f
  5. import serial;8 x) o+ `2 O' l' m\" J( q9 \2 F
  6. import binascii,encodings;5 k4 k* B; Y# d  Z0 l) [9 s
  7. import re;
    + u+ c  P4 s5 ]8 s1 `0 R5 U
  8. import os;
    - d5 g9 A% v* b8 h( m4 L5 v
  9. from socket import *% j$ O# \9 D! s' I0 [
  10. from struct import *;
    & t  I6 K5 J+ n
  11. #from myutil import *;
    , e/ \9 P, }. _
  12. #name: myutil.py8 ^# `- }% z/ C1 B2 Q8 c/ Z

  13.   ^: {) U) O: t) N% K+ x' L
  14. mylock = threading.RLock() 9 t8 l' q7 J( ?' ~* c5 p2 L

  15. - M0 R# s3 I. p4 y, n
  16. Server_IP = ''3 @( ^; |5 E9 V% a# e% N
  17. Srever_Port = ''
    5 H# h* ]8 s8 @$ f4 X8 B8 E

  18. \" h$ u* Q% M1 K3 L! m
  19. def print_hex1(s,prev='0x'):3 C. s/ e2 I5 ]1 b. ?
  20.     for c in s:  `4 b) o; R# n0 k: s4 D# M/ s1 f
  21.         print '%s%02x' %(prev,ord(c)),
    $ n/ v' f: Y& f4 E0 i/ e2 ~; ]
  22.     print
    2 G/ x0 ^$ h1 d
  23. def print_hex(s):# h  D+ ^1 q0 i
  24.     for c in s:
    # T3 h1 p( v3 j
  25.       print '%02x' %(ord(c)),
    6 d/ x/ m7 D, o4 P  W% k5 a
  26.     print
    - q: d, J( V3 Y# H* r9 G. N
  27. 0 W+ t9 X8 o% X; S- A1 z' \* g
  28. def hexto_str(s):
      M/ P1 ]; M; \, G! t3 T
  29.   r =''
    ; X. e4 A8 `2 D; h) H3 T
  30.   for c in s:
    \" Y: J* s\" K$ @. L
  31.     r += '%02x' %(ord(c))! f% z% c2 w* a1 o1 m6 q
  32.   return r# F4 R3 T! n# Z* s. y+ K. i
  33. def strto_hex(s):' p# R0 ]* h# O5 \4 n0 S
  34.   r = s.decode('hex')7 ~) P! O- m6 \+ z+ L, N
  35.   return r7 y  X, r2 F3 v1 Y4 M0 j\" j
  36. #''代表服务器为localhost\" F; [. D. P: }( x6 B8 I
  37. ( r# K. T- K6 z
  38. #在一个非保留端口号上进行监听7 w% R( H\" x6 f! Y: V# C- n
  39. % |' L7 `2 q7 j9 b9 D

  40. 7 R( [) H5 i3 `+ M' f- z
  41. class ComThread:\" D5 X( H/ M$ b3 H5 i
  42.     def __init__(self, Port=0):\" b) y  q0 ^8 v% @
  43.         self.l_serial = None;
    ' D, [1 M\" W0 ~+ Q9 {, w
  44.         self.alive = False;
    5 p) E- G: E& _- @7 @4 ~
  45.         self.waitEnd = None;
    , L( k1 [) ^$ m, U8 r
  46.         self.port = Port;
    1 g- }4 P6 {' ?% q8 K

  47. % o9 i, U: R( c/ ^
  48.         #TCP部分0 M2 d4 \+ z( m/ j) r4 E\" k
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    . a' s3 H/ W/ W% u- V/ t  c
  50.         self.connection = None
    8 {+ H. x7 l8 O) i* }
  51.         #数据9 _, u\" J- p/ i) K; s& z! m* F/ [
  52.         self.snddata = ''
    $ h: S1 A, R# i' s
  53.         self.rcvdata = ''
    # @1 s: W* v- p' `\" W  S  b
  54. 9 c/ K0 d$ M5 ?\" }% H
  55.     def waiting(self):
    ) J  w9 T* g: u, }! N
  56.         if not self.waitEnd is None:% {, t3 g5 p6 q3 u5 F. @
  57.             self.waitEnd.wait();* O. B( ?7 Z& V( O0 C6 R0 I
  58. * ~+ `4 H9 U, J! f

  59. * H. \- P\" A6 u8 [# W
  60.     def SetStopEvent(self):
    . o( c5 n- k! ?2 o% f& N- [\" ^
  61.         if not self.waitEnd is None:
    3 {  q2 w/ x* f3 E
  62.             self.waitEnd.set();# S3 r$ u6 l7 l$ S) O
  63.         self.alive = False;
    : ~: E3 D% G  X1 r3 D' E
  64.         self.stop();
    ! O; n2 P) S! ]7 L0 t* C1 \
  65. ( |: o( p: o7 x. ~6 a5 `
  66. + E' Q\" f' V1 J6 D5 o& U) p
  67.     def start(self):
    5 L% Z1 ~; s2 p' U: N
  68.         self.l_serial = serial.Serial();- S! J1 G- i2 j9 @, O6 p
  69.         self.l_serial.port = self.port;
    % q& }7 K  E3 s5 A' W% Q
  70.         self.l_serial.baudrate = 115200;
    . e( k7 J7 H- u8 C* k2 Q
  71.         self.l_serial.timeout = 2;  #秒* S. m9 a% ?( @
  72.         self.l_serial.open();
    / L: u, A( D! g& U5 U

  73. 6 s0 Q5 u, b3 W5 Y
  74.         if self.l_serial.isOpen():( {  B! G* |, E$ ^. S$ K# Y  ~\" ]
  75.             self.waitEnd = threading.Event();1 L6 h6 j- G! K
  76.             self.alive = True;7 k4 a  c  G- ^+ r0 v2 s
  77.             print 'open serial port %d ok!\n' %(self.port+1), x3 @' L9 i2 z* U+ p
  78.             print 'baudrate:115200 \n'
    & H\" g! p7 d2 V* h; N1 v6 z
  79.             self.thread_read = None;
    : J) b& p* L) H/ J) }; I8 g
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    9 H2 ~\" |2 t7 I2 R6 ^' |! h6 q
  81.             self.thread_read.setDaemon(1);
    . d0 d8 L& E! r* |
  82.             self.thread_read.start();
    8 I- o  B! h6 c8 j& V9 m# Q7 k0 W

  83. $ k% u\" d$ d\" p( J; H
  84.             self.thread_write = None;
    / H% u' Y; l4 x0 O0 P6 R$ n
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);! z( l. E- M: j
  86.             self.thread_write.setDaemon(1);4 n2 D2 X( v  I& `# y
  87.             self.thread_write.start();; h, a- Z, S  F/ I+ w

  88. 2 [1 u\" l$ s1 W8 s4 O( k
  89.             #TCP部分
    $ g$ A0 n+ l\" C' p* T: v
  90.             self.thread_TcpClient = None;. b; H- b* m: d& V% z: I- k1 c
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);0 u% P, j: r3 t1 `. ]
  92.             self.thread_TcpClient.setDaemon(1);
    9 j$ o* {2 ?% W/ D# v' V6 y- s
  93.             self.thread_TcpClient.start();6 `+ B+ l( I- o
  94. 5 d# w' }1 M) ?\" A+ R' b
  95.             self.thread_TcpSend = None;
    9 R1 K1 x& X. \) q
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);, n0 @' I) F- r- T$ ?
  97.             self.thread_TcpSend.setDaemon(1);/ I+ b0 Z7 R4 X$ n7 }
  98.             self.thread_TcpSend.start();7 o0 H- ?9 K1 _) s/ @- C
  99. ' S/ W, i3 Q0 B4 W, |8 m
  100.             return True;
    ' M# s& z/ ?; D) K1 S  _
  101.         else:0 k- q3 ?8 I  H; |
  102.             return False;2 Y% `. ]! z1 x: J: O% l* b+ @7 y1 n
  103. , d8 p( }5 P. e) z5 {3 S
  104. , v2 Z9 D6 U# L9 J$ ^
  105.     def FirstReader(self):8 b: z9 g4 l( u; u
  106.         while self.alive:
    # W5 O& a+ r+ c& z5 J& U$ A7 k
  107.             # 接收间隔& \2 O8 a\" x( V7 S! _, V- W2 M4 S
  108.             time.sleep(0.1);
    $ M, e4 d9 n  g9 i& |
  109.             try:8 ]. `9 Y( V9 L' H, |
  110.                 data = '';/ Y% s( G3 ^: U
  111.                 n = self.l_serial.inWaiting();& S  H' P$ Y8 D! C7 A
  112.                 if n:\" e+ Q2 b  w, U
  113.                     data = data+self.l_serial.read(n);
    - p4 ?% @' r* h
  114.                     #for l in xrange(len(data)):
    $ s) t! B\" U% `
  115.                         #print '%02X' % ord(data[l]),
    ; }% W5 G% h( N
  116.                     # 发送数据2 B$ k4 f4 Y& m& z/ r5 }9 |# v2 A- @
  117.                     print u'->请求:'
    ; t3 H/ J3 G+ w3 {
  118.                     print data;
    6 I9 u8 L3 o- e
  119.                     mylock.acquire()
    3 M( p5 M7 g3 S
  120.                     self.snddata = data
    & |% m0 w( ?+ K$ @% L$ i' o) a9 ?
  121.                     mylock.release()
    + k8 p# L0 q) x' b3 Y
  122.                     #print_hex(data);
    4 q/ K  F/ A\" ]! G
  123.                
    . H' n+ j; A  W6 i\" Y4 u5 _\" c
  124.                     
    ) r! |% h\" v8 q\" }
  125.                 # 判断结束
    6 Q6 Z2 m/ G* m( L8 ^6 N
  126.                % I. m4 j* E. F4 l7 M+ k
  127.             except Exception, ex:
    $ H* \+ v$ r+ V6 o% D# }) E
  128.                 print str(ex);\" ?* x0 j- h, M& z* k
  129. 7 j7 Q/ q5 L4 S3 e- ~# y) E
  130.         self.waitEnd.set();/ ]) q# |9 i  J. C& X2 ^
  131.         self.alive = False;\" W4 n' C& B5 X; c% ~8 E

  132. 0 r2 J\" E9 s4 E' ^: p1 ?7 d, g
  133.     def FirstWriter(self):
    . g7 u1 V# Z; D+ h
  134.         while self.alive:8 l7 \5 t: a5 M: R
  135.             # 接收间隔
    4 f\" s  a2 e( N6 ~& `) K
  136.             time.sleep(0.1);3 N: r\" h$ N/ m1 C0 h
  137.             try:4 V9 P% v# _+ x! |2 o; |9 `9 M
  138.                 #snddata = raw_input('\nenter data send:\n'). C; {: m4 m\" s( p3 ]* T
  139.                 if self.rcvdata!='':
    $ {% O0 U% Y+ z. U5 y+ g/ P$ Z! G! t
  140.                     self.l_serial.write(self.rcvdata);
    $ E8 e( [. F1 f7 ?; @9 v9 J\" J
  141.                     print u'-<应答:'
    8 j9 W5 M  Z! |1 |1 W5 L
  142.                     print self.rcvdata;
    ' ~+ `; M* X, O, F, w: w
  143.                     mylock.acquire() 4 z$ w7 W5 r' z0 W9 E
  144.                     self.rcvdata = '';
    % S/ W# A3 t) z* Q
  145.                     mylock.release()
    ! G8 F5 T. Q0 K0 `9 U\" z$ E) v
  146.                 #print_hex(snddata);0 @\" ~6 P* y1 j% g& H7 T2 t
  147.                 ' ^\" [9 s9 ]+ o8 B+ e* C
  148.             except Exception, ex:
    * ]) a% J. ^3 z% ]4 F9 o$ ?
  149.                 print str(ex);5 Z1 u5 m4 ^5 O/ s4 J
  150.         self.waitEnd.set();0 }3 ]: i4 H\" T4 F0 j' b
  151.         self.alive = False;( C4 j( U# _. ]6 Y8 N+ }: |

  152. ! F3 a* U' r3 B5 _7 S6 |' v
  153.     def TcpClient(self):+ C% R) `\" ~( i
  154.         while True:
    6 ]7 \: v& f; w1 D0 p, |
  155.             # 接收间隔7 u' ]1 I0 l, \- a( K
  156.             time.sleep(0.1);
    & H( n  [- r( d# r1 X
  157.             self.connection = socket(AF_INET, SOCK_STREAM);
    3 R) f9 C7 `' |# L+ o
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    ! J* ~! w! @  n1 ]1 C- g
  159.             print 'Connect to Server OK!';$ T$ \  ?1 M: e8 P9 M5 o1 f
  160.             self.snddata = ''
    4 P1 R5 P7 K6 d/ u3 B8 T
  161.             self.rcvdata = ''
    0 v+ p: A1 g# n; }
  162.             while True:8 p\" l5 t4 ?0 g/ H7 C4 [
  163.             #读取客户端套接字的下一行\" T. d$ f2 a, f  b& {9 F- z8 {
  164.             data = self.connection.recv(1024)
    8 q8 r3 v6 I  g' |! K
  165.             #如果没有数量的话,那么跳出循环$ ]0 f/ Z6 Y$ h6 ]/ s6 H
  166.             if not data: break% y6 y6 ]2 G& u# r8 q0 C4 B0 R1 L3 _
  167.             #发送一个回复至客户端
    6 p& L. S2 T% e' m1 e' V\" S, k2 C% K
  168.             mylock.acquire() ; o  D$ L$ w6 L8 f% X
  169.             self.snddata = ''4 b9 J6 y! C1 q- Q- L( M. u3 X
  170.             self.rcvdata = data5 G6 W0 K7 Z9 j7 r5 R( M
  171.             mylock.release()
    - ?3 n2 v3 L& q% \1 d8 T) p
  172.             #connection.send('Echo=>' + data)8 Z9 l% s- U6 D
  173.             self.connection.close()
    1 }0 _4 f+ l\" D9 F
  174. / ?% p\" G: P0 M) Z4 ]
  175.         self.waitEnd.set();2 J\" x\" O3 i, M
  176.         self.alive = False;; N\" ]( M' j9 X

  177. ( a1 c; g! |$ |# H, k* p- b
  178.     def TcpSend(self):1 Z\" q( \' R' `' ^5 ~\" E/ ]( {\" W
  179.         while True:  N3 A8 n4 w* ~: N- \3 |
  180.             # 接收间隔! `% _- C- c\" ~* R( e
  181.             time.sleep(0.1);. N: x0 q5 b# L
  182.             while True:; L- `/ x5 u0 c4 C
  183.               time.sleep(0.1);; h5 O: z/ a  m. w+ a2 D; i0 F8 _
  184.               try:
    # W& N6 K0 b: |
  185.                 if not self.connection is None:
    ! T* X9 |1 [: P\" V
  186.                   if self.snddata != '':: a4 k. X! C9 i& e) y% q: K, H
  187.                     self.connection.send(self.snddata)# G/ @. K\" X8 E& z; V1 Q0 K, A
  188.                     mylock.acquire()
    4 g1 q8 V7 |0 j& N. V. A3 _8 D
  189.                     self.rcvdata = ''. j, I* {4 {. y4 J! [- L
  190.                     self.snddata = ''
    - e/ p0 s& B- q, Q
  191.                     mylock.release()+ ]; i( c4 s% [- l9 T- W. m
  192.               except Exception, ex:
    # D  f( O6 N0 e: U! E7 `* n
  193.             pass        9 U$ {+ D; e6 @$ {3 F
  194.     def stop(self):4 J7 G& `. G9 ]  @/ F3 y4 K
  195.         self.alive = False;  F6 {' |& h6 _
  196.         self.thread_read.join();
    6 j6 H; i- ^& O8 Y  i) ~$ `
  197.         if self.l_serial.isOpen():
    ( u& ?; M% j4 F) h/ G' t
  198.             self.l_serial.close();; e$ j' g4 J9 m  z$ |& K

  199. ' A( W6 f& Y& ^* }
  200. 6 x7 R. k. ]& A
  201. 8 D5 D- c3 v; Y3 Z7 N1 b  O
  202. #测试用部分
    9 a( p7 e! Q( B
  203. if __name__ == '__main__':
    ( i% L6 K5 x. b4 Q
  204.     print 'Serial to Tcp Tool 1.00\n' & c  c- x2 Y3 J, p( n9 W
  205.     print 'Author:yangyongzhen\n'. `4 F- T1 j: d\" y; S* B
  206.     print 'QQ:534117529\n'
    # r* v. V\" M2 A# k% D9 p8 C% D
  207.     print 'Copyright (c) **cap 2015-2016.\n'
    5 ?3 x. E0 y4 P# Y- @  u9 j( w7 l

  208. ! f  z5 H, T- w, y6 q1 U0 ?9 ^\" ^
  209.     Server_IP = raw_input('please enter ServerIP:')# O4 T  v5 {2 W7 n! W
  210.     print 'Server_IP: %s' %(Server_IP)
    # E+ Q! B\" x$ B* `+ I
  211.     Server_Port = raw_input('please enter ServerPort:'). C  b. |; k8 g3 ^3 p8 Y
  212.     print 'Server_Port: %s' %(Server_Port)* \1 M  p7 L8 l, e! V
  213.     com =raw_input('please enter com port(1-9):')
    ( G0 W9 l5 w* p; R3 j
  214.     rt = ComThread(int(com)-1);
    2 @4 W  |\" i3 u' @
  215.     try:
    : i& m1 R7 j) d2 z1 M8 X
  216.         if rt.start():  ?* N* l6 h2 C$ I
  217.             rt.waiting();; p1 c! D& ?+ Q6 R
  218.             rt.stop();; K( t* J6 N! q; z9 x
  219.         else:6 P& k$ z4 i& t* x+ P
  220.             pass;            - y( r9 T; U3 O& }: ]  ?+ ~( p+ K) \
  221.     except Exception,se:
    2 E0 _4 v' Q' s- @\" G$ f
  222.         print str(se);
    1 w5 U0 O# r2 A4 _

  223. / d' P3 t; S: X7 z
  224.     if rt.alive:: H# ~& O7 f& k1 V) T
  225.         rt.stop();
    ( Z7 ^! E1 U6 i. o\" S1 u6 A
  226.     os.system("pause")
    + q/ _0 E; ]; ^, H3 \) ~5 Y

  227. + u9 Y; P3 D) C! t
  228.     print '';
    # t\" z$ O/ P4 p1 _' a. i
  229.     print 'End OK .';  y2 T( m0 K! k( B
  230.     del rt;
复制代码
* E+ c( c( L% F0 ?% c8 c5 T& Q0 z4 n0 I
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-7-18 07:30 , Processed in 0.311171 second(s), 50 queries .

回顶部