QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-86 K* o* l( V2 M8 G
  2. 8 n\" M0 t\" p9 L
  3. 1 W: I\" n* `2 x
  4. import sys,threading,time;7 t# ^% r$ ~* C\" P
  5. import serial;9 g; @1 l0 m4 q\" C4 B. E
  6. import binascii,encodings;\" C' F1 ]* ~7 L) x
  7. import re;: r5 \( j' C7 J
  8. import os;: U1 v$ L3 |/ s. b
  9. from socket import *! Q' ^' ~$ g& n7 Q7 _- a
  10. from struct import *;
    $ f) L: F\" K8 J\" J5 u) _\" B
  11. #from myutil import *;
    ) U0 g& D7 m, g
  12. #name: myutil.py
    ) j# g. u  q, ~

  13. 5 @\" D+ Y$ H; H, m
  14. mylock = threading.RLock()
    2 Z3 p! e+ k8 ?* N& a$ @9 u* j) l
  15. 5 O; H' ~0 c\" ?8 `# u
  16. Server_IP = ''
    7 w5 p$ B2 a$ R9 M) y2 ]8 L# P
  17. Srever_Port = ''
    0 \4 J, Y1 Y- X/ z
  18. ! f8 a1 D: P9 m. s. R0 W$ R( F7 C
  19. def print_hex1(s,prev='0x'):! s% d  q- @+ m$ ?& Z( H
  20.     for c in s:
    \" }, `( t. n- X2 p) T
  21.         print '%s%02x' %(prev,ord(c)),
      U) Q8 `% ?/ J, w
  22.     print# ]5 U: F( v: t, f+ V2 `
  23. def print_hex(s):
    4 q( G# M* M# F
  24.     for c in s:
    \" B9 W; s- u\" ~- o- i
  25.       print '%02x' %(ord(c)),
    & ?1 _' N7 d- v. N; Z1 d# g
  26.     print; w  Z$ B3 q' q& h; Q5 E9 w7 G
  27. 6 ~6 F, o1 s9 G( N: O
  28. def hexto_str(s):* M, g: U# ~7 c9 h
  29.   r =''
    \" R: p; K6 _7 M
  30.   for c in s:
    ! Q  B2 C  {3 T
  31.     r += '%02x' %(ord(c))/ W! U8 W* G+ d
  32.   return r5 ~8 N3 E1 M* `& d
  33. def strto_hex(s):
    & W9 w7 k' n\" M3 ~% @
  34.   r = s.decode('hex')
    0 u7 J* ~: o2 a8 B# O
  35.   return r
    5 I\" s& s) J# r5 j# z5 d
  36. #''代表服务器为localhost
      V# }& G8 ^0 G. f1 _: Y

  37. & i2 D4 Y; \4 o5 X! h* ]7 y# _
  38. #在一个非保留端口号上进行监听, U- ~8 I\" l7 |' ^  k, b# Z$ v  I

  39. , H7 R8 i' ^3 g6 e

  40. . _9 T$ t7 `5 M  f  U( V
  41. class ComThread:6 e: p! F, D9 p- x
  42.     def __init__(self, Port=0):* ]; ^- O, D! a- a; Z7 G\" }
  43.         self.l_serial = None;8 i7 _+ x- h4 V( U# G* ?# R/ y
  44.         self.alive = False;- S) N# J: y5 n% V. y& Q
  45.         self.waitEnd = None;
    % E, ?8 j* [) O$ `  G
  46.         self.port = Port;
    $ e$ h# H5 _; m7 A* I' b

  47. : d( C) C. m+ P, g1 @
  48.         #TCP部分
    & h3 r7 e# n! W$ r. R( s2 |: j( I
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    + ?6 n3 Z* f% ~( {1 t2 R
  50.         self.connection = None. _: w9 X\" H( y+ ?7 l
  51.         #数据
    5 y4 r- C/ E+ e
  52.         self.snddata = ''9 y1 N3 {4 P: k) g  {% O9 v* p8 q
  53.         self.rcvdata = ''4 `% z) ~\" u$ Y. C$ n

  54. # O% }% ]( ?; l
  55.     def waiting(self):
    , m) f3 J0 h  [* R
  56.         if not self.waitEnd is None:  B- n: ?3 q$ c
  57.             self.waitEnd.wait();
    . i/ w* z; d- R+ T9 R# u# A9 t6 n

  58. 5 V+ K, A( U1 o* T. S& n2 P  ?% Y/ b
  59. \" T% \, a  q8 _( Y( G
  60.     def SetStopEvent(self):\" x  f1 v' O( C& y: L9 s\" Q( d+ c- w
  61.         if not self.waitEnd is None:3 u& X7 f( C\" G5 P
  62.             self.waitEnd.set();& I8 O! `% _2 O& j
  63.         self.alive = False;
    4 @) u( e\" G  x# Y
  64.         self.stop();
    5 c\" n5 K4 z, T3 t
  65. , F. Z: Z: E+ u\" z0 r

  66. 0 u2 [! w3 e8 J4 n2 ~8 {
  67.     def start(self):
    4 V4 ]7 ?% Z8 ^3 y$ [
  68.         self.l_serial = serial.Serial();+ r0 K7 K0 G0 L0 Y! g: ]& |
  69.         self.l_serial.port = self.port;2 g: r9 g6 Q  E% a1 V7 o0 j
  70.         self.l_serial.baudrate = 115200;
    8 I5 p6 l/ O, E6 k8 H
  71.         self.l_serial.timeout = 2;  #秒\" \( @$ |4 L- U8 b1 k, C* t
  72.         self.l_serial.open();
    5 R: Z1 l) \3 F/ p. ~
  73. * f& H) E, T8 r4 \# s6 q
  74.         if self.l_serial.isOpen():
    * O+ R+ N# J2 e6 V$ _
  75.             self.waitEnd = threading.Event();
    % z0 [* I2 [\" c! L7 O7 u( K
  76.             self.alive = True;$ J6 u  m  i2 i
  77.             print 'open serial port %d ok!\n' %(self.port+1)
    9 ~7 V. _$ p0 U( F# P
  78.             print 'baudrate:115200 \n'& I\" x& Z% O  U( N: z
  79.             self.thread_read = None;
    $ q# Y# k3 z; I4 ^9 e% C
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    & b9 r3 m\" U2 v, K$ ^! O
  81.             self.thread_read.setDaemon(1);
    % D) i, h. n+ ^0 l- m  i: _
  82.             self.thread_read.start();
    9 H5 D3 i) X3 Q; m
  83. 9 B, b$ l# X8 }- p\" [' w8 T( f
  84.             self.thread_write = None;! S! a5 k. D4 x/ B: I7 L# X8 _
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    + Q1 t7 h- Z1 [# {! \5 _. K
  86.             self.thread_write.setDaemon(1);
    * e9 H$ ?$ e* Q: ^\" G
  87.             self.thread_write.start();# g! ^4 v& X0 `3 w3 S: J
  88. 1 x4 H8 p8 {! S( K
  89.             #TCP部分/ e; T2 `% Z0 y) F& F
  90.             self.thread_TcpClient = None;
    1 Q9 A* o5 o& e
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);$ Y7 c# a, n, |' Q- h
  92.             self.thread_TcpClient.setDaemon(1);2 G6 n\" _! F9 c7 I
  93.             self.thread_TcpClient.start();
    1 |( _( R  g0 F1 I7 E

  94. \" D# \5 }\" h' h, I2 W) j
  95.             self.thread_TcpSend = None;
    7 @9 \1 V1 W0 E% s3 k
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);8 ]* P\" t& O0 t. z
  97.             self.thread_TcpSend.setDaemon(1);2 I0 j( q\" l' \, G0 t/ q  F4 o( K
  98.             self.thread_TcpSend.start();
    4 z! D9 `$ l  \! g0 A\" D9 \
  99. 3 E* G: @6 r2 P8 R* ]# Y
  100.             return True;1 ?  M2 o/ O6 W- A
  101.         else:/ @% D  i$ n' _: q: \
  102.             return False;
    # C$ r# l: ^( B$ h
  103. ' R) M6 O( O: g+ O% f
  104. 2 w+ Q* ], k/ h  y' ^2 Q4 F
  105.     def FirstReader(self):
    ) p/ T. y; `8 s* z% j# V
  106.         while self.alive:
    . V; t  W' l- Z2 G
  107.             # 接收间隔4 t0 b- D$ E$ H0 Y9 n
  108.             time.sleep(0.1);
    - T( H! B\" G# q
  109.             try:
    - @6 y$ F6 B# V7 Z0 X
  110.                 data = '';
    ( C, V3 d) ^/ i% ]( w# H) ]
  111.                 n = self.l_serial.inWaiting();
      H9 W5 D7 O0 h: v! L
  112.                 if n:
    * Q: ~! Z9 g0 d% o
  113.                     data = data+self.l_serial.read(n);
    \" B% }+ o3 b3 E\" Y$ j
  114.                     #for l in xrange(len(data)):$ L  H$ j+ l* A% [
  115.                         #print '%02X' % ord(data[l]),  a9 v- [2 i8 [) _9 f
  116.                     # 发送数据
    ! `+ S4 ]5 H' E/ d6 @
  117.                     print u'->请求:'
    7 b2 v. h. W* R\" P7 x& S) K
  118.                     print data;' ]\" _* J4 N3 F# F\" C# E
  119.                     mylock.acquire()
    % l! Q- G& |6 y+ V
  120.                     self.snddata = data
    6 E\" _; w! e8 |! @* @
  121.                     mylock.release()
    - b( P( g# ?1 O6 r7 N
  122.                     #print_hex(data);
    ( }\" e4 L; L& x\" ?' w) W
  123.                 & L5 U2 K7 x  W
  124.                     9 b  c; t$ e9 B& `! p\" J. n
  125.                 # 判断结束
    # \% ~. G6 f\" T- Y
  126.                $ r' K8 x6 u: K5 X, _
  127.             except Exception, ex:
    8 C3 Z! M2 @6 |( t  z1 C% @
  128.                 print str(ex);
    2 ]/ w  I1 [# n2 R& k2 K

  129. 3 D0 J! O8 G/ L. k. p; }7 Y! p
  130.         self.waitEnd.set();
    4 m. x. V) y, R4 f$ \$ J
  131.         self.alive = False;) I9 g( n/ z* J' s

  132. : n9 N# J! q) J. w\" S1 I) W
  133.     def FirstWriter(self):
    : P4 Z; j7 R) w7 H% m
  134.         while self.alive:4 _, n9 h% ^! y+ D* H1 |
  135.             # 接收间隔
    0 n7 ~! w0 _* G4 Q
  136.             time.sleep(0.1);! s0 ^: ~) m/ Y6 n
  137.             try:2 x9 C% g+ h$ Z# c6 _
  138.                 #snddata = raw_input('\nenter data send:\n')
    8 |% F4 T, P0 W  u0 x; w: G( v
  139.                 if self.rcvdata!='':  G\" F1 s9 {: |2 W/ [
  140.                     self.l_serial.write(self.rcvdata); \" ~6 B* W( d& b# N7 z
  141.                     print u'-<应答:'+ U  K. P, H7 q( {8 y- |* j
  142.                     print self.rcvdata;6 |; {# p. ^  `; s8 m! c
  143.                     mylock.acquire() 5 s6 @9 P# Q& `9 A
  144.                     self.rcvdata = '';
    1 T- @: \( F/ E/ P1 R
  145.                     mylock.release()
    ; N9 B' b0 _# I$ P  k
  146.                 #print_hex(snddata);
    * M. j* [9 ~4 @; i( |' B
  147.                 / }( G2 z5 g7 N2 }: W
  148.             except Exception, ex:- [& ?' [) j* r# c1 p- v\" e
  149.                 print str(ex);
    5 Z7 Y- X+ ]$ E, g
  150.         self.waitEnd.set();) R( m7 A+ |8 o/ d& f% k
  151.         self.alive = False;
    6 q! |8 W  `4 n' ?5 p2 @; m2 l

  152. . y2 Q. D0 U$ k
  153.     def TcpClient(self):9 I. @3 V0 q5 q
  154.         while True:) C5 P+ D4 B  }. M
  155.             # 接收间隔6 K/ h* ^' g, N% k% u2 X  k
  156.             time.sleep(0.1);
    % o. M- f# Y  \\" p
  157.             self.connection = socket(AF_INET, SOCK_STREAM);2 @- r! a+ _2 ]8 T% x
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    ; ~  _% C; x9 T$ _1 p
  159.             print 'Connect to Server OK!';0 h: T% @# y. N0 w; i9 \
  160.             self.snddata = ''( U+ P$ k( t& C) E
  161.             self.rcvdata = ''$ U, I\" F/ R0 U7 ]( b4 m
  162.             while True:7 ?$ t( J2 A/ M; e
  163.             #读取客户端套接字的下一行
    8 {. G' u/ ~8 f, {+ A* z# w3 o* |
  164.             data = self.connection.recv(1024)
    $ H8 t6 l( q\" {\" \; K0 m, n
  165.             #如果没有数量的话,那么跳出循环
    ) ]- D2 b4 H* `) l# ^
  166.             if not data: break5 @2 G/ I! b% S1 u1 z
  167.             #发送一个回复至客户端
    $ s* Y, U' V& C# {; h1 Z9 c( |2 M
  168.             mylock.acquire() $ |0 u  Z6 h$ h6 S$ z; e6 H4 ^
  169.             self.snddata = ''4 W6 r& i1 w/ b& R, A! K
  170.             self.rcvdata = data
    ) @  B( q/ S! Y' s( w% U
  171.             mylock.release()6 E) S8 \, U' ^  l8 [5 X
  172.             #connection.send('Echo=>' + data)2 Q+ J7 B$ k  X$ S8 P( p
  173.             self.connection.close()
    0 c# }$ f$ ?1 q% g* r\" R
  174. ' w' {9 t. X6 b. ~4 E$ l
  175.         self.waitEnd.set();7 U8 {3 l& d' m# a4 m, ]
  176.         self.alive = False;$ x/ |0 A& Y0 ~3 `0 G* L7 v8 T; v
  177. . P; {) x) F- Q: E) A
  178.     def TcpSend(self):
    , C6 ?0 k  ?4 [
  179.         while True:
    & m9 v( P\" U- _+ z
  180.             # 接收间隔
    + ?7 ?0 i: d; b$ V+ @! h: E
  181.             time.sleep(0.1);
    8 X4 |5 b& ~2 W3 ?5 [7 M4 m: G
  182.             while True:
    . Y2 E: c\" M0 {. S
  183.               time.sleep(0.1);6 z( ^. t* I3 e
  184.               try:
    8 [4 w- T3 ^7 {( t: _
  185.                 if not self.connection is None:- D. {. W+ `& e7 Y9 c' q
  186.                   if self.snddata != '':4 @& d1 q2 O+ e6 X+ a
  187.                     self.connection.send(self.snddata)  x$ R  U1 N$ t$ [$ U
  188.                     mylock.acquire()
    ! a7 z% m% i5 g$ g0 ^
  189.                     self.rcvdata = ''
    & d: A, i& }' V% ~: m
  190.                     self.snddata = ''
    3 g. A/ ^( G2 m7 n( q
  191.                     mylock.release()
      P0 j$ e1 C0 O; ]1 L
  192.               except Exception, ex:
      ^3 M, r3 Q0 c) B& X& z2 Z7 B3 k
  193.             pass        ' H5 r! b) o2 U
  194.     def stop(self):0 e  r- m- K7 X! k( W( i
  195.         self.alive = False;; ~, v  D) Y3 Q& i* Y/ T2 d7 t* d
  196.         self.thread_read.join();
    ( v. @5 \$ H/ |/ _
  197.         if self.l_serial.isOpen():% P( {+ u  U- [; w& r\" q  ~; J
  198.             self.l_serial.close();
    6 v+ z8 `1 ]/ ^: A/ \; s. A
  199. ' K5 q0 D3 }# a3 D( {

  200. 0 Q9 r, @6 K5 F

  201. / i7 b. e' I2 {! `7 }4 g) X0 N* C. A
  202. #测试用部分& \' J1 X5 c: E' o7 g
  203. if __name__ == '__main__':: o8 x3 M% u2 Y2 z8 W
  204.     print 'Serial to Tcp Tool 1.00\n' $ p+ W2 _/ l2 w8 v6 b
  205.     print 'Author:yangyongzhen\n'
    & N8 }- k6 F  m5 x
  206.     print 'QQ:534117529\n'
    + N2 R0 o% Z5 }4 q6 g; ?+ ]
  207.     print 'Copyright (c) **cap 2015-2016.\n'9 q  [' A( w& G& r

  208. , r& a) c& @\" N, h! I6 D- y
  209.     Server_IP = raw_input('please enter ServerIP:'): W& l% _- n- m! Z, {
  210.     print 'Server_IP: %s' %(Server_IP)
    - r; {5 X6 Z: T% i5 Y
  211.     Server_Port = raw_input('please enter ServerPort:')8 P. d7 S% R# b- N$ E% T
  212.     print 'Server_Port: %s' %(Server_Port)- H5 w; ]\" ]2 W& G
  213.     com =raw_input('please enter com port(1-9):')
    ) U7 W! i' M9 X, r/ f4 e
  214.     rt = ComThread(int(com)-1);
    ; g$ p. p  ]* l5 x
  215.     try:1 h\" y. P5 a! u5 n
  216.         if rt.start():' X- I- S% P7 t- X' `
  217.             rt.waiting();- V5 n; A9 B  K
  218.             rt.stop();1 [: @\" }/ I8 T2 e
  219.         else:
    * Y7 ]- Q% W7 Z1 }, \5 i
  220.             pass;            0 S0 i7 T$ C\" D; C
  221.     except Exception,se:
    * M8 t, }2 m; C8 @' k% S
  222.         print str(se);% B/ a% a2 X$ N9 T$ m

  223. $ [, v; i) L( ~. O6 m5 z
  224.     if rt.alive:
    8 z2 n9 u. K. M1 F5 }; a
  225.         rt.stop();) R% c. {* p9 [) f: T9 F3 o
  226.     os.system("pause")8 L\" o+ ^0 w7 J6 g& e

  227. \" `7 }% A! \) J* K/ T+ D& `' h
  228.     print '';
    ; d& f( a) O( m* Z
  229.     print 'End OK .';
    . k7 ^5 y6 h/ ^, O\" K
  230.     del rt;
复制代码
6 r& T- }( L- E/ V
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-18 08:25 , Processed in 0.421299 second(s), 50 queries .

回顶部