QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1175

主题

4

听众

2872

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    - ]; ~9 t! F/ X& E2 ]# Q

  2. ; P! B) T1 B& I. D, m. s

  3. & k% X& o\" v4 V8 h# i7 [) B
  4. import sys,threading,time;
    4 b* K% P6 C% [' j3 m' b
  5. import serial;
    + M\" v5 N1 P' }
  6. import binascii,encodings;
    8 E& O# K; a/ K9 {! X1 y
  7. import re;
    1 ]) h1 b\" S2 g, K$ [& a\" o' [. g( g. a
  8. import os;
    , q1 d, i' m/ P/ [) Q9 ^% N  J! G) }
  9. from socket import *8 ]9 `3 E9 x& _* ?
  10. from struct import *;
    9 U: h' Q! K: h% P
  11. #from myutil import *;) I! i) k/ ]9 l* Z7 X  @: d4 j0 B6 n
  12. #name: myutil.py
    # s3 c8 ~* W9 A

  13. 7 m9 o; o' `( m8 {8 J* {( G
  14. mylock = threading.RLock() # E; n$ f. [' w: i2 J8 y

  15.   c2 y  n- d6 K) p3 U
  16. Server_IP = ''9 g+ d/ U  q  M3 a
  17. Srever_Port = ''
    % M) l! p, ]' B& I( O\" n/ K

  18. ' ]1 V& I6 c. m) X' q1 v4 O
  19. def print_hex1(s,prev='0x'):
    ; m7 u* O  E# i9 O3 j! s7 B
  20.     for c in s:
    9 C; o0 o  G, c' q+ g
  21.         print '%s%02x' %(prev,ord(c)),$ r$ M, h, B# b2 A# x
  22.     print% B. U' ~\" o5 J$ A; d! T6 r7 f- P
  23. def print_hex(s):0 k( y3 M$ o% u$ _! c& _
  24.     for c in s:
    2 S* v; A; X: v
  25.       print '%02x' %(ord(c)),
    # \9 J0 b  e. l1 D: O) ~7 |' U! c
  26.     print# t6 i! R( C# i3 k% o8 X
  27. 7 k# p, {9 j$ n& V3 Y
  28. def hexto_str(s):3 x9 P; U, T* x\" E
  29.   r =''
    ) z% o1 C1 H9 e% E
  30.   for c in s:1 i% c  k\" N0 u
  31.     r += '%02x' %(ord(c)). m6 B8 s& \$ l9 k# p7 A8 A  [% K
  32.   return r
    ' Z! U+ }2 |, c3 `; W3 Q4 ]8 T$ Q- j
  33. def strto_hex(s):# C' o6 E9 y/ b. _  k: r( L3 E* l
  34.   r = s.decode('hex')% G) |, f% [\" [4 e% E  ?5 w8 R  \
  35.   return r
    1 W- l) Q3 D  Q. G5 U) i4 D
  36. #''代表服务器为localhost
    * ^0 R\" g: L1 s7 Q7 Q
  37. ( [6 u/ T\" D5 k  `, |' Q) o* m& e
  38. #在一个非保留端口号上进行监听- b, P8 y5 f9 }# h- r; q: V

  39. + K$ B/ Q& s/ n2 n9 w

  40. & }2 {2 |9 q; H$ O% t( I
  41. class ComThread:
    2 q: W! ?9 ~2 A( [
  42.     def __init__(self, Port=0):
    * l+ S3 [3 i7 W8 c# I3 a
  43.         self.l_serial = None;
    6 l7 i$ M: f2 i( r9 j( e
  44.         self.alive = False;
    ! Z; x2 i; R4 t: F; F, p! Y
  45.         self.waitEnd = None;
    ( P; [$ J* w; B\" g3 x
  46.         self.port = Port;7 [$ W! J: W+ T
  47. : }# j8 r9 D6 F9 d2 n
  48.         #TCP部分7 b  c4 _\" Z! F- E6 R2 }1 V# ?
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    & N2 C0 y  v, ^( e' q  k
  50.         self.connection = None
    2 l( N\" g( F% b9 e  h, D# W
  51.         #数据& x* U& D, M; y: N1 N# b
  52.         self.snddata = ''
    4 [2 x& d! J8 \; q
  53.         self.rcvdata = ''
    : J# I' ~! ]8 @' O; n

  54.   q! X; ]+ A6 r! S* B5 \
  55.     def waiting(self):+ v3 I( c0 E; Q3 B; j& t
  56.         if not self.waitEnd is None:4 k3 k) Q- G1 r1 j! ]
  57.             self.waitEnd.wait();% h- g/ [+ C6 x; P9 q. q' F# |
  58. . ^* P+ E; N, m1 q  ]7 E

  59. * c- O. L1 i. E1 t3 a, @
  60.     def SetStopEvent(self):1 Z9 m) |/ n) z/ J2 m\" j0 c% G
  61.         if not self.waitEnd is None:
    ( _9 U% f4 D( A) D
  62.             self.waitEnd.set();
      j\" S2 h+ e. F5 ~
  63.         self.alive = False;\" V, Y; D+ c$ n# a& U+ I# |- F
  64.         self.stop();
    $ Z. w- x$ \' @  l

  65. - u. E: N( T/ n: B8 \0 h- T4 k3 g

  66. 3 e6 F0 ?7 C9 @4 B
  67.     def start(self):
    % l2 v3 O8 k! b# u( m6 d; Q5 c  D
  68.         self.l_serial = serial.Serial();1 [& ~, [8 z/ `- f, w
  69.         self.l_serial.port = self.port;
    3 R: N; W7 l8 X6 ?
  70.         self.l_serial.baudrate = 115200;
    / C1 o6 D( W\" v, T* |
  71.         self.l_serial.timeout = 2;  #秒
    : _\" L7 l9 Q# t! ^0 X, }
  72.         self.l_serial.open();
    ) A, U  _% X) N/ L* Y. F7 L

  73. , B0 o\" ^% @9 p+ z
  74.         if self.l_serial.isOpen():' q# l( U5 y3 q9 Z
  75.             self.waitEnd = threading.Event();  F( l. z% m% F\" \. {7 T+ E- _% v
  76.             self.alive = True;
    4 t& X8 G5 x- w. y( n# Q+ o: b
  77.             print 'open serial port %d ok!\n' %(self.port+1)
    . \3 C( _. \9 b7 O2 \7 A: _5 W
  78.             print 'baudrate:115200 \n'1 f, v7 N: Z# n# b. Q  M! V
  79.             self.thread_read = None;
      M( C- n7 U- [& ^
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    5 ~# J3 H2 a/ ?8 z- |+ k1 w4 u
  81.             self.thread_read.setDaemon(1);
    * m7 ?: E3 `( a; c
  82.             self.thread_read.start();\" Z+ e  l/ d* f$ X& o, h
  83. 6 I% K5 P\" ?! @6 r9 g
  84.             self.thread_write = None;
    6 @\" O0 Y. r* W7 P* S
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);2 l, U6 \: C- B. @\" o0 L% I8 g' g
  86.             self.thread_write.setDaemon(1);
    ) k8 h8 K% A1 m- }2 {
  87.             self.thread_write.start();
    6 o# }. J2 r- v# X7 N8 U$ g' X\" i
  88. ! X1 U* i* G\" ]% j$ k
  89.             #TCP部分. L6 C- ^, \& V
  90.             self.thread_TcpClient = None;
    8 I8 r. g! H% S8 i+ C, h
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);
    4 `/ V* i! o# z3 x
  92.             self.thread_TcpClient.setDaemon(1);
    % _' O% G& i5 m
  93.             self.thread_TcpClient.start();
    , W1 y1 H0 q( B& g- ?* e
  94. 9 u/ X3 J+ i) N6 v# ?
  95.             self.thread_TcpSend = None;
    - v6 u  g4 u# \( ^! g8 m\" X4 C$ B
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);, C! ]+ e* H\" J8 _9 }# z0 C
  97.             self.thread_TcpSend.setDaemon(1);
    0 T5 ?- R- v0 f  K' L! i4 h
  98.             self.thread_TcpSend.start();
    \" e* X! D& S& H! r
  99. 7 Y: B% L) g6 d9 f* M
  100.             return True;/ o+ w  V0 J# q! {5 T6 m# V
  101.         else:: U# v8 j! x6 {5 a+ u, l
  102.             return False;) r7 B0 i3 c2 |! Q+ k% r: z

  103. 6 v/ V3 ]! K0 x8 M8 z- K) p3 a

  104.   _0 w/ t# u- d9 b$ Z+ _/ A
  105.     def FirstReader(self):
    & X2 M( E' e( v6 U
  106.         while self.alive:
    % e5 i6 S\" i+ [& I- \8 ]
  107.             # 接收间隔3 e) P) J3 Y0 B1 ^+ j$ G9 ]* J
  108.             time.sleep(0.1);
    7 ^* c' W. ]+ [( q3 |9 R7 M
  109.             try:
    ! N0 B! T8 ?% d6 k0 {( H
  110.                 data = '';4 T2 T- R# j& j$ ~3 T
  111.                 n = self.l_serial.inWaiting();3 T+ X6 l5 L# |: \9 o
  112.                 if n:\" I* u\" n) A5 R! D' P' n( u4 R
  113.                     data = data+self.l_serial.read(n);
    / v. K/ Y7 s0 p  Q
  114.                     #for l in xrange(len(data)):
    2 d- P; h/ N: a) ~
  115.                         #print '%02X' % ord(data[l]),
    / q+ |6 t* h+ N  {
  116.                     # 发送数据  T1 G- k# U# s; x* s, x6 r\" G/ ^
  117.                     print u'->请求:'( Y3 L) `9 L2 f/ s6 m
  118.                     print data;6 h1 p) {- t2 f/ s- D0 g1 R
  119.                     mylock.acquire()
    * J1 z9 I2 }& e4 \1 j) n
  120.                     self.snddata = data5 h  J' ~! t7 \% B& |/ I
  121.                     mylock.release()\" H- }+ K- j9 ?# f5 j- K5 |
  122.                     #print_hex(data);: `' f7 G& X0 v5 U
  123.                 1 f: t# N7 h\" \
  124.                     $ [$ u5 u0 D& _9 V1 ~\" j; Y
  125.                 # 判断结束
    ' \) E. S0 t2 B1 U6 Z
  126.                
    ' X3 f  J3 N& l5 ~: K3 [
  127.             except Exception, ex:
    . P- |, B+ t' i: Y* R2 k8 W
  128.                 print str(ex);) E& k+ a4 [5 k  u& H; q1 c+ l6 ]& h
  129. 8 ?9 _) q  g; A
  130.         self.waitEnd.set();
      A) W6 {8 T  z  x9 G7 B5 P, z
  131.         self.alive = False;. c' |+ G\" S* R. K4 A1 p
  132. & S9 s/ q+ b9 u$ X* M
  133.     def FirstWriter(self):5 q7 j# s3 b, q5 U
  134.         while self.alive:
    9 i6 ?; d3 q% q& O1 ^3 U! x
  135.             # 接收间隔4 H$ j: S; |5 j( m* `4 u
  136.             time.sleep(0.1);
    0 ~\" `1 |\" C. i0 _1 j7 U$ ]
  137.             try:$ M7 m& I$ o6 |5 i9 d8 G
  138.                 #snddata = raw_input('\nenter data send:\n')  t5 P# q( }& P
  139.                 if self.rcvdata!='':
    5 s9 g# l! L4 `* ]# e
  140.                     self.l_serial.write(self.rcvdata);
    + k% N# v0 l- b
  141.                     print u'-<应答:'- H* y/ ]5 P) `; t) Y; {# ]) O
  142.                     print self.rcvdata;
    * a' a9 I( C. D
  143.                     mylock.acquire()
    $ Q\" I2 R\" d# G+ D- t; x& M/ l
  144.                     self.rcvdata = '';
    \" A7 U! H0 Q% z
  145.                     mylock.release()
    . n* a- G+ p- p2 f7 x5 D  k5 {( S$ J( G
  146.                 #print_hex(snddata);1 V/ U+ T; L( o! t! U6 v
  147.                 4 B0 j2 K\" t% ^% d+ t. n& v, L) F\" X
  148.             except Exception, ex:( R0 U1 R6 A4 W) N2 D. @
  149.                 print str(ex);! p9 ~2 Z8 h/ q* }+ J* f; X
  150.         self.waitEnd.set();
    6 t. S. s& f$ G. d. f( O3 t
  151.         self.alive = False;' z, @6 ]\" x1 w

  152. 3 c  ?; N( v; q% D: E
  153.     def TcpClient(self):( L) S) z: P+ f: B/ f  K; @6 F8 M
  154.         while True:
    $ O, L3 V6 |+ ]* v/ b
  155.             # 接收间隔# V2 F9 a$ x% G1 P\" U( F
  156.             time.sleep(0.1);/ @3 O# J/ b5 A( Z1 k
  157.             self.connection = socket(AF_INET, SOCK_STREAM);- l( \! [5 C0 p) \# r% \0 P1 {; H
  158.             self.connection.connect((Server_IP, int(Server_Port)));& s) f6 k0 [; k7 d$ o4 u8 J2 U2 ?
  159.             print 'Connect to Server OK!';
    ; v0 I/ ]2 r; l) `; `& Z
  160.             self.snddata = ''
    % W\" \4 S- \+ f2 M1 O$ l- j
  161.             self.rcvdata = ''
    5 W& q$ F1 w2 q7 w6 \% {2 v  h% R
  162.             while True:! d- @6 G: @6 `1 h: x& t8 l4 A
  163.             #读取客户端套接字的下一行
    ( e8 s& s4 Z* y6 K' H* |
  164.             data = self.connection.recv(1024)
    $ b\" y9 ?0 G\" {8 c# R
  165.             #如果没有数量的话,那么跳出循环( {# G# f4 d) J; z5 `( }3 g
  166.             if not data: break# t& Y4 W\" }+ a
  167.             #发送一个回复至客户端
    5 [) c* [. E  r  m6 b# e
  168.             mylock.acquire() \" F& X* \' X/ g+ G1 I
  169.             self.snddata = ''4 [1 H$ j( m9 w; t( G1 w* L1 h
  170.             self.rcvdata = data5 n6 _' B+ @' P  @# e6 f
  171.             mylock.release()
    / S\" }% w\" c! t: E, T7 O6 c1 q& m
  172.             #connection.send('Echo=>' + data)
    ' ?: N0 M0 \8 k1 Y+ {. ]
  173.             self.connection.close()
    + N: |( v5 m2 p6 C
  174. ( Q% |$ w# E( q$ o0 \
  175.         self.waitEnd.set();7 B3 p! }/ Y+ c\" b: T
  176.         self.alive = False;
    . b6 \5 o$ b$ k3 m* h

  177. / B+ h- U+ ~- P* x; Y  l
  178.     def TcpSend(self):\" C7 Z$ Z5 T3 F/ U8 [. Z+ g
  179.         while True:
    2 Z/ s0 R- _3 o\" `) X5 }
  180.             # 接收间隔+ _4 e0 `  l1 P. ^% D
  181.             time.sleep(0.1);: y3 w\" }0 e* }; h2 ^4 s2 o
  182.             while True:
    + v* J  |0 B3 I) m2 J
  183.               time.sleep(0.1);
    % r9 ~4 R# B7 M% M- a' i
  184.               try:$ B\" [$ A3 e! w3 t, J1 v; L& o8 Z. C
  185.                 if not self.connection is None:
    # h8 ?$ |4 {( y
  186.                   if self.snddata != '':# a' m, f! A; ^\" L* @# X1 X
  187.                     self.connection.send(self.snddata)- `' G0 q+ y  q/ ~( ~; ^. r
  188.                     mylock.acquire()
    * U5 _+ L9 i\" K+ @. p3 c
  189.                     self.rcvdata = ''/ \\" _& B* Z, X# p
  190.                     self.snddata = ''
    + \4 q3 _4 t  g; e
  191.                     mylock.release()- y' X6 z+ D' i$ }9 W6 ?
  192.               except Exception, ex:. Q+ \7 V& l3 Y( S+ _( ?( c
  193.             pass        
    ' H. _* ]/ J. Y1 B4 \
  194.     def stop(self):; D9 x$ |2 y$ s; r4 }, T  ?. }
  195.         self.alive = False;
    * k' t9 Q' c+ U! \
  196.         self.thread_read.join();
    / L4 F5 [& Q+ j; g7 U
  197.         if self.l_serial.isOpen():
    / l' z( ^% \) L: H) t4 H7 ~$ @
  198.             self.l_serial.close();( r0 p4 d\" i* Z9 B+ |

  199.   T) f, h5 e& y# f2 H

  200. \" Y/ m& n( f1 z2 X\" S
  201. 3 u4 P7 `3 @+ ~$ a- p# i
  202. #测试用部分
    \" W, r; s( q9 O9 V3 Y
  203. if __name__ == '__main__':
    , u% Y& h- {  W' x; D$ r0 ]8 Q
  204.     print 'Serial to Tcp Tool 1.00\n' 0 }4 }9 n5 l/ y
  205.     print 'Author:yangyongzhen\n'
    3 Y. K# g- M$ b# m0 B
  206.     print 'QQ:534117529\n'! [0 [* Q( p% }
  207.     print 'Copyright (c) **cap 2015-2016.\n'
    1 h6 a- N4 G, j5 [

  208. . d6 K) {2 v\" g6 ^. ?1 z0 [
  209.     Server_IP = raw_input('please enter ServerIP:')
    5 A7 y8 y& ?\" ^% M
  210.     print 'Server_IP: %s' %(Server_IP)# t- q3 l% M2 z2 R8 s0 M) Q! y2 \
  211.     Server_Port = raw_input('please enter ServerPort:'). O) |$ i7 D' q
  212.     print 'Server_Port: %s' %(Server_Port)
    0 ~- ~4 }5 j. ^, t8 J
  213.     com =raw_input('please enter com port(1-9):')
    3 J$ Z; \+ t' E7 D# t
  214.     rt = ComThread(int(com)-1);
    & b9 y( A$ f8 C' ]7 x
  215.     try:
    ! a! a  J. \- b\" }
  216.         if rt.start():
    ) {* f\" X3 q1 w2 V\" N: n
  217.             rt.waiting();' l1 h/ p6 b+ L0 B4 |% B
  218.             rt.stop();$ z' v& o# t\" m* M* r/ Q2 U
  219.         else:\" N4 [$ b; Q$ A# z# I! v
  220.             pass;            : Q\" Q' g) h$ n; b) R. N  V7 }( b) M
  221.     except Exception,se:2 }1 K+ l; I) G9 {: d# }4 \
  222.         print str(se);\" {$ S2 s# g! E0 ^$ W* i5 p

  223. 4 o- x6 Q  d+ d' Z' D3 @
  224.     if rt.alive:
    * Z/ I0 X9 M  v$ i7 s7 @
  225.         rt.stop();6 Q( [  N  _: Z\" e7 Q% v; d
  226.     os.system("pause")( m: m# S+ y\" ^

  227. ! w  u4 ^6 d. ]- L, G  p) y
  228.     print '';  ~7 ?\" o0 ]5 [4 y: ]
  229.     print 'End OK .';
    7 z0 d3 P, v( N7 N* A
  230.     del rt;
复制代码
( Y% x1 J2 ]% O5 B- ?- U& X
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-22 00:24 , Processed in 0.494631 second(s), 55 queries .

回顶部