QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |正序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    7 d( {# J4 }, F, ~9 \

  2. 9 m4 H% r' b0 T: k, o& E* X, z
  3. + v  }. Y+ k- L6 q1 _
  4. import sys,threading,time;
    ) A7 Q3 J\" b* s
  5. import serial;& t2 ?! a0 r9 S/ G\" y
  6. import binascii,encodings;  z; F8 o6 D5 T* {2 n0 [6 a
  7. import re;
    2 `! l6 i9 {/ E\" W
  8. import os;
    , A* U; K3 R/ ]7 N  P
  9. from socket import *9 q; I3 w' ^- g% }+ N( |+ G3 _9 U3 n
  10. from struct import *;
    + V5 \5 A4 \: K/ g' a; Q
  11. #from myutil import *;
    / k3 w6 K\" y8 v
  12. #name: myutil.py3 ^. A1 e) G0 e1 H; Q
  13. 0 v4 n4 d0 M3 Y0 l0 u/ r9 K' [* r
  14. mylock = threading.RLock()
    % ]6 M: ^7 N8 [& i7 P
  15. 2 Z4 i3 ?: q. U- ^& `/ ]0 T
  16. Server_IP = ''
    4 j( H  q% R. E/ @- [* [
  17. Srever_Port = ''. f- ?; t- _- l6 [\" d2 ^
  18. 8 i. j+ |# O1 Y
  19. def print_hex1(s,prev='0x'):5 k' v9 D  s% a& k$ B
  20.     for c in s:& e+ ~2 ?1 U0 F2 y7 v, G9 G
  21.         print '%s%02x' %(prev,ord(c)),
    ! @  H% `2 h. w& n
  22.     print/ A+ f5 j0 l  O8 J
  23. def print_hex(s):5 `2 s\" [\" X6 _
  24.     for c in s:6 p# S0 s, c3 Y) @! ]0 Y
  25.       print '%02x' %(ord(c)),
    ! t\" ]\" Q- ^2 ^' S5 X
  26.     print
    8 n0 L* Q\" z7 r) {; y

  27. , O2 t, }! T% J
  28. def hexto_str(s):; L% B' ]' N! b) D5 T
  29.   r ='', z7 F- K8 H3 X% @
  30.   for c in s:
    : \. |\" h4 `* t7 l
  31.     r += '%02x' %(ord(c))
    * o  X6 w7 |. i0 d
  32.   return r
    ' v' \; k9 J* J\" v7 X
  33. def strto_hex(s):4 x( i5 B6 u. G# g
  34.   r = s.decode('hex')1 F$ _  h$ n; z6 x
  35.   return r
    . _8 x8 D4 j\" k, H( \
  36. #''代表服务器为localhost! _- n  }$ }  d- Y# h
  37. + A  g! S\" ^\" p3 L5 N# ?
  38. #在一个非保留端口号上进行监听
    - J7 \* S) t7 K) X: L
  39. 3 ~$ H/ l/ _8 {* b2 [1 ~

  40. 4 W; U+ p( r' m3 R, e6 I
  41. class ComThread:
    7 e- n( U  m+ b8 _3 r- ^
  42.     def __init__(self, Port=0):5 W6 d. j9 d+ G0 \- T3 m
  43.         self.l_serial = None;
    9 Q# U( F; C- ?+ o: B' @7 c
  44.         self.alive = False;
    4 y& P+ Y- I+ j: z. c+ `: |
  45.         self.waitEnd = None;
    7 L$ y+ R+ L4 F( w4 [7 ]  B
  46.         self.port = Port;
    ( t\" ^$ W) N8 H2 e

  47. , t) J) f, |# X4 t: q) Z\" X
  48.         #TCP部分
    4 G, ~5 S0 S' N. B2 }) A, A3 C
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    2 u$ e1 \0 J8 z' f4 c2 M
  50.         self.connection = None
    ) n# r' \0 ^) h
  51.         #数据
    9 W# z8 r/ t& H/ h
  52.         self.snddata = ''
    7 {4 x3 V6 o( i/ I2 D/ k
  53.         self.rcvdata = ''
    $ c  |) ~6 R6 ]0 O
  54. 6 A+ m) T5 X# }9 d4 v
  55.     def waiting(self):# S! e- ]. k& H* r0 m$ K
  56.         if not self.waitEnd is None:
    - k$ l# m* n8 A  }0 b# @1 z- W
  57.             self.waitEnd.wait();$ e' ^4 @/ e; Z6 j* g% A8 Z$ D
  58. 5 F& m( Z* L. k4 C. y

  59. 4 I& C+ x3 [9 Y2 B
  60.     def SetStopEvent(self):' t( y* {+ A\" _* b- H0 w) r
  61.         if not self.waitEnd is None:
    ; e) P8 {. r; n! H4 X1 }
  62.             self.waitEnd.set();
    ; E9 x8 U# P0 u9 P& Q
  63.         self.alive = False;1 Q6 q( ~* E; h
  64.         self.stop();
    # P+ s1 M  t6 J
  65. \" P# h( ~4 p& U

  66. 7 c$ i' v3 i: {. _5 s
  67.     def start(self):1 y3 I! g  _% k1 u8 r: a0 s
  68.         self.l_serial = serial.Serial();( e* O: e! J8 }) n+ T9 p
  69.         self.l_serial.port = self.port;
    $ g( q  v$ ?0 [
  70.         self.l_serial.baudrate = 115200;
    % _, V: b3 j1 m4 L. z/ F
  71.         self.l_serial.timeout = 2;  #秒4 Z, N4 W0 k: Q, L
  72.         self.l_serial.open();1 o9 U, @  ]/ r4 I+ [: B3 \

  73. ' U. u, {2 B7 a, G% R\" S\" l& q
  74.         if self.l_serial.isOpen():& Y2 |3 b2 h, ?# u- p! R
  75.             self.waitEnd = threading.Event();, a# ~6 h& a, X3 p# }0 ]# y- Z
  76.             self.alive = True;) B' O0 A0 Q0 r
  77.             print 'open serial port %d ok!\n' %(self.port+1)
    \" V7 @# M. |\" r5 d4 k! T
  78.             print 'baudrate:115200 \n'
    7 L3 }! [\" F$ T0 B. y8 `
  79.             self.thread_read = None;
    6 |3 \: r( y; V) U/ y
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    & [: w8 Z1 R/ b' p0 D0 v
  81.             self.thread_read.setDaemon(1);
    ! F8 |3 d0 |0 c9 K
  82.             self.thread_read.start();
    5 Z; ^7 P' u4 x
  83. & v, A3 y8 Z1 `1 d0 Z+ ~
  84.             self.thread_write = None;
    + w( s4 S- n& e\" ]1 ^
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    8 ]( g( m- o, r& \& T2 t4 Z) z
  86.             self.thread_write.setDaemon(1);! F7 I9 m8 U% q, S, A1 m- s
  87.             self.thread_write.start();' r# p: |: p/ Z  @
  88. : D0 V( _4 b+ M# i* |( g
  89.             #TCP部分( y, z, ~3 Y\" E' m. B
  90.             self.thread_TcpClient = None;
      p  Y) \9 P/ g3 j
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);* {+ k: s\" i/ ~4 H\" u
  92.             self.thread_TcpClient.setDaemon(1);
    8 `) _/ E! L7 u8 f+ z- s
  93.             self.thread_TcpClient.start();' v( q/ C6 c, \5 m) t9 B
  94. % X* j8 F; K5 F/ o8 ]6 c& [/ X
  95.             self.thread_TcpSend = None;
    % u& `( ^# I8 c1 W$ b  e
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);
    $ z2 s; q( U) i8 r7 a4 t+ S
  97.             self.thread_TcpSend.setDaemon(1);\" }5 ?- l! k# R- O; _( D# F
  98.             self.thread_TcpSend.start();- X3 ?5 k: B* G1 ~% J

  99. 7 C6 K7 |. A: y6 U\" u' s3 w( F; W
  100.             return True;
    6 ], P+ _* P! H6 U6 `
  101.         else:
    8 q  _# n( E' p, G/ f
  102.             return False;- S( |. L1 q: X, P' v' t. e3 A$ t

  103. \" M# X7 ^( D6 Y1 c4 N9 h
  104. 9 s9 O! M0 z. ~* L
  105.     def FirstReader(self):9 j2 Q2 W  |8 `# K# [* \( a
  106.         while self.alive:$ F9 ^+ k$ \2 p) r% [
  107.             # 接收间隔; Z3 P! A\" W! B
  108.             time.sleep(0.1);
    + d5 j' X5 n\" f8 _3 ?  Y2 X6 e) i
  109.             try:
    $ i: o! S6 D1 [5 `; G\" J
  110.                 data = '';; c, c: |, f3 |  c* N7 a
  111.                 n = self.l_serial.inWaiting();
    + B4 E$ p: ^% w  b3 W
  112.                 if n:
    8 X) {6 s: g7 F7 E3 F
  113.                     data = data+self.l_serial.read(n);
    8 ?( R* P7 M7 Z  O+ E
  114.                     #for l in xrange(len(data)):
    ( P: r4 }( |1 V# p  ^( @; ~; P
  115.                         #print '%02X' % ord(data[l]),) g  U& O\" F* v% M# ~! J3 H# x
  116.                     # 发送数据
    & q5 E8 |8 E2 V1 o/ R2 C
  117.                     print u'->请求:'( ^# O7 g\" q0 [! o$ u# N
  118.                     print data;6 ?( K5 t5 E7 [6 p$ R  }
  119.                     mylock.acquire() 8 q5 J, u/ y: t% O% X
  120.                     self.snddata = data' n4 f/ ?  u, h. h
  121.                     mylock.release()
    8 g  v\" U' A\" M/ G5 C
  122.                     #print_hex(data);- \- F8 W. O: `% J3 x
  123.                 : h! c# c4 |3 g1 |( X\" Y
  124.                     4 `! w# b\" \! c' k& L1 F
  125.                 # 判断结束% d/ {! F2 Z1 }+ Q% }& e0 t0 b
  126.                - w6 i, K# A0 q5 _! m: Z
  127.             except Exception, ex:( {3 E2 p8 G. X$ w1 n' ^
  128.                 print str(ex);
    / L9 f9 c1 I6 C3 v

  129. ; }/ g5 B9 u' w% F8 \; `5 Z
  130.         self.waitEnd.set();
    4 M8 O$ i4 Q5 Y( c& a
  131.         self.alive = False;
    0 i) h- ]( `( Y3 E
  132. $ p- M. J( B$ I6 I- h9 f$ C
  133.     def FirstWriter(self):& s& A: {% v; g1 z
  134.         while self.alive:5 o7 O  o( E) k: N, U7 J. M3 a! I
  135.             # 接收间隔
    \" `  j( q$ n2 ]- {3 }1 R
  136.             time.sleep(0.1);
    ' k3 G6 E; t, p6 [$ _7 ^; Q
  137.             try:$ L  }9 a$ [. R
  138.                 #snddata = raw_input('\nenter data send:\n')1 i9 F8 r/ L. l& Y( v9 k4 ^
  139.                 if self.rcvdata!='':/ h+ e2 N% d4 L# M8 M( t
  140.                     self.l_serial.write(self.rcvdata);
    2 i5 X! k' d- ?2 O! H
  141.                     print u'-<应答:'& P5 Q; J# |4 f4 J/ ~# b5 J4 o
  142.                     print self.rcvdata;
    0 Z8 R0 n, E9 g8 x- C
  143.                     mylock.acquire() 8 B+ L5 y! J7 N5 C  G
  144.                     self.rcvdata = '';
    9 B\" W. ^3 X4 d. D: I% j* H
  145.                     mylock.release()
    , j+ x/ ^0 T; ?& U: Q: d
  146.                 #print_hex(snddata);
    ' ?/ E8 A! B1 W/ J\" ^7 e) ~
  147.                
    / S8 q% a- l/ t
  148.             except Exception, ex:
    6 D# U+ }/ h: a5 Q/ W% P
  149.                 print str(ex);
    5 r- U% F4 {  B  B8 ?: [; A
  150.         self.waitEnd.set();
    0 j) q' ~. Q. P  J
  151.         self.alive = False;: i# T5 ?2 U& E

  152. 9 o8 }5 u* }% \: ], `
  153.     def TcpClient(self):
    * z4 Y5 P$ t8 z3 [6 N, ]: w9 O
  154.         while True:7 Q% F7 T  x6 U& o
  155.             # 接收间隔
    3 M9 R( c* F! }2 I8 J# e  q
  156.             time.sleep(0.1);
    2 F4 b/ Y2 G4 B
  157.             self.connection = socket(AF_INET, SOCK_STREAM);
    ) C, V6 l4 u/ O; O
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    $ E- B6 Q$ B% H* ?) D, R
  159.             print 'Connect to Server OK!';
    $ Z( `& ^, W3 `( {
  160.             self.snddata = ''
    ! m4 \* Z& t: g0 S
  161.             self.rcvdata = ''
    / D2 X9 e4 u6 T+ S* X
  162.             while True:
    7 K& v/ S. ?9 I* e
  163.             #读取客户端套接字的下一行4 _- ^& L2 O- |( H
  164.             data = self.connection.recv(1024)
    / G: Q1 v; Z2 s
  165.             #如果没有数量的话,那么跳出循环
    \" D7 o$ l! j# u7 @2 R6 M
  166.             if not data: break
    # V* K0 p6 y  x' n
  167.             #发送一个回复至客户端% Z) {* A: f( }) n* b
  168.             mylock.acquire()
      g! K2 M2 F/ L4 w& A# [+ j
  169.             self.snddata = ''3 M' l3 U- I7 }2 j
  170.             self.rcvdata = data
    * }* O2 o, z: u( V
  171.             mylock.release()) r% S2 w5 C. X8 J; F+ U4 K) z
  172.             #connection.send('Echo=>' + data)
    6 l\" o, b! V% J; G9 u* ~; x' F
  173.             self.connection.close()
    ( @& ~9 y2 T- f3 I
  174. ! D. b) `: {, g
  175.         self.waitEnd.set();
    6 H- R1 M/ w+ h' a
  176.         self.alive = False;& L5 z+ @3 W3 Z7 O! W; r. a
  177. 9 I+ A- e# y0 S1 U. \1 x
  178.     def TcpSend(self):
    5 i3 W9 ?  k8 a
  179.         while True:+ U7 a9 ?9 t8 K/ U& B; h# V
  180.             # 接收间隔- E% b, }1 |9 Q+ N& R2 S7 {
  181.             time.sleep(0.1);6 V$ l! N$ N6 y4 L
  182.             while True:
    : L, |  N5 Z5 b2 ~. g$ `
  183.               time.sleep(0.1);+ X\" T8 T' U$ I# P3 W
  184.               try:
    & ~4 e& ]' a& f+ d* n' d; }
  185.                 if not self.connection is None:$ a0 b5 z8 B% k; H! C
  186.                   if self.snddata != '':4 C/ \* V- c5 n, q
  187.                     self.connection.send(self.snddata)* t, J$ [' D4 l; M: x' w/ Q$ Z
  188.                     mylock.acquire()
    2 i3 t7 ?# |8 R/ [% }' _
  189.                     self.rcvdata = ''
    9 }9 e( B& j  ?$ S
  190.                     self.snddata = ''
    ! l4 L( \- t) H' P5 y
  191.                     mylock.release()
    2 P1 g& `% i, z* {' F
  192.               except Exception, ex:' [  F  D0 S/ t0 j\" s2 B4 k
  193.             pass        2 U- B& N1 l- {0 C( L1 j
  194.     def stop(self):8 J9 A' a1 F: w! `; H% v
  195.         self.alive = False;
    6 j; Y1 C/ `$ H- |; K8 S
  196.         self.thread_read.join();: f+ J7 {4 D, z' U
  197.         if self.l_serial.isOpen():  W: F\" x9 [; c9 b: g\" M# `
  198.             self.l_serial.close();
    - V' s- J$ z: k
  199. - @# i  L& T: X. h\" V* Q( G* w
  200. & n, y, p) u7 _

  201. . E4 J/ M\" y0 F# F
  202. #测试用部分
    : s0 u; S( v# O2 a  n+ g* h
  203. if __name__ == '__main__':* h8 r$ Q0 R* i
  204.     print 'Serial to Tcp Tool 1.00\n' # j& W  l, t% ~( |
  205.     print 'Author:yangyongzhen\n'\" F  I$ P8 e) W+ _& F
  206.     print 'QQ:534117529\n'
    6 v- s( m# i+ I2 W/ d
  207.     print 'Copyright (c) **cap 2015-2016.\n'# U\" S8 B8 R# M: }/ O3 E
  208. ' d0 K; U/ m' N: m1 p) f
  209.     Server_IP = raw_input('please enter ServerIP:')
    4 n4 J0 v. N! d% V' m
  210.     print 'Server_IP: %s' %(Server_IP)
    & V% L0 ]6 ~8 d3 E: u
  211.     Server_Port = raw_input('please enter ServerPort:'). M8 X! }8 w  q1 k! f- x
  212.     print 'Server_Port: %s' %(Server_Port)
    , _  K, I# O* x2 Z; ^* F
  213.     com =raw_input('please enter com port(1-9):')! H6 _* s) N\" Y' L0 |3 Z
  214.     rt = ComThread(int(com)-1);
    # s* i& ]1 \, t$ o
  215.     try:1 F4 p  n  J7 O% _  n) A8 K
  216.         if rt.start():0 O; X! ?1 V2 H4 Y4 }' T
  217.             rt.waiting();
    3 ]2 l\" @4 o; T2 m
  218.             rt.stop();
    / ?+ h6 Y. G7 S$ B9 c' @+ ]
  219.         else:
    - A' V8 \9 g# y' [$ l' p$ X% C
  220.             pass;            
    , ~\" M5 H1 f9 l' n4 S0 `8 W
  221.     except Exception,se:
    \" ?# B! |: C9 U) ]
  222.         print str(se);4 J1 E2 \9 F( @& s0 R
  223. 0 [1 _# _$ b) s\" M) Q
  224.     if rt.alive:+ B( U# C2 ]\" i# f$ ?, m7 u
  225.         rt.stop();* q( m! a. D/ Q! K0 M
  226.     os.system("pause"); }+ m; Y- L7 f/ m4 l/ K& x% ~: L
  227. 3 U/ H$ U' H! f
  228.     print '';4 l; }' }$ t: p. i% a
  229.     print 'End OK .';2 E& F* ~) k9 w: q; B6 ^
  230.     del rt;
复制代码

. ~+ w* q  j9 ]( d
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-19 12:47 , Processed in 0.438163 second(s), 52 queries .

回顶部