QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-87 c7 o& Z; N$ g. n) C5 ?

  2. / t: L1 S$ g: o, U- N

  3. 1 b1 ~7 k' `& U+ _. d* W7 U9 K
  4. import sys,threading,time;
    ; p! w4 R* ]$ F; k( W
  5. import serial;& u$ t. C3 ?, @: `$ i: c
  6. import binascii,encodings;\" x% V& k9 _. t8 b
  7. import re;! ~) c5 d! E7 b
  8. import os;5 T! S5 c/ i\" T3 M2 p# S4 v. o
  9. from socket import *
    . Z. H5 y' n* C8 `  N
  10. from struct import *;& S  V\" f8 o' c
  11. #from myutil import *;
    * K' ]- G$ ?( Z- Q6 l3 [1 Z
  12. #name: myutil.py
    6 P- b1 b/ V; Z. l# e
  13. 0 s% o$ }& x6 i! K
  14. mylock = threading.RLock()
    % Y5 O9 j8 R' Y. `4 N4 l% ^3 F

  15. 7 m8 p$ N- ^; ]\" W1 Y0 ~. E
  16. Server_IP = ''
    8 y9 e; R5 @: w. e' ~) I
  17. Srever_Port = ''5 T: t+ D9 @# x( G+ G
  18. 0 s/ o# H3 g/ x4 n  {9 M
  19. def print_hex1(s,prev='0x'):
    0 ]1 i: M( A6 q1 m& v1 @
  20.     for c in s:8 W0 \) f. j. N: o( [
  21.         print '%s%02x' %(prev,ord(c)),
    ) K! }* x0 z* |+ g7 j/ X* D+ U
  22.     print
    , @  j+ s) T, P) m: P% e+ t$ H
  23. def print_hex(s):
    6 i) C8 d( [2 j! D3 J
  24.     for c in s:
    \" c7 ?: Q9 l& x- `9 [
  25.       print '%02x' %(ord(c)),: f( `4 U! n) Z5 t& H/ T$ g* Y8 b, p
  26.     print6 X+ G# Y  \5 F
  27. 2 n  ^: r- z9 V( @
  28. def hexto_str(s):
    ; v! o% g! b8 s( ~( ^
  29.   r =''
    - x) S, ]\" V5 y, A$ a3 X( ^, B
  30.   for c in s:
    - I, U8 f9 p) e$ x8 [0 f% q) J
  31.     r += '%02x' %(ord(c))( f7 t2 W& |3 m5 h3 x. p
  32.   return r7 {. w+ J3 X& G2 K; d0 G1 T* S
  33. def strto_hex(s):
    8 k\" E6 j4 `  {5 W
  34.   r = s.decode('hex')+ q$ }* ^# M/ h7 y% C
  35.   return r
    $ @6 O6 x2 }8 a: J5 m
  36. #''代表服务器为localhost6 s6 B0 B6 P- F+ M8 S9 R4 Y3 ?

  37. 8 }4 U% Z# w/ e1 E
  38. #在一个非保留端口号上进行监听- V. j2 P6 }& b! {' `2 B* W$ e
  39. 4 T2 h* H0 v' ^

  40. ) W. T' d+ |. W4 L4 Q# J
  41. class ComThread:
    7 a! N; C\" P  R- I9 v2 t4 Y
  42.     def __init__(self, Port=0):7 Z$ G/ N4 Y+ t7 W
  43.         self.l_serial = None;5 ?/ G/ H8 X6 o. m7 Z0 |
  44.         self.alive = False;
    3 p% L1 k6 n% h, v6 ?( }
  45.         self.waitEnd = None;/ V: l! g1 @# \( t0 h7 w( h
  46.         self.port = Port;
    \" ?1 J! k, Y1 P1 z# x/ @3 p
  47. - D\" @4 g7 _0 l% |
  48.         #TCP部分
    6 {/ ?3 O( O( `% S! |  [7 g( U
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)& k# `7 m! c  B2 u/ x
  50.         self.connection = None9 D3 p7 F, b4 U6 K3 z
  51.         #数据
    5 Z\" u% ~3 [. n/ ?+ _
  52.         self.snddata = ''
    0 D9 g: q7 D& W5 \9 g+ g
  53.         self.rcvdata = ''
    8 I- K5 g) |% z' o

  54. 2 V' d$ z) g* t6 g
  55.     def waiting(self):
    9 O( W& J# B2 E
  56.         if not self.waitEnd is None:+ D# m8 d4 D. w/ B+ c$ X\" Y3 A2 A
  57.             self.waitEnd.wait();
    , q# l; y# F# Z& C
  58. % q$ ^( B5 u6 N: f' b
  59. ' v# T* y7 c8 u1 J/ V  j* o/ W( |
  60.     def SetStopEvent(self):; ^6 h. Z: c. v
  61.         if not self.waitEnd is None:3 S( a* I7 X, |+ o) @( w6 H\" g
  62.             self.waitEnd.set();
    3 p: r/ N4 x+ O  f
  63.         self.alive = False;$ v0 _; a  d% C' L7 S
  64.         self.stop();
      @5 K* u% A- B4 m5 F/ [
  65. ; G' Q% N* A8 U* g% t2 l: n/ S

  66. ) R4 b7 h  e9 o
  67.     def start(self):
    * L. @( s( Y, r  _# R
  68.         self.l_serial = serial.Serial();1 ^1 \( s  t: X+ i2 @
  69.         self.l_serial.port = self.port;
    ( R( P. u2 A' J6 H* ]
  70.         self.l_serial.baudrate = 115200;1 |% Y\" |. b1 W
  71.         self.l_serial.timeout = 2;  #秒
    9 R8 ]' r1 N& E
  72.         self.l_serial.open();
    % p$ X: B  y& ^8 C) v8 Q/ O
  73. 6 T$ x$ M6 d: |4 s$ r7 P
  74.         if self.l_serial.isOpen():4 ^# K7 v. L+ y, G( K\" U
  75.             self.waitEnd = threading.Event();8 J3 c8 N1 K; h9 d
  76.             self.alive = True;
    * i1 W9 j% K) ?) h/ Y+ l& O# k
  77.             print 'open serial port %d ok!\n' %(self.port+1)' X: i- f. C; E' S+ M6 ?8 g# C
  78.             print 'baudrate:115200 \n'
    ) a6 ~: Y7 @: O  s\" q& p  l
  79.             self.thread_read = None;7 r9 q- B4 t+ }
  80.             self.thread_read = threading.Thread(target=self.FirstReader);! Y\" I$ ?/ L/ q7 e+ Y8 J
  81.             self.thread_read.setDaemon(1);
    % B* C/ m7 P# r* d- T0 _
  82.             self.thread_read.start();
    7 U  U9 Q4 B$ C) d- _
  83. : i( T, \/ v: Z& V, o3 A6 z8 G
  84.             self.thread_write = None;
    ! k- `( K: N) O2 F1 d
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    + t: H! d9 O2 j8 D& J
  86.             self.thread_write.setDaemon(1);1 L2 O1 M9 N* H7 A$ O) s& T
  87.             self.thread_write.start();* R) I% I- u' ~* O5 c4 j! K

  88. 9 @0 I: Q$ J: @8 ]6 b
  89.             #TCP部分
    ' X& I2 c  K9 k0 a, z; Y
  90.             self.thread_TcpClient = None;
    # n) r' a# {3 ?
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);
    ) y# E2 ~) A, t\" ~- r
  92.             self.thread_TcpClient.setDaemon(1);( n\" w  ^- |7 T1 W4 Z% `
  93.             self.thread_TcpClient.start();
    8 g9 N4 l/ v& U

  94. % d# p% ?& m5 E$ H% l
  95.             self.thread_TcpSend = None;2 v% U. B4 o' P' q, j+ [9 V
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);
    ( `: j, r2 G/ z' s7 |7 \4 ^
  97.             self.thread_TcpSend.setDaemon(1);& a( [7 s6 M) X! {7 w0 n) O
  98.             self.thread_TcpSend.start();3 G& t( O; l6 R. t

  99. % _. ~2 k$ o3 @7 ^  x
  100.             return True;; B# Q- e\" }7 ?. h
  101.         else:0 a: M2 e* `/ R/ V7 q* O5 t7 ^
  102.             return False;6 Q( r. m& l, c% _\" l

  103. 7 d& f! v/ @5 J# b$ `4 k, R3 k

  104. ( b0 x& G. U1 f6 _1 z
  105.     def FirstReader(self):* ]9 f- d# L9 L, v/ G( k. y
  106.         while self.alive:1 ~- Y* w. ^7 V: q  o1 }$ @
  107.             # 接收间隔
    ; V  {& E* b* @& }& Y
  108.             time.sleep(0.1);
    4 W- T  k. O3 W6 `1 A: @3 D
  109.             try:3 g2 N4 q2 N% w  D! D( P
  110.                 data = '';# w6 P7 s% p, p6 q! W6 [
  111.                 n = self.l_serial.inWaiting();
    / l$ z9 g$ |. S
  112.                 if n:
    , G  l# I/ c1 ~3 @7 Z! w% b, X& A$ u( r
  113.                     data = data+self.l_serial.read(n);% y+ b. @8 Y: f1 K; y9 N! k2 ^. c
  114.                     #for l in xrange(len(data)):
    : d3 g\" E& z1 V, f2 f! V
  115.                         #print '%02X' % ord(data[l]),
    9 r0 W5 d! }( Y  j+ {  I2 \
  116.                     # 发送数据* \! w4 R( s( a( ~, m
  117.                     print u'->请求:'
    ) }. @$ L% ]8 n7 h: x4 G
  118.                     print data;9 o  m0 y; |+ }\" s/ ]. X% H
  119.                     mylock.acquire()
      G0 O( R0 h\" B: f% p$ {
  120.                     self.snddata = data
    ) C\" x9 Z5 S3 f
  121.                     mylock.release()
    1 M) p- V) ]' w\" Z6 [7 F* y
  122.                     #print_hex(data);- s8 ~$ L, O. T
  123.                 . z/ b% m# k, N) ?% j  y# ~% j
  124.                     ' q\" v1 w/ s* f1 d! F) ]
  125.                 # 判断结束\" Z9 I+ w% |\" u2 O\" j. i* z6 j4 \: h
  126.                * K1 Z0 {& I& V
  127.             except Exception, ex:
    ) b( C4 q( r\" J: y3 N5 f
  128.                 print str(ex);% }0 m/ \9 t0 r( u% Z5 T# r! Y3 y

  129. ; q. N. j4 w3 C
  130.         self.waitEnd.set();
    % P* l3 \  U  u+ ^1 m
  131.         self.alive = False;
    7 K  _$ V5 U/ E
  132. ( g/ g$ G% P7 g$ T6 R) P/ V
  133.     def FirstWriter(self):
    ( D7 F4 D# v* Q( f\" @. |
  134.         while self.alive:
    ( n7 `9 c8 e# w7 {9 Y\" M
  135.             # 接收间隔/ }6 _( ^+ k2 I( [
  136.             time.sleep(0.1);6 l7 x% Q4 E\" I
  137.             try:
    ! w9 K: e4 Y8 x
  138.                 #snddata = raw_input('\nenter data send:\n'), @: B: I: R' M( r
  139.                 if self.rcvdata!='':
    ' i5 B: A5 @3 K1 v7 _
  140.                     self.l_serial.write(self.rcvdata);
    : g! \: [* v- }! s% a2 M
  141.                     print u'-<应答:'
    8 s! D) w, R+ A2 L
  142.                     print self.rcvdata;2 z* ~! J7 ?5 R& Z- v# b7 S
  143.                     mylock.acquire()
    5 h3 ^( a; A8 M\" M3 G' p6 P
  144.                     self.rcvdata = '';
    8 Y, C3 j1 r. G+ x0 Y2 g
  145.                     mylock.release()  }) A8 D- K' Z7 Z9 s
  146.                 #print_hex(snddata);: O( r* G1 k' w( G: y
  147.                 ( O: _, r6 n9 z\" b4 J1 f
  148.             except Exception, ex:
    1 }% }2 i0 V5 r* G6 K
  149.                 print str(ex);- g6 E7 D6 W% {/ |: l; v, ?
  150.         self.waitEnd.set();- w# R8 a8 A0 t* c! N
  151.         self.alive = False;0 ]: n2 D/ G\" o\" J  h
  152. ) I: v2 J4 C5 y& `5 I0 m& F
  153.     def TcpClient(self):
      D3 C# B/ \6 e3 r, Z
  154.         while True:
    6 A  V( s& E( o
  155.             # 接收间隔9 W/ l3 W9 g2 k+ |, U9 k
  156.             time.sleep(0.1);8 P4 q0 o, Y( W+ i* |& y  _7 F
  157.             self.connection = socket(AF_INET, SOCK_STREAM);
    1 D: _% a$ L( L/ Q' ?3 q
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    ) W8 ]: Q9 u! ^' {
  159.             print 'Connect to Server OK!';/ R7 J, p. Y7 ~- w& n
  160.             self.snddata = ''
    6 z\" Z0 A! @7 S% p# x  I8 P
  161.             self.rcvdata = ''
    5 P! I( z! h* u
  162.             while True:$ s; r) _$ h\" `3 D, R; D
  163.             #读取客户端套接字的下一行
    / I9 K* y7 L\" m8 F4 A
  164.             data = self.connection.recv(1024)$ i/ J' c: d) [4 \
  165.             #如果没有数量的话,那么跳出循环6 u# w* e  n' P  k2 s, }- K
  166.             if not data: break
      E4 d& ^7 n8 j) V1 T
  167.             #发送一个回复至客户端) j\" B5 m$ p5 H5 @9 H
  168.             mylock.acquire() # n: A; q. L7 r8 C, o
  169.             self.snddata = ''/ Z5 y( A. z& O+ I% b
  170.             self.rcvdata = data
    # l) ]/ D- d) J4 \7 ]; r
  171.             mylock.release()
    2 [! {& j( _' B* q! t- c
  172.             #connection.send('Echo=>' + data)
    + I# F8 w1 a7 y\" }. x& A' c
  173.             self.connection.close()
    0 V. J5 ^/ z# o) a5 C' v) k4 w) ]& ^

  174. 6 a, b4 g$ J$ E' h) d/ G\" ^
  175.         self.waitEnd.set();
    ; J/ n) A2 s; J3 _7 W7 z! r& c5 K: {, c6 C
  176.         self.alive = False;
    / u8 o& r3 r/ K0 T$ ^% @\" w

  177. 9 o+ N\" o; e: G9 O% z2 m1 g' E
  178.     def TcpSend(self):* v% ~: Y3 `# j( _, N
  179.         while True:; m+ _1 |; q3 |0 [% E\" W
  180.             # 接收间隔
    & s4 m. w+ n3 Z, Q, R  ^
  181.             time.sleep(0.1);$ |+ B6 ?% V2 i! O8 ?$ Y
  182.             while True:$ {6 W. D( z: D& D! M
  183.               time.sleep(0.1);1 ]: e! E$ I( B8 y
  184.               try:; Y; d1 t\" \6 h; J% P
  185.                 if not self.connection is None:; `4 t$ v7 Q4 s5 h
  186.                   if self.snddata != '':\" m2 E8 y( ~, m/ {! I6 B) k
  187.                     self.connection.send(self.snddata)4 R) Z& F+ D0 o
  188.                     mylock.acquire() . T8 u6 P0 V& P; q% p8 L+ y
  189.                     self.rcvdata = '', k: K5 H/ l3 D( b. G$ Z& d, f& F! E* x
  190.                     self.snddata = ''; \* Y+ h3 ~# b
  191.                     mylock.release()
    - f! J$ o! O* _4 }) p
  192.               except Exception, ex:
    # A8 e1 I5 ^4 T% }1 L
  193.             pass        0 x1 P$ ?: ~. I- a' h
  194.     def stop(self):
    6 m  n( e1 n2 n- |
  195.         self.alive = False;
    + Y' l( c; J+ ?2 c1 ^7 h
  196.         self.thread_read.join();
    + O/ P$ _5 c- V: j7 p; C+ |
  197.         if self.l_serial.isOpen():/ [. K9 H  N' B- P( u
  198.             self.l_serial.close();+ J; {. d( ~. ^% ]

  199. + y5 X8 `7 l* T. V; c8 q  D9 V

  200. / O- F4 W6 I4 z0 C; p0 n

  201. 0 ]  I- r3 q0 A
  202. #测试用部分- W& T/ ^( ~+ ?2 t/ o% g) B
  203. if __name__ == '__main__':( X5 W9 D6 A7 r! _+ T3 Q5 y3 z
  204.     print 'Serial to Tcp Tool 1.00\n'
    % }7 Z$ Z% _, b2 ?
  205.     print 'Author:yangyongzhen\n'# \7 ~1 a  K( ]) ~% C
  206.     print 'QQ:534117529\n'! a. D- K/ q$ F  M: z# K. W
  207.     print 'Copyright (c) **cap 2015-2016.\n'3 q  [, Y/ t; t! n9 L# a  i5 ^

  208. 7 o! t- u: V/ Z3 M+ B* j/ k
  209.     Server_IP = raw_input('please enter ServerIP:')+ b, @+ f9 B/ {7 F
  210.     print 'Server_IP: %s' %(Server_IP)9 ?1 S/ ^) Z4 k8 @$ u
  211.     Server_Port = raw_input('please enter ServerPort:')
    * d6 c1 Z' p: i
  212.     print 'Server_Port: %s' %(Server_Port): @, c* W% V$ ~% m
  213.     com =raw_input('please enter com port(1-9):')
    5 m! f' i+ e& t4 Q
  214.     rt = ComThread(int(com)-1);
    \" V7 `7 Y. P& Q8 H6 Y2 \
  215.     try:! _  g5 ~: D/ Y
  216.         if rt.start():
    ( L2 h! X4 U# b6 X
  217.             rt.waiting();
    % h: |$ I% D) y2 M( B
  218.             rt.stop();
    7 q3 s' F' }7 I5 G( y2 F* ~
  219.         else:
    ! Q7 D% P) ^2 t3 ^$ Z. r
  220.             pass;            ) d/ f$ Z6 t( v- u
  221.     except Exception,se:
    % [* E3 b+ O+ Q
  222.         print str(se);
    + M# |\" {5 y/ T( J6 b5 S4 n

  223. ( y- |  h3 M/ p2 K! L/ j! \
  224.     if rt.alive:
    . o7 H& l\" x1 [5 t7 b! ]
  225.         rt.stop();
    8 v6 D/ E4 C! t8 t1 {5 K/ r
  226.     os.system("pause")+ ?4 [! X6 T$ ^. ?! f6 ?
  227. # d\" j* X$ m& F( t! M: q
  228.     print '';; T0 a  }  u5 M9 M
  229.     print 'End OK .';% k( P, Z  G$ c4 E7 A$ F
  230.     del rt;
复制代码

/ Q# V9 r; N2 a' Y
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 18:36 , Processed in 0.406660 second(s), 50 queries .

回顶部