QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1175

主题

4

听众

2867

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    ; M& F! s1 \$ S5 C( W
  2. 5 @) U$ f( r0 d
  3. \" x0 b4 E: R3 z& x5 D! ?
  4. import sys,threading,time;8 n' Z7 u3 F; ^( `& B
  5. import serial;
    ( h8 ?  U3 n+ i4 J! D+ |/ M
  6. import binascii,encodings;) S' n, k8 T! e. C- ]( H
  7. import re;! u4 M( Z) C5 c( T% {
  8. import os;$ D* k0 S5 a8 W7 T5 Z7 z# s5 C
  9. from socket import *7 [& f) R. K; n- ~. ]) B
  10. from struct import *;
    , U! J8 @: k2 H; B
  11. #from myutil import *;
    - J! ^  i0 g! p; f2 L+ o
  12. #name: myutil.py) @* R( l  E6 |2 T
  13. 1 N& _! p! l- v\" V0 \& i; E
  14. mylock = threading.RLock() ( i: H\" v\" W9 |' j9 m, _

  15. , T\" U& O+ q; G2 r6 Z4 t# g: w8 |
  16. Server_IP = ''& k3 R4 Y7 a* e! G9 Q8 U
  17. Srever_Port = '': G0 c  l4 J2 B
  18. 1 n+ p  ?' o$ _& ~& J) |& |: g4 P, n
  19. def print_hex1(s,prev='0x'):: [: t4 @$ x  J4 K3 M  d
  20.     for c in s:& U- C5 R: d* O( C. S( _# j\" D
  21.         print '%s%02x' %(prev,ord(c)),2 w7 X7 a8 T) ^' I2 c! T! ]
  22.     print9 @; A' t5 q5 |! b6 e
  23. def print_hex(s):# b+ [- U7 |  |: M
  24.     for c in s:
    $ t( N' e9 }2 f8 c% {% {6 y$ x
  25.       print '%02x' %(ord(c)),
    5 c3 P/ O/ n8 u5 o8 l/ c/ P% o7 V
  26.     print$ a$ e$ f$ z$ I. ?

  27. - u. @0 x. Q9 i3 a( \
  28. def hexto_str(s):
    5 B8 d/ X; E7 |4 _4 a$ S
  29.   r =''( c% l5 B, q8 |, R
  30.   for c in s:
    \" l, G: f3 p8 q5 m
  31.     r += '%02x' %(ord(c))
    9 L( y1 G) e' X+ e1 j5 U  U
  32.   return r
    . z8 [$ n) I; O8 {6 ^: R
  33. def strto_hex(s):9 [3 ^; O0 Q1 i# j: {/ d
  34.   r = s.decode('hex')
    4 e  s0 h9 |% A6 \9 R: g
  35.   return r( O: Z4 U% x( V& y' a& G! c
  36. #''代表服务器为localhost
    4 @7 i% Y$ _& n; o2 ~1 p
  37. , y- }( N/ E' k0 f
  38. #在一个非保留端口号上进行监听% a% C8 P% r2 J\" P5 F- X+ V
  39. 9 X* Y# H! u# w( S

  40. \" d5 r6 j+ I! J7 }* U6 g
  41. class ComThread:; D/ U. u: Y\" A# p1 ~+ W
  42.     def __init__(self, Port=0):
    \" e( x2 J) u4 G+ o3 k0 ^) e
  43.         self.l_serial = None;9 o( p- D% C' X. Z5 o% d\" |/ v, d
  44.         self.alive = False;
    6 I% c/ `4 P7 l9 _* k
  45.         self.waitEnd = None;, H* {0 o/ H0 E7 i
  46.         self.port = Port;
    6 ~* R) m! _8 k2 C

  47. : ]5 `$ r% G! v  O5 a( o
  48.         #TCP部分8 d/ n5 {! r7 U: s% k+ ]* Q\" H
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    1 c& B- x' B2 v
  50.         self.connection = None, v  y  i2 Q; \. m. w9 n
  51.         #数据6 G2 b2 T  R# G. S9 i
  52.         self.snddata = ''
    9 B1 V+ P5 u( q. C
  53.         self.rcvdata = ''
    2 R5 Q- ]! x6 G( I1 k

  54. 4 Y6 y( O' d' V\" v
  55.     def waiting(self):/ X: ~+ s& d/ _\" @( Z: ]
  56.         if not self.waitEnd is None:
    2 \- M\" `; }5 Z8 J2 q
  57.             self.waitEnd.wait();$ k! s: M3 N6 d' Z5 W

  58. 6 ]; y+ M9 J: z, g2 f0 Y
  59. % e/ b9 f( s* }- s
  60.     def SetStopEvent(self):+ i: x! c2 U9 i8 ^1 v
  61.         if not self.waitEnd is None:
    , U  v5 T) q0 r, ^6 \8 z; V
  62.             self.waitEnd.set();2 f4 C3 t\" q* d7 F2 F/ l
  63.         self.alive = False;
    $ g2 Y  Q$ F& N6 x( O: b6 W
  64.         self.stop();
    0 p9 ~! R( t6 j% z, M5 ?

  65. $ z& _: d( }\" j+ X
  66. , H# ?3 f  w! A) G. @/ F
  67.     def start(self):, _7 o: C4 j, O5 {, E6 f! U
  68.         self.l_serial = serial.Serial();
    / \+ E$ s6 [* G& T' C6 x5 a
  69.         self.l_serial.port = self.port;
    % A2 U3 R$ e7 t. P1 @
  70.         self.l_serial.baudrate = 115200;, R' \8 p! e+ `: Z, G
  71.         self.l_serial.timeout = 2;  #秒2 o2 ]6 I2 M; n\" q% M& c0 |
  72.         self.l_serial.open();  ~0 h\" m. {1 h2 A, }4 w7 F
  73. ) ]/ K& w( o  y' G\" s
  74.         if self.l_serial.isOpen():6 q/ M( s% T6 Z% @
  75.             self.waitEnd = threading.Event();
    7 `& y8 q2 l1 L' p2 c# D
  76.             self.alive = True;
    / s9 `4 r0 P, f8 F& [2 t+ o
  77.             print 'open serial port %d ok!\n' %(self.port+1)5 [1 @2 @0 }+ B! W8 U
  78.             print 'baudrate:115200 \n'
    & k, @/ v% a0 ]# B
  79.             self.thread_read = None;
      j- @& K& C' g) }7 g
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    - ~# R( g. r& n' r1 K
  81.             self.thread_read.setDaemon(1);; E4 w1 H* `* p, V5 i
  82.             self.thread_read.start();
    3 v& {4 B$ {! g& `* t- u
  83. ) m5 w6 H/ K( Q: j4 v9 y+ g
  84.             self.thread_write = None;% f& S/ K7 G1 X2 A\" o- r; @& l
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    % n( d( y2 R. o. V, g* |
  86.             self.thread_write.setDaemon(1);6 R( J+ p  o' d( q  o
  87.             self.thread_write.start();
    . d, j* ?7 _3 D3 Z1 Z: w, `) |& G
  88. ! H2 G/ p8 W! W+ A5 {  K
  89.             #TCP部分
    ( w. T& Z% A4 T; J& Q# L$ l
  90.             self.thread_TcpClient = None;, T1 Z. K6 I. S2 Y9 N
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);2 H' F# T0 |' M6 B0 ]
  92.             self.thread_TcpClient.setDaemon(1);6 O* K6 T8 {& k5 T4 }3 y
  93.             self.thread_TcpClient.start();
    9 r; G3 ~' n8 M9 X* A( l. A8 U( U
  94. - g) q+ j8 |3 \$ s8 }$ x: d
  95.             self.thread_TcpSend = None;
    ( G5 Q! u/ W$ ^4 }! X; E$ G
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);5 S! W2 x/ m$ Y
  97.             self.thread_TcpSend.setDaemon(1);* K/ F% Z0 u( v
  98.             self.thread_TcpSend.start();) ?% J\" _4 ?; C4 n. k

  99. + y5 h0 p# u8 b- Q
  100.             return True;
    , }( t# N/ f  C5 w
  101.         else:
    , o6 ]8 X6 |$ K% F4 _3 d$ [- O
  102.             return False;: J& q; Y5 I2 D- f

  103. ) w' H# E; k2 s7 s$ _- l- V9 Q
  104. - N$ W\" c+ X9 A0 P2 R# z2 h
  105.     def FirstReader(self):. W: p( v4 @2 S+ |
  106.         while self.alive:. H3 t% \; Y) ^: M& X; u4 X
  107.             # 接收间隔% \3 j4 [0 u0 z7 o
  108.             time.sleep(0.1);: z) B0 V\" J6 g\" {+ ~# @% l7 \* z: S. H
  109.             try:
    , k  m: v! U. J7 R# g* d1 Y
  110.                 data = '';
    ' w$ H: X7 @& I2 i+ _9 X
  111.                 n = self.l_serial.inWaiting();
    ; h% F7 c2 N: L; T1 h# y
  112.                 if n:+ ^! {( b5 [4 T. Q
  113.                     data = data+self.l_serial.read(n);
    7 I  R5 O' v# y: V
  114.                     #for l in xrange(len(data)):
    9 Q/ Q4 e5 J% n\" y4 x& Z7 |+ p4 K1 ~$ \
  115.                         #print '%02X' % ord(data[l]),
    4 Y  h1 A. y* |- E
  116.                     # 发送数据9 |# u/ O0 X+ M, Q3 t
  117.                     print u'->请求:'
    $ A, I# h* ?& {$ C# h
  118.                     print data;& P8 H7 Q5 Q8 Y6 g6 F
  119.                     mylock.acquire()
    8 W% F( E6 V) {, D/ _6 F
  120.                     self.snddata = data
    \" M8 s, g( P, x+ e& n7 C. P
  121.                     mylock.release(), y& Q7 F0 X+ I. \
  122.                     #print_hex(data);* D9 j7 |# u\" Q9 S: \# t
  123.                 6 L+ }0 j+ b9 G5 N3 a+ [* y
  124.                     
    * a9 m) \9 M5 A/ q6 ?! P8 j
  125.                 # 判断结束# B% r# H, F2 t, P' v
  126.                
    6 B& B\" i. W: K& @- R! `
  127.             except Exception, ex:; A9 N8 V8 `2 j' u
  128.                 print str(ex);. t+ Y# e( U\" p) r; P2 p8 c
  129. 6 c' w; c. z* t- Q1 _+ t2 h
  130.         self.waitEnd.set();
    - Z: Q3 E& |& L. z
  131.         self.alive = False;
    . S/ d/ b3 K2 E: k+ b+ _
  132. & L+ [* n\" T6 \7 ?
  133.     def FirstWriter(self):: f. _\" V# Q$ S# u  O3 A
  134.         while self.alive:
    % n' e5 _# h- j
  135.             # 接收间隔
    * ]\" h2 a2 @& @# b+ f# f
  136.             time.sleep(0.1);# l; p5 p0 g! g- D
  137.             try:. r/ l4 z) g6 |, j2 S. J1 z
  138.                 #snddata = raw_input('\nenter data send:\n')
    5 g) X; t; d5 o1 u& P, g$ d
  139.                 if self.rcvdata!='':
    1 k$ t  {2 |6 B9 h' f
  140.                     self.l_serial.write(self.rcvdata);
    # H4 t, `; a1 [/ ^0 H5 R+ j
  141.                     print u'-<应答:'
    - ]; u5 ?% w2 [! I
  142.                     print self.rcvdata;7 U  j9 L7 |8 r: J
  143.                     mylock.acquire() 9 A4 h. }0 h& N9 B
  144.                     self.rcvdata = '';
    $ e6 u/ y- t4 a- z) Q: v
  145.                     mylock.release()2 _& \9 N  p0 e  `3 }4 S: f6 |6 Y9 E
  146.                 #print_hex(snddata);
    6 K6 ?% u7 G/ U, c) a5 ~/ X9 b8 A
  147.                 , i% `  I. N, i+ p7 e4 ^+ d
  148.             except Exception, ex:& T- M* @+ m* w, b' C
  149.                 print str(ex);
    ; w! W$ O  T, @- s\" [\" R
  150.         self.waitEnd.set();1 {- \6 x1 H  @
  151.         self.alive = False;
    , Y) |8 _0 r3 q! t\" z

  152. 8 @  j( X' o# z6 f( ]( }+ ]2 E
  153.     def TcpClient(self):
    , @# }) e/ z  ~+ K
  154.         while True:
    # C1 `4 J' M7 ]+ ~/ R$ U) ]
  155.             # 接收间隔8 _9 U  ~) J3 t# a\" T( r9 w
  156.             time.sleep(0.1);$ ^4 D/ O  `) C' k6 u9 r! y
  157.             self.connection = socket(AF_INET, SOCK_STREAM);) F2 ?' v+ T4 ~* _! y  M
  158.             self.connection.connect((Server_IP, int(Server_Port)));9 L, M$ l9 ?& ?( S! y
  159.             print 'Connect to Server OK!';
    6 ?- W: O0 e9 x$ O
  160.             self.snddata = ''0 n+ @$ ]0 @0 U' ~2 h! x
  161.             self.rcvdata = ''1 |5 M6 Z9 H  `  q\" H6 X* J
  162.             while True:4 W5 f; a! C' D\" s* s! D8 ?3 A
  163.             #读取客户端套接字的下一行5 [5 X+ g0 f3 n) y
  164.             data = self.connection.recv(1024)
    % s( ?+ y5 z2 B' v\" t
  165.             #如果没有数量的话,那么跳出循环
    0 f; f5 L3 ~8 I5 r& E; g) N* s
  166.             if not data: break0 O4 J# w2 I: X6 B' p9 ~
  167.             #发送一个回复至客户端/ \: t0 L; d* g6 d! ]/ C6 ^
  168.             mylock.acquire()
    2 }! f& w$ o9 q& z& u
  169.             self.snddata = ''7 b! b0 G, |4 Y. ?2 F
  170.             self.rcvdata = data
    9 A/ W- e% I. Y
  171.             mylock.release()
    + U+ ^: G6 ^$ T+ p
  172.             #connection.send('Echo=>' + data)
    ; V) d( c* a/ P$ C& K
  173.             self.connection.close()
      F( X' w8 M6 q9 @
  174. / w4 U1 f0 p' f& I0 Z1 K; g
  175.         self.waitEnd.set();
    $ c& b# _4 x; H\" ]8 I/ s8 A
  176.         self.alive = False;8 i6 r, N; A5 {6 Y' Q
  177. 8 Q. U: x# ]3 @9 M
  178.     def TcpSend(self):
    # s4 t% \5 y4 |& p\" Q! \6 B. S
  179.         while True:
    # k4 G! l- o. f) T' c0 l- Z
  180.             # 接收间隔$ H8 j( P; X6 M2 X\" @
  181.             time.sleep(0.1);+ x* W/ q5 v5 n. N
  182.             while True:
    9 T5 f6 K' p* q( M% R% s2 C
  183.               time.sleep(0.1);, Z) x4 ?% X* I8 F+ q
  184.               try:
    ' R+ Y* [' h2 Z4 Y) U3 l
  185.                 if not self.connection is None:
    : L+ }( s% p1 d
  186.                   if self.snddata != '':2 o0 c7 k' o; [
  187.                     self.connection.send(self.snddata)5 v( `) J) V- R6 J1 G+ W
  188.                     mylock.acquire()
    1 D1 W$ R3 u: a
  189.                     self.rcvdata = ''
    6 i/ O4 J$ L. w, B: I
  190.                     self.snddata = ''9 E) w& r0 I\" x7 B) G: |  m
  191.                     mylock.release()
    # S; t) B6 C. f, d. u* \) g# F
  192.               except Exception, ex:
    ) z* @. x7 ?# s# \; g- y- G
  193.             pass        2 f6 j$ m9 l; \( Z: e- W
  194.     def stop(self):8 N+ ]) U- m4 m
  195.         self.alive = False;
    # \) r! U9 \, w# m
  196.         self.thread_read.join();5 [2 u5 o7 t4 F9 I
  197.         if self.l_serial.isOpen():\" r+ E\" M9 [! ]
  198.             self.l_serial.close();: R$ F\" ~3 p4 p
  199. * u3 {7 d; u$ R2 Z, o0 ~
  200. 9 W# D( o& O0 X4 C0 W3 T
  201. ) w+ n\" O5 B$ T0 K  @\" c
  202. #测试用部分7 ], d1 `  A; u5 m, v1 A4 s5 {
  203. if __name__ == '__main__':
    ' ]+ v' i! Y0 t% x5 f4 j# \
  204.     print 'Serial to Tcp Tool 1.00\n' 3 z) s+ D, [( A: @, r3 V: j, B0 U
  205.     print 'Author:yangyongzhen\n'
    4 ]! L, k% S; t2 Q! U9 g& v5 w
  206.     print 'QQ:534117529\n'4 Q& o. f( `- s# }2 q\" J! e
  207.     print 'Copyright (c) **cap 2015-2016.\n'- K3 b6 I* E5 g
  208. 2 j& b, O- ?, u, `
  209.     Server_IP = raw_input('please enter ServerIP:')8 l4 e/ `& L- B4 w% O( A/ t5 g
  210.     print 'Server_IP: %s' %(Server_IP)
    $ w$ t3 f+ t* G* n
  211.     Server_Port = raw_input('please enter ServerPort:')
    + {9 @2 l6 D9 z5 L5 V2 A: U1 M
  212.     print 'Server_Port: %s' %(Server_Port)- F1 @- c8 n/ g# D( D5 y, h& ~+ O9 o
  213.     com =raw_input('please enter com port(1-9):')
    ! w& `# e  F$ Y: r8 h. F8 J
  214.     rt = ComThread(int(com)-1);) p4 t& Z! k; K7 `/ h/ ]' O) D
  215.     try:& L5 A1 F% d$ x7 X
  216.         if rt.start():
    ! C\" w9 l. w; \# |3 I$ \
  217.             rt.waiting();
    ! M\" i( D4 [  z1 h3 V+ x$ U
  218.             rt.stop();
    : D/ e' S6 h9 s% q1 a9 S
  219.         else:
    4 o4 J, }% ]7 ~* P
  220.             pass;            3 ~7 ~\" `\" K& ]8 o7 z
  221.     except Exception,se:
    + U  ^8 G: \; r
  222.         print str(se);( g4 d8 Q, o7 Y7 a/ {

  223. ! X4 {6 X4 k' P  q
  224.     if rt.alive:4 a- g$ \: ~6 z/ c  a
  225.         rt.stop();
    6 d) P) w/ q) {* Q5 A/ d
  226.     os.system("pause"). L/ V: @' @) `. w7 {
  227.   S9 A8 {\" @) E2 t
  228.     print '';( Z7 {  e. {6 `
  229.     print 'End OK .';
    # S* {. C0 {; h1 U6 r) Y: y5 y
  230.     del rt;
复制代码

* Z. e5 ]( R% h) m% C0 A4 q
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, 2025-8-20 05:04 , Processed in 2.312017 second(s), 50 queries .

回顶部