QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    \" J- L0 L, \# Q& \: F

  2. % ?7 L' \\" i$ J5 G0 ]0 Q. q

  3. 1 k! ~+ c2 w. P& _& t1 @
  4. import sys,threading,time;
    * N, o) E8 W2 P( o: z; ~
  5. import serial;
    ; Z5 k8 G* D( F& F\" S
  6. import binascii,encodings;
    ; y1 ~( Q& g8 U\" U; T1 e/ R9 G0 v
  7. import re;
    * T; }! B% n, Y
  8. import os;
    : A, z# ~: ]. u  V\" s2 A7 }& v
  9. from socket import *, C8 F! n6 [' P7 O6 w9 {
  10. from struct import *;
    % ]  i* m' |; {4 Y, t# S
  11. #from myutil import *;9 }  M7 d; y5 y; o; y3 E2 _& e2 _
  12. #name: myutil.py
    7 f+ J8 S; Y3 t* n$ |
  13. 1 a; I  F3 v0 v  d& W) Y- d
  14. mylock = threading.RLock() 1 Q; i  W/ W7 ~6 i\" P. ^& Z) P

  15. ' K4 K  j$ R3 Z' x8 [! }
  16. Server_IP = ''
    + R0 Z\" e! B  y  b; p  N9 ~  O9 f
  17. Srever_Port = ''4 S' V0 C% Z) ^; {$ Z: G1 B
  18. 2 y# A7 H+ H/ u* H
  19. def print_hex1(s,prev='0x'):, V9 ^1 I* d( Z! D* o5 ^
  20.     for c in s:7 B  X; @4 e& @# `3 k# O
  21.         print '%s%02x' %(prev,ord(c)),
    9 c' P2 y! U& B
  22.     print9 q\" s  Y$ v' h, p3 v* ]' K
  23. def print_hex(s):  {$ V/ q7 c9 w: x9 h
  24.     for c in s:
    & x$ ]# c0 m( W7 ]7 q6 ]  I\" S4 |
  25.       print '%02x' %(ord(c)),
    * h& S, ?1 P! t( W, i/ h: @. a: a
  26.     print
    ) P2 H+ w- f; `/ |\" H

  27. ' i' U# S$ z/ M3 Y
  28. def hexto_str(s):
    # K\" N\" q3 q1 x! x7 ~/ m4 X
  29.   r =''
    . I+ ~/ c& w+ m) b1 w! m
  30.   for c in s:
    1 g& q! e' H3 [& s9 @2 Q
  31.     r += '%02x' %(ord(c))/ L0 h4 V! H5 I\" ~+ O) I
  32.   return r
    + D0 x7 f3 ?& ~
  33. def strto_hex(s):. o5 I5 E- b* f7 h
  34.   r = s.decode('hex')
    \" ~! U( y* y/ L; l) C5 A3 }3 Q) X
  35.   return r7 L# h; R3 `/ X4 N' V- O3 q* g
  36. #''代表服务器为localhost
    4 w+ i: {) ]% K# F/ ]
  37. 0 O# ~% Q3 n6 N8 l  `& S! n$ Y
  38. #在一个非保留端口号上进行监听  E* B7 \+ b; y1 _9 U/ c
  39. # O8 f) J# \( r# W7 W6 a# V1 ~
  40. ( r9 ~% Z  o& |5 _\" v) {4 W5 W
  41. class ComThread:, l8 m& z* f' D. M
  42.     def __init__(self, Port=0):) `$ r% ^: U# t* o. B1 T7 n: J
  43.         self.l_serial = None;
    * q1 S) {9 Y, Q: N* E
  44.         self.alive = False;
    # z. |1 k- a- V1 @$ N9 H# w6 o+ i! L
  45.         self.waitEnd = None;
    9 }. ^1 V) Y! M\" [  |
  46.         self.port = Port;3 m' s2 w( X9 X; S  a' V

  47. . j$ B! D- \7 R\" Z: N
  48.         #TCP部分. k2 G$ |; b# o( Z; o
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    $ h; F6 v* X: j: Z
  50.         self.connection = None
    ! Z\" E2 D9 X4 N! j3 a+ s0 s
  51.         #数据1 N: k  O+ h' Y% e7 X. ^
  52.         self.snddata = ''% F& x3 s7 e  n' R
  53.         self.rcvdata = ''' L# c) |/ T\" c$ V8 `: N0 w

  54. , }2 p+ @1 Q( a8 T3 S: r6 K
  55.     def waiting(self):
    \" s% V: s- ~; b$ I+ A' N
  56.         if not self.waitEnd is None:
    9 Q* P# U) Y% t4 u6 o. D3 E
  57.             self.waitEnd.wait();
    0 `2 N3 `+ E\" y, d: e$ v# e

  58. 5 G* |. L8 ^: B  M3 Z* S* X: M! f\" W# z
  59. 4 G. n! q% @7 f
  60.     def SetStopEvent(self):; [! P) s\" ~( ^1 A
  61.         if not self.waitEnd is None:7 u9 D2 {9 W. ^
  62.             self.waitEnd.set();
    & N* k! A0 x: s! A9 e$ g1 }
  63.         self.alive = False;
    ( u2 e' t& F* V6 b7 h
  64.         self.stop();
    7 x: G\" R+ `. [: |
  65. - L0 g) N- n# R$ G
  66. ' C0 p5 D/ K2 E3 E
  67.     def start(self):' l1 j6 W! E0 M* l
  68.         self.l_serial = serial.Serial();
    ! B( s8 V7 {6 I- U
  69.         self.l_serial.port = self.port;\" G7 F. ]* x7 y& J! Z, k0 I
  70.         self.l_serial.baudrate = 115200;: j: A% p/ H7 d6 x  @1 p
  71.         self.l_serial.timeout = 2;  #秒
    4 d5 n2 w. k( A+ b! ~8 G0 g
  72.         self.l_serial.open();
    3 Z3 @  J+ I. c8 V+ I
  73. % I8 C5 ~/ g, C5 z+ y+ O
  74.         if self.l_serial.isOpen():2 x: w/ i2 r9 J8 e( O* C+ d
  75.             self.waitEnd = threading.Event();, d\" h% Y% G9 m; P# W4 i9 P; ~
  76.             self.alive = True;
    4 B  ~% }4 s1 r* y\" n8 u* \8 g
  77.             print 'open serial port %d ok!\n' %(self.port+1)0 K+ G9 ~  j. R+ w
  78.             print 'baudrate:115200 \n'* L. \. H( _% }% e8 h2 B
  79.             self.thread_read = None;
    4 L\" O. i7 G$ b* S
  80.             self.thread_read = threading.Thread(target=self.FirstReader);+ P1 X2 b$ [6 ?
  81.             self.thread_read.setDaemon(1);
    \" ~5 ~8 s! g! w/ q
  82.             self.thread_read.start();
    & o2 A2 U% s2 u6 Y
  83. & [- f+ K8 i% Q  N- `5 N' ^
  84.             self.thread_write = None;; W2 ^; Q# T; p8 d
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    ! k; f, a* ]8 n# p. f
  86.             self.thread_write.setDaemon(1);3 |6 Q( s* X2 c( }1 A* M2 [
  87.             self.thread_write.start();
    9 }5 T' h\" G( e( b: T

  88. 6 Z8 h4 A) b: c) {# U
  89.             #TCP部分6 {0 e2 N  ~4 g, H5 P- h
  90.             self.thread_TcpClient = None;
    + [1 u; o+ s# b( T8 c3 |. ?\" K
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);
    : R4 k$ t5 m\" ~! R. s' y
  92.             self.thread_TcpClient.setDaemon(1);
    + R, ~$ J3 M; {
  93.             self.thread_TcpClient.start();! q3 Q  I* a: d  T! o! X2 m( T
  94. + {- \: e( K\" E6 l
  95.             self.thread_TcpSend = None;  x; \1 J4 _\" k
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);
    4 B  p/ }$ X3 k; c! ]% q) w4 z
  97.             self.thread_TcpSend.setDaemon(1);2 J- y9 o( B* l/ p
  98.             self.thread_TcpSend.start();
    * x% t' H1 e8 N0 v5 j

  99. ) n, e; E$ i3 D2 `
  100.             return True;9 u\" i7 i& Z# F9 \: n
  101.         else:# u6 r6 x: j* U& I, O( h
  102.             return False;9 G$ p7 I- L1 k0 v8 N

  103. ( z: p* M0 S9 @+ N/ I' ~- |
  104. * J# q3 Z6 @# z) K8 M. c9 k
  105.     def FirstReader(self):+ W) f0 h/ P+ p% o
  106.         while self.alive:: y7 {1 b7 l3 ]# x0 t0 T+ @9 D
  107.             # 接收间隔
    ( z; r9 c) H1 _
  108.             time.sleep(0.1);
    2 }. W5 m% G* R' ?6 A' A
  109.             try:# l& U# e$ P, X; U- v, c3 B
  110.                 data = '';. m  S0 u; C4 T2 T9 b
  111.                 n = self.l_serial.inWaiting();0 P. z( @, \8 p6 i8 z* V4 u' S
  112.                 if n:. a+ u\" F1 t; @3 {$ ~) k4 W
  113.                     data = data+self.l_serial.read(n);
    . j/ u1 m! [% F4 u
  114.                     #for l in xrange(len(data)):
    # n5 f- [; T\" @- I8 D
  115.                         #print '%02X' % ord(data[l]),  V& _6 h! k$ E5 A+ y$ K
  116.                     # 发送数据; a8 L: j: T; h3 h2 R
  117.                     print u'->请求:'5 n\" h& J0 f, X4 O# B# |
  118.                     print data;
    - ^- x1 A2 e$ a& U
  119.                     mylock.acquire()
    6 Y+ g3 M7 V6 X
  120.                     self.snddata = data# c, _+ c+ ]& C3 n% i
  121.                     mylock.release()
    5 U7 `/ c, [# O' R: @\" L2 M
  122.                     #print_hex(data);6 J. p8 |5 h4 J1 }5 w% i
  123.                
    0 N1 L1 K3 a  c% k2 l$ f
  124.                     7 Y\" Y\" \; U* q6 B5 w9 \& {. K' n\" T
  125.                 # 判断结束
    % l( \+ L; E1 ]3 E# W
  126.                
      h  {; J9 t% P# f: V  h0 T6 x% s
  127.             except Exception, ex:) ~9 j1 i- i! X' {\" b( H
  128.                 print str(ex);5 ]% y6 J' y. F$ A+ e0 n* b
  129. . {- w$ u0 h, c! l
  130.         self.waitEnd.set();9 A, @# y7 J- C# X
  131.         self.alive = False;
    \" |. p2 D( K0 I# O$ a

  132. 1 G: ]8 J( }\" F\" N/ g& f) c# i9 i
  133.     def FirstWriter(self):
    + E0 g5 o3 A  F& ?
  134.         while self.alive:
    3 ~# r8 R7 w& V  ]
  135.             # 接收间隔
    $ C' U! ?& G, N
  136.             time.sleep(0.1);0 M5 D: Z, i1 `7 d
  137.             try:; D! I& {% z& l) y/ s\" }% k/ t
  138.                 #snddata = raw_input('\nenter data send:\n')
    9 }- Y, W6 t3 m' b( l
  139.                 if self.rcvdata!='':
    ! y; ]3 C\" {/ y9 j. Q3 H
  140.                     self.l_serial.write(self.rcvdata); 7 f) }% x& I, N
  141.                     print u'-<应答:': n# s1 F2 [6 M, J2 v9 I
  142.                     print self.rcvdata;
    % r. _1 h5 {9 d9 H7 u) {- H  |& o
  143.                     mylock.acquire() 1 a( ~2 |6 x% I8 o
  144.                     self.rcvdata = '';. q& I9 c( y3 B% P
  145.                     mylock.release()' [  T, Q# L* n4 s7 u2 v
  146.                 #print_hex(snddata);
    \" ]; m+ R4 t\" v  @
  147.                 1 E0 u; b: u6 ]: {3 k3 P
  148.             except Exception, ex:
    \" ?. @; }+ F# h
  149.                 print str(ex);
    ! s  W: d+ }8 f/ V+ }
  150.         self.waitEnd.set();
    ; Y/ ~0 m2 K' J, ?; s
  151.         self.alive = False;
    : _# w& P0 _# L$ D1 O9 e2 }6 S2 ^  [
  152. / `: W2 h/ Z; E6 q# G/ w' [# h
  153.     def TcpClient(self):
    0 }4 j/ D' h: g3 `
  154.         while True:
    \" B( N2 a/ o/ B7 ]5 c$ y1 b
  155.             # 接收间隔
    # a6 Y1 v\" m; U\" B
  156.             time.sleep(0.1);: w9 }1 G: B- C
  157.             self.connection = socket(AF_INET, SOCK_STREAM);
    ' D. P2 M. o  r% i\" N1 T
  158.             self.connection.connect((Server_IP, int(Server_Port)));
      }7 T1 N. i& b* b# D) d5 k: d) M
  159.             print 'Connect to Server OK!';  ]; ?8 V- Y/ Q. @$ i2 `+ \
  160.             self.snddata = ''- I: ~% N- V6 c% b1 x0 b
  161.             self.rcvdata = ''
    2 h- \1 O1 N2 n$ ^( x) ~
  162.             while True:
    4 I- b, [& r* g# \, N* G/ t
  163.             #读取客户端套接字的下一行  Q( f/ }( A  \
  164.             data = self.connection.recv(1024)
      v5 M5 q2 d, j6 N7 h. Y
  165.             #如果没有数量的话,那么跳出循环
    0 K\" J. j( v, D7 k3 f
  166.             if not data: break
    0 a' \# \) R7 t$ ^& j9 M9 ]
  167.             #发送一个回复至客户端- y+ i; B6 e5 F: z1 P5 I  N
  168.             mylock.acquire() 6 d1 C- ]6 b9 H, [# p$ X2 _
  169.             self.snddata = ''
    / }7 p& K) r\" _: y2 G; B
  170.             self.rcvdata = data7 `\" e9 B) R5 {) k; p& m. c
  171.             mylock.release()3 w9 I2 n$ K\" N% H$ U' x! H5 k' `
  172.             #connection.send('Echo=>' + data)
    ; x% b$ y! r  Q
  173.             self.connection.close()( g* Y; U/ h6 p\" U4 ?% ^% u
  174. ( u1 S/ `; U$ S- V
  175.         self.waitEnd.set();( Q9 N' |6 s7 B. a
  176.         self.alive = False;
    + ^% x3 ]8 u7 i  C\" p\" \5 j

  177. 2 d2 E. u. D0 {/ z9 `7 _
  178.     def TcpSend(self):
      G$ C$ N8 [# `9 r/ F
  179.         while True:: W# r7 n: X' W' ?) [1 {# e
  180.             # 接收间隔$ I7 B6 q0 ~. b( o2 D: N) L1 F
  181.             time.sleep(0.1);
    & C* b( L4 ~* i8 y$ |
  182.             while True:' ^1 t. c6 Y' f3 l# k
  183.               time.sleep(0.1);
    ; m& z8 b8 V9 V5 v
  184.               try:
    3 x, d* N! k: k1 l
  185.                 if not self.connection is None:
    3 ]' }/ {1 e% W
  186.                   if self.snddata != '':
    / O. u# v$ q: l! T
  187.                     self.connection.send(self.snddata)' B$ |\" K1 p+ ^\" s/ O; F/ P# s/ p
  188.                     mylock.acquire() * ]1 T& g! ^& R# |& }
  189.                     self.rcvdata = ''
    2 X. n5 l2 e$ M: A6 D
  190.                     self.snddata = ''
    $ R. u. ~4 d5 @( f8 T+ p
  191.                     mylock.release(); N& V! m\" d/ o! e
  192.               except Exception, ex:
    7 G; B8 ?4 L( |, J% q5 K
  193.             pass        
    6 O9 {, \- F0 F) u  q! k
  194.     def stop(self):
    & N2 |4 R2 \/ @/ [
  195.         self.alive = False;
    / a\" d' Y* V5 ]/ d( j- D
  196.         self.thread_read.join();1 l6 n5 X+ \& H1 |+ u
  197.         if self.l_serial.isOpen():
    ) d( ^2 m$ h( R) U
  198.             self.l_serial.close();& z5 x3 t2 m/ |
  199. 5 h+ _, W$ T$ `* n& `

  200. . I\" H$ K% }/ o1 c

  201. ; V7 b7 D) N0 ]\" q
  202. #测试用部分- L5 M; q6 Y; t( i
  203. if __name__ == '__main__':
    : |& p: q5 l/ Z1 o
  204.     print 'Serial to Tcp Tool 1.00\n'
    ' t8 \+ U! A* Z
  205.     print 'Author:yangyongzhen\n'! h( b# Z' Y+ ~5 p2 p
  206.     print 'QQ:534117529\n'0 F0 ^1 S3 M1 Z8 e* x
  207.     print 'Copyright (c) **cap 2015-2016.\n'
      j- K- C8 y: K6 r3 X( z: D\" x
  208. % k. P0 |/ p. M2 E0 y
  209.     Server_IP = raw_input('please enter ServerIP:')
    : v, h# K5 i7 ~( a1 c- }( E8 @: s
  210.     print 'Server_IP: %s' %(Server_IP)
    / M4 l1 n) c4 W
  211.     Server_Port = raw_input('please enter ServerPort:')9 Z/ L# \( `* N1 f5 u% F5 `6 X
  212.     print 'Server_Port: %s' %(Server_Port). V9 e: W2 a; F  i
  213.     com =raw_input('please enter com port(1-9):')* R  v5 `- g# ^5 Q/ A& f
  214.     rt = ComThread(int(com)-1);
    \" z0 E$ Z\" K4 J5 ]+ S' v& v- D& y! R3 Y/ P
  215.     try:! J0 j\" }! i5 n5 I
  216.         if rt.start():
    ( q/ D. N' f2 S  {& U4 e- P& P
  217.             rt.waiting();
    \" F2 A/ t& D3 B( U
  218.             rt.stop();
    * ]2 _' X- N/ g/ i  X/ R
  219.         else:0 E5 J; D6 v, e\" T) B9 ^% ^
  220.             pass;            # r, f4 ~. G3 j7 e
  221.     except Exception,se:
    ( P6 B\" C4 r8 a% L1 e
  222.         print str(se);
    # F1 e* W' ^+ |
  223. ( S# u; O- s1 }) ]/ q1 i
  224.     if rt.alive:0 p' n2 n5 a) z. k! n
  225.         rt.stop();
    * R( t0 p6 q1 A: Q
  226.     os.system("pause")
    ) |( R. J! I$ ]( y, ~2 N4 D

  227. 7 v( Q  [+ B5 O5 V4 l1 h+ Y
  228.     print '';
    8 r# n+ j\" s- B; e/ M
  229.     print 'End OK .';0 P$ _  E; D2 l- a: }1 E
  230.     del rt;
复制代码
" b% J2 X& y- C3 f: U  l
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 11:13 , Processed in 0.423236 second(s), 51 queries .

回顶部