QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    # h; C5 x6 u# B6 C6 W
  2. ) K* Y2 i' {# C8 P
  3. , b  [# M5 d6 R9 N
  4. import sys,threading,time;: h( p) g& h: j! v$ ?- P
  5. import serial;
    ; S6 F0 c& V* ^
  6. import binascii,encodings;
    1 w/ \! ^+ J6 l, q& T' F
  7. import re;# C8 ]* r, ]3 `3 k- ?3 q, k
  8. import os;
    ( Y) d* I  d6 O5 Q  r6 P7 `$ h
  9. from socket import *% ^3 Q) A1 y. E# N; N& R8 e! B* Q. J
  10. from struct import *;
    6 @3 c: t, z2 L% n1 J
  11. #from myutil import *;+ a, _8 q8 W! U6 X
  12. #name: myutil.py5 A/ `1 Z# _& _; N7 a8 L. p

  13. $ ?! ?, A# x; [: u/ V$ a9 H
  14. mylock = threading.RLock() + K+ x2 J5 e- W  A4 D4 ]
  15. + `7 C- p1 {/ X% U8 B
  16. Server_IP = ''
    9 I8 z: [7 m+ ^9 c
  17. Srever_Port = ''
    - B/ k+ p9 g; P. Z9 S
  18. 4 O% `  r/ l$ d6 _2 i- m  |
  19. def print_hex1(s,prev='0x'):
    0 g8 \; ?9 X/ s) }
  20.     for c in s:4 z- i5 \  E( m6 J
  21.         print '%s%02x' %(prev,ord(c)),
    1 n3 ]1 _$ Q$ }9 i! C2 X
  22.     print( O' }, B: i/ M. U. @4 x, _
  23. def print_hex(s):
    $ \8 u\" x0 [  u' H( ?; C
  24.     for c in s:& H* ?: Y  H$ U! ]1 e# D5 p' b
  25.       print '%02x' %(ord(c)),0 z! x/ n# V7 u. E
  26.     print0 J0 ]* E5 a* {( k# v: x

  27. * L: ]6 `; J$ L7 p. v; X
  28. def hexto_str(s):, x( I! P) ?6 m. I) J
  29.   r =''
    4 B5 u! q  w6 u; A: ~5 x4 }5 y9 J
  30.   for c in s:
    # I% W$ z& g' ~; A, K! G
  31.     r += '%02x' %(ord(c))
    1 z; y0 R3 v, L5 Q& V
  32.   return r
    & R9 n1 [) Z/ ~; c+ |
  33. def strto_hex(s):\" b/ g2 g% B& Q7 @! ]# L/ Z, y  `
  34.   r = s.decode('hex')
    7 s* @5 e! l. L/ R- \6 L' u  @
  35.   return r+ v! @* V6 d! Z# r' s8 a! t
  36. #''代表服务器为localhost
    ) s0 E+ F; g- w$ M

  37. ! v. x* [. u# ^. |8 }7 b+ P* j
  38. #在一个非保留端口号上进行监听
    1 l3 k* x% Y0 _- Y6 j

  39. ( u4 R3 h3 m& p% E
  40. # T5 {. w8 d5 M8 G9 w6 \8 I% M
  41. class ComThread:
    ; v) q# o# ]* C, F- ]4 w% Y
  42.     def __init__(self, Port=0):
    9 y* h0 o: ]6 ^2 E$ T
  43.         self.l_serial = None;
    1 [' [9 r/ u1 X. T8 b4 s
  44.         self.alive = False;9 X5 \; ^; R6 H
  45.         self.waitEnd = None;
    % k; X& F0 ]8 W$ i+ q
  46.         self.port = Port;
    0 t0 y4 u; |' ]' ~9 n( J

  47. & m6 f* o4 F* |) Q0 y' t
  48.         #TCP部分
    2 x1 R( K+ h2 ~0 o# R
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# r6 @. \\" U! j+ i5 _# ?
  50.         self.connection = None
    9 y0 U& C% G$ j) k) E+ Z* p
  51.         #数据
    ' A' Y- r' E9 Z$ ]  H% \
  52.         self.snddata = ''/ L6 D1 b4 I9 U6 D$ T
  53.         self.rcvdata = '') I7 @3 |\" m1 U; j3 r

  54. 4 `- j, w% q% y# d
  55.     def waiting(self):
    % m0 w: P7 B. E! u$ d- |# K  H
  56.         if not self.waitEnd is None:
    ; q% B( |4 f\" u* w0 }8 ]' Q
  57.             self.waitEnd.wait();# a% R8 [7 j; ~! r6 r/ r4 m2 g

  58. $ Y. @2 l; f5 P1 a
  59. 8 _: b! j! C' U
  60.     def SetStopEvent(self):
    * A% Y0 y\" e* i) h; a% O. U
  61.         if not self.waitEnd is None:( |0 x/ \  _: U
  62.             self.waitEnd.set();2 J3 F1 b. e+ V' i  M9 y
  63.         self.alive = False;
    ! r4 h) |4 d: J
  64.         self.stop();
    2 Q9 b( [9 L% j, ~2 d1 A' U7 n. W
  65. . s\" Y5 B$ M* X6 E; f* t2 y

  66. ) p& p) _, }8 i+ ]\" J0 z
  67.     def start(self):
    2 Y/ c( _5 }! R$ j5 P( v
  68.         self.l_serial = serial.Serial();
    & R* b4 c- H6 c
  69.         self.l_serial.port = self.port;% W9 x9 o$ x& v$ i' t, H. Z9 k
  70.         self.l_serial.baudrate = 115200;
    \" U: f, ?, m8 _& u6 A: z* _) k
  71.         self.l_serial.timeout = 2;  #秒
    - @) b3 m* O$ E  g, H; s
  72.         self.l_serial.open();
    1 z+ y; q& m+ K\" K\" r* [6 t) i
  73. $ k+ ]) j$ u! ^5 i4 Q, [  }
  74.         if self.l_serial.isOpen():
    7 y' I4 f( {( |7 a5 o! g# z! {
  75.             self.waitEnd = threading.Event();
      q0 k% v. n4 S8 z/ E9 E
  76.             self.alive = True;
    2 {/ v! U$ F2 {0 l
  77.             print 'open serial port %d ok!\n' %(self.port+1)8 K9 u' z' i: u! g
  78.             print 'baudrate:115200 \n'
    3 C; S1 S2 D\" h$ [( _
  79.             self.thread_read = None;
    0 f\" M+ F8 G( A
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    % u( w2 x3 ]8 w, u$ _
  81.             self.thread_read.setDaemon(1);9 ?) x\" t0 G$ Y. R* E3 _0 O4 j
  82.             self.thread_read.start();0 l7 d4 u0 V$ Z7 g5 p, K0 Q9 Q( K  ]

  83. 5 U1 p6 _& C  p1 A
  84.             self.thread_write = None;
    8 R) g7 ]& z. Q% T
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    , P* f5 l, _+ c& i, ~/ C
  86.             self.thread_write.setDaemon(1);
    ' h9 D: q# f8 b4 r3 F( S6 i0 ?
  87.             self.thread_write.start();' \! Z5 X  K7 V! s6 B) H  \; B
  88. 7 `+ @) {/ }  C9 c1 r
  89.             #TCP部分( h8 X5 h* e) `8 T) K
  90.             self.thread_TcpClient = None;4 ?5 w1 M) W+ c) e\" L+ [# `1 j1 x
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);4 x% Y2 {, [& \. ^/ R' \! L; l
  92.             self.thread_TcpClient.setDaemon(1);
    ( @& ]' I) c/ N5 K# Y
  93.             self.thread_TcpClient.start();) E6 `& M7 M3 r7 x, E6 Y7 s2 ?$ n
  94. % d* @* E6 F/ b+ {
  95.             self.thread_TcpSend = None;3 Z8 b, _* O7 d& u
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);8 c' f- `' Q\" e; h& \! A0 F
  97.             self.thread_TcpSend.setDaemon(1);
    ; z: v: H+ E' ~2 k
  98.             self.thread_TcpSend.start();
    . {5 T% R+ @! ~  Q
  99. 6 J+ \' a% Q, H2 t
  100.             return True;
    3 J/ O7 S! i( F, i! i4 ~
  101.         else:# r8 [7 E6 X' s( C
  102.             return False;\" f- Z5 K) d+ G: J. P( G) X
  103. & H! k& x+ O. x# c

  104. \" y# s; ~5 e, _3 Y% K6 c
  105.     def FirstReader(self):
    $ l) e4 s; {& s' N/ l
  106.         while self.alive:% x$ ?4 [! z  L\" @, H* v! a! X
  107.             # 接收间隔& A7 L8 c- O8 y+ \\" a3 }
  108.             time.sleep(0.1);5 S  ?, @0 B! B6 p- k
  109.             try:
    & J$ A1 n3 F& ]# P3 q4 w5 S% _3 Z\" y
  110.                 data = '';
    5 }8 Z5 e; U0 h3 D
  111.                 n = self.l_serial.inWaiting();
      `3 n: Z- e1 s+ `/ W9 F
  112.                 if n:
    $ f* Z+ K& ?9 P# r
  113.                     data = data+self.l_serial.read(n);8 L+ y' @1 a! z2 @3 X, }
  114.                     #for l in xrange(len(data)):
    ) [% B1 `/ `0 e) J7 _! j* ~
  115.                         #print '%02X' % ord(data[l]),
    2 a- {7 u* `1 ?
  116.                     # 发送数据
      ]. v& P6 g% ]
  117.                     print u'->请求:') ?2 j6 w4 b7 b, y7 E4 j' V
  118.                     print data;
    & n% o# u1 `% c% Y
  119.                     mylock.acquire() 1 U- f5 N# i\" q; `
  120.                     self.snddata = data
    6 n0 j. g3 B! c6 h
  121.                     mylock.release()
    9 b3 Q6 u' O  t8 I
  122.                     #print_hex(data);7 k+ x6 j* Q2 [
  123.                
    : f' G$ }- {& ]9 N8 ~\" @
  124.                     
    - W7 K+ ~; U0 @% K; Z) S! U
  125.                 # 判断结束
    \" [9 h& Y/ n; j* ^5 S' i
  126.                
    / v4 j  l8 i1 p  V4 Q% w
  127.             except Exception, ex:; w. A. N/ r& D2 _7 j
  128.                 print str(ex);
    ; Q: _/ X3 k+ M2 r
  129. 4 S7 D0 _2 |' @3 B7 y+ u* G
  130.         self.waitEnd.set();
    $ R! M5 h& F* U9 W8 K1 K' H, Z
  131.         self.alive = False;( ?1 a9 F' w- i4 U; Y
  132. ' c- T  y% S! x
  133.     def FirstWriter(self):9 q4 b) m( j: N9 T+ ?
  134.         while self.alive:
    5 r% J1 {: a% v
  135.             # 接收间隔
    3 `6 d0 T  B' l* c
  136.             time.sleep(0.1);, ]7 p9 I/ D6 o% {+ h
  137.             try:' p9 R, S) t\" S1 j/ \9 F3 m  p
  138.                 #snddata = raw_input('\nenter data send:\n')
    ( b) p$ O# M+ x
  139.                 if self.rcvdata!='':9 I4 A. \5 H: e4 G2 m+ S! P
  140.                     self.l_serial.write(self.rcvdata);
      R2 G* ^2 s6 W4 y* b  a+ @
  141.                     print u'-<应答:'2 t4 k2 s( A/ M( j1 h7 ^& z
  142.                     print self.rcvdata;
    , y/ n1 @5 G7 h; r\" H' D& C1 h
  143.                     mylock.acquire()
    % R8 d8 q! |+ F, ^! e
  144.                     self.rcvdata = '';# {6 Q% s5 o\" O1 u% w
  145.                     mylock.release()1 ^1 |  Q: ]8 @, b
  146.                 #print_hex(snddata);
    0 f, c0 [- X. i\" m
  147.                 & [5 H' S! ~* ~( @7 v3 f
  148.             except Exception, ex:
    6 K0 H0 o+ v# [1 y
  149.                 print str(ex);2 Y2 K\" q' {2 ~, I- w6 n% C3 q
  150.         self.waitEnd.set();
    0 z  ]  Q/ R0 T' ^) X6 S5 ?( h
  151.         self.alive = False;4 o! ^& f% ?\" S( Z+ B: |8 B- _
  152. \" Z; v/ d9 P. g) C- ]4 d) _
  153.     def TcpClient(self):- t, a! b, \/ J/ |; s9 f
  154.         while True:
    ; ~( Z0 f! \- J
  155.             # 接收间隔
    8 \' N4 D- o- `- ]5 Q. ^6 m2 B4 A' T4 A# e
  156.             time.sleep(0.1);! t! i# ^/ S: K- S( K. H: t) d
  157.             self.connection = socket(AF_INET, SOCK_STREAM);0 Q' d0 f2 i9 y  E5 Z% N4 ?
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    ( e; n4 E# S, l+ _8 v/ h
  159.             print 'Connect to Server OK!';! \\" d% E' C( E) q4 H
  160.             self.snddata = ''
    \" @6 Z/ U  J3 V( l$ m; H. R  c
  161.             self.rcvdata = ''0 y  J0 v2 }: `; |
  162.             while True:% ], s# h, m+ [1 n7 l* a* x7 \
  163.             #读取客户端套接字的下一行
    # t7 {- o7 n5 U- K! w) `
  164.             data = self.connection.recv(1024)! {( ?( n3 m, R  h: F7 x& b/ {( Z
  165.             #如果没有数量的话,那么跳出循环! e% w4 p3 {) ^; n0 l! h2 n0 w
  166.             if not data: break
    / m$ ?& x; Y9 M3 j1 [
  167.             #发送一个回复至客户端6 C7 X3 i- B, N' Q4 u3 S5 n( z
  168.             mylock.acquire() / Y  `: F4 F3 a. K* f
  169.             self.snddata = ''
    ! h\" y3 G\" a3 S% i4 X  c
  170.             self.rcvdata = data6 G/ e/ f. M, A
  171.             mylock.release()1 P# [% m' M: c5 X7 A5 J; a1 y
  172.             #connection.send('Echo=>' + data)
    - T1 d& V. h% e$ E) N2 R
  173.             self.connection.close()+ T5 P, d! ^3 d- r* C
  174. 3 \: O% b8 f) q% l- X& V
  175.         self.waitEnd.set();
    8 N: n0 P2 ~% v( o8 }2 e, v' F
  176.         self.alive = False;! ~# N- G4 a) h9 r$ z4 C

  177. 9 Q% K6 j3 A+ O$ Z* W. m( `
  178.     def TcpSend(self):
    5 p( @. O* Z9 B$ _0 N\" A. b
  179.         while True:' Z! Y7 q1 k& U! b7 n9 z
  180.             # 接收间隔
    2 @6 y7 H% y4 ?  ]& e. d
  181.             time.sleep(0.1);
    5 S* J$ N& A5 u2 g8 k- Q) g
  182.             while True:- O6 J; i9 N% B  V4 }; M' a4 z* k
  183.               time.sleep(0.1);
    + |: J\" ]% v! n! K0 i+ S, l
  184.               try:) P4 e\" z* }4 T
  185.                 if not self.connection is None:
    % {; b0 z9 f8 ^\" b, r, l* W
  186.                   if self.snddata != '':0 ]/ ?6 N\" n& N( U% d0 S$ v0 A
  187.                     self.connection.send(self.snddata)
      h, u# e$ ?' E. t
  188.                     mylock.acquire() % i- n. |/ a# u, \2 E\" u
  189.                     self.rcvdata = ''+ J) b. l7 C\" u2 [2 T5 D
  190.                     self.snddata = ''5 t: h  p5 T! j
  191.                     mylock.release()1 I, g3 I+ X% L: A
  192.               except Exception, ex:
    ! ~1 @' X% ~0 c/ Y4 k& ^3 F9 a2 q
  193.             pass        
    ) A3 _3 M! [4 s6 \& F0 y0 j' A
  194.     def stop(self):# E9 s  Y7 F\" A6 q- d. W2 [
  195.         self.alive = False;) i' |8 L; e5 Z
  196.         self.thread_read.join();' [# n0 Z3 Q- i: j- @5 o* t
  197.         if self.l_serial.isOpen():' Q) G. B0 T; l2 r- O
  198.             self.l_serial.close();$ R2 ^0 \2 @3 j

  199. / d! H  F$ I% d9 A* k3 P. }' k' P

  200. 3 @7 J# o6 O\" h  g
  201. 7 N+ X1 E\" r# P$ ^2 I& X
  202. #测试用部分
    6 d) i+ m8 I! [+ ^
  203. if __name__ == '__main__':! G, b; K( q. l5 O; Y6 E
  204.     print 'Serial to Tcp Tool 1.00\n' 7 t; c& @1 s6 `8 i. B( n8 X' b
  205.     print 'Author:yangyongzhen\n'9 `4 Z2 W% j$ N6 J
  206.     print 'QQ:534117529\n'& U; ?\" v9 I/ A! j% y3 w
  207.     print 'Copyright (c) **cap 2015-2016.\n'+ d3 L3 O3 j1 k. m

  208. 5 W3 L) u: _\" z, K
  209.     Server_IP = raw_input('please enter ServerIP:')- j0 z3 ]! H  w1 J
  210.     print 'Server_IP: %s' %(Server_IP)$ f3 o5 M8 b! H& P' i6 E8 }
  211.     Server_Port = raw_input('please enter ServerPort:')
    , {3 n% q3 Y7 z% K1 R$ f\" A$ E# H. U# O
  212.     print 'Server_Port: %s' %(Server_Port)0 o. b& o; Y. V7 A. I
  213.     com =raw_input('please enter com port(1-9):')
    ) {* ]\" k5 S* `# f
  214.     rt = ComThread(int(com)-1);
    6 f& I- _, I! Q$ t1 m2 ~6 v$ f' X
  215.     try:5 {; k3 h# g' d, o
  216.         if rt.start():, Z- C3 Y& L2 |1 k4 U% u: L) b1 F
  217.             rt.waiting();& A) G3 H\" r5 i- d\" b1 }; h\" a: X
  218.             rt.stop();
    : i, G, S9 s2 a5 m* U
  219.         else:& Y) c9 ]9 S# ?+ i! \& b
  220.             pass;            8 d3 Q! {+ ^/ F! g+ @$ r# C  o
  221.     except Exception,se:
    5 l6 l$ V6 j* ], q: S
  222.         print str(se);
    \" I+ L7 _2 ^) b2 M$ q2 H

  223. 4 B+ x1 W& {& {/ Y# N\" |5 B: Y
  224.     if rt.alive:
    7 _1 {, z\" ?& E0 C6 S' i% @2 p
  225.         rt.stop();
    1 h  P* k3 U, B5 D6 J% u, \
  226.     os.system("pause")
    & ?4 J: V4 I3 k  }# }( S

  227. ! e3 b' ]  G7 ?& G, q- [; k
  228.     print '';) u' d% V( n9 K+ C1 i
  229.     print 'End OK .';
    9 |* R- i; s\" e' ^$ S( _
  230.     del rt;
复制代码
/ h* x& b) b7 ?# v% m2 ?, k
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-4-21 21:44 , Processed in 0.470674 second(s), 51 queries .

回顶部