QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    0 B' V$ e) @. ]2 b3 l9 {  E1 W
  2. # J) ?( u5 B* }( g6 W
  3. - F! \! F% a1 Q' @/ \* t
  4. import sys,threading,time;\" S8 f7 D. ~1 O( Y: j0 A* G
  5. import serial;
    + I6 A9 m2 n4 f  }+ v
  6. import binascii,encodings;
    6 w! n  l8 D& |; V/ b
  7. import re;! y6 {* L- {! }' f- G
  8. import os;& Y, D9 x* n7 D& `4 K4 c) ~4 N  X2 i
  9. from socket import *, X! i! W. y4 R7 R
  10. from struct import *;
    - T( a\" M8 V! P$ k$ p/ G
  11. #from myutil import *;8 j1 d* D' z0 H- y8 ?8 @/ O  v4 O7 N
  12. #name: myutil.py! b9 [7 y$ R  J

  13. ! n- z. ?0 |' p8 v: m3 k
  14. mylock = threading.RLock()
      _4 i- Y- B# C' x& E% d1 i3 `0 j
  15. 7 Q% A\" r0 c) Z6 l: f
  16. Server_IP = ''# Q3 @  n\" J. K! [* _
  17. Srever_Port = ''
    . s4 q3 i& q' `( Y/ O$ Z
  18. 3 s' d0 H& O6 k7 f
  19. def print_hex1(s,prev='0x'):& M+ g( o* G4 S
  20.     for c in s:5 z5 S. v3 ^* t- H. H; B, _/ Y+ a
  21.         print '%s%02x' %(prev,ord(c)),6 P3 v6 f0 v- Y; h, h( p4 U9 H
  22.     print2 b8 c. _9 U: B$ R7 r! l
  23. def print_hex(s):, q' c& _8 G8 V$ o6 C: G
  24.     for c in s:
    5 M2 `: z5 {# j\" \
  25.       print '%02x' %(ord(c)),7 t  @4 I$ J! B1 e: n
  26.     print- F  q) Z0 v: x3 U

  27. 0 [% B! k6 d8 `* }
  28. def hexto_str(s):/ X! }\" Y2 Y% j7 B6 }! w
  29.   r =''
    9 d! P) N6 K+ ?6 C% o5 n2 Y
  30.   for c in s:
    & m7 E* B& A$ f6 D9 Y
  31.     r += '%02x' %(ord(c))
    7 M+ \! `8 [. W: _6 F$ K: d- q- z! H
  32.   return r' q4 W5 I0 S/ _$ @* O: \, B
  33. def strto_hex(s):7 u  D: i9 U/ Y' k1 j8 ?3 l
  34.   r = s.decode('hex'): E2 i1 [. z. L* k, Q
  35.   return r; v3 g; U7 u' p; s& U8 ?  _  j
  36. #''代表服务器为localhost+ B7 B9 m! N+ Z  B' z/ N; `2 h
  37. \" l, z0 `, E) O2 d8 u0 n
  38. #在一个非保留端口号上进行监听
    ' W( A/ F- V2 E1 h2 Z\" j  W* d

  39. $ C. |; a. J2 C% K

  40. , a; @7 {* B; A. S
  41. class ComThread:
    \" u; P6 f3 Z  r
  42.     def __init__(self, Port=0):$ @2 E; k, r; h% A* }
  43.         self.l_serial = None;
    % S! f; Z0 {2 A6 I/ z
  44.         self.alive = False;
    4 d. c5 c4 K+ E; H
  45.         self.waitEnd = None;
    ( d2 p9 ]: z% e: `0 N
  46.         self.port = Port;
    & Q; q$ Z9 m8 m6 K) x3 d
  47. , p+ Y; ]* G! Y- [8 \2 J4 `\" }( q8 P
  48.         #TCP部分  [! Q8 s# z) \' ?; \* T\" C
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)5 m+ ?# w; ~& j* }9 b+ O- t
  50.         self.connection = None8 B' c% |- K0 `) c
  51.         #数据5 f- F+ B8 F+ s\" F( Y! P; o6 X
  52.         self.snddata = ''
    3 Z1 M0 m* F. t6 d
  53.         self.rcvdata = ''8 {4 u+ j& U5 x2 D1 X& }3 U0 F7 H: _

  54. ' T7 n# W0 i' F* b1 Q: b: u
  55.     def waiting(self):: W! I  k2 z9 m* m
  56.         if not self.waitEnd is None:
    ' u( L# ^# M$ F\" O8 w* J4 N8 j9 f
  57.             self.waitEnd.wait();
    \" J2 |; r; f  d\" I, O6 G

  58. 7 R# c, m$ i' C. ^5 Y\" |9 \/ O

  59. / `. E0 b8 }1 q# x\" S$ y( \6 S5 d
  60.     def SetStopEvent(self):
    2 z. t) \$ |& u
  61.         if not self.waitEnd is None:
    - `9 I5 s- T/ n* f6 h3 D3 j
  62.             self.waitEnd.set();4 T; T6 N2 ]! @) @6 z
  63.         self.alive = False;
    1 j( l& x* ^, h$ W* ^/ Y, P- T
  64.         self.stop();
    * g, H# H/ O9 u) }; h. {
  65. 2 |+ k. X* a$ f1 M2 r/ w4 ?
  66. 9 X1 Y! ^9 n/ U  v8 H/ `. w
  67.     def start(self):- a1 l- h3 k% p  C1 B6 h, F5 f
  68.         self.l_serial = serial.Serial();
    \" _; x7 o$ J- y2 t; h0 b
  69.         self.l_serial.port = self.port;, n* a# L; x; J
  70.         self.l_serial.baudrate = 115200;/ f0 I3 F\" I1 f0 @( l
  71.         self.l_serial.timeout = 2;  #秒5 y* x$ Z& R8 Q$ k' X) k, P
  72.         self.l_serial.open();1 r# f6 W: a# M& Y4 f# x* X
  73. 1 Z- g& L) ?5 V. U; p+ G
  74.         if self.l_serial.isOpen():
    - u4 I# o. r: f) Q2 D
  75.             self.waitEnd = threading.Event();
    / v! o5 z, o\" d# Q
  76.             self.alive = True;) J* s/ ?3 V- A\" C$ A/ u3 \
  77.             print 'open serial port %d ok!\n' %(self.port+1)
    2 ~5 ^\" T. t2 d8 ~+ ^3 k: }; S
  78.             print 'baudrate:115200 \n'* e& K. U$ X( e) C5 n+ W\" K
  79.             self.thread_read = None;+ S4 a  p5 A! [& q\" N+ o
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    2 i' K$ t/ Y6 r1 M# b
  81.             self.thread_read.setDaemon(1);1 G6 S: |8 H0 e8 L7 o2 i
  82.             self.thread_read.start();
    7 M; `. u. K9 F8 \. _. F

  83. 1 w$ c' \( s/ [2 v6 A. ?% u5 \
  84.             self.thread_write = None;& j\" b# b# v+ [/ r
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    8 [6 H, a# p  J) ^$ S( P& `0 I
  86.             self.thread_write.setDaemon(1);' O9 i, Z0 T# D: F) o3 o5 T
  87.             self.thread_write.start();3 e6 ]\" \) |' k9 K\" d9 w
  88. 1 G2 H6 d& ~% R0 }; B- }- o4 Y- o
  89.             #TCP部分5 L  E5 x# O5 p0 E: w
  90.             self.thread_TcpClient = None;3 s) V% }' m2 i) @
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);9 [$ J1 ^, X$ u
  92.             self.thread_TcpClient.setDaemon(1);
    / F! k. W! V! s1 Y1 n+ m
  93.             self.thread_TcpClient.start();
    - g$ z7 ^* v* U4 t; _8 P

  94. - d' k  n/ z5 k. I1 g0 H
  95.             self.thread_TcpSend = None;' e0 B) p. k% m+ D$ v1 Z% Z. }
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);
    , j+ L* N! {. `
  97.             self.thread_TcpSend.setDaemon(1);5 |\" w7 y. w4 W
  98.             self.thread_TcpSend.start();) T2 e. S\" T1 h0 V4 @1 R

  99. , q- z- t4 G\" Z0 ^/ K& |
  100.             return True;! B& S! @2 p$ S$ f, X# M2 [\" ]
  101.         else:
    1 x* z, W) f) J5 R
  102.             return False;
    & K6 J; Z# ^$ |& a

  103. ' l\" ~  T/ A& u2 b3 H
  104. 6 s& F: U1 N/ p- \0 ^+ G4 P
  105.     def FirstReader(self):+ f% L9 C5 ?0 ^5 N8 ?8 l7 i4 ~- ^
  106.         while self.alive:) f' j; L7 d9 T5 u  q) e- A
  107.             # 接收间隔
    2 M9 y\" ^. L3 _: M) F# M: O
  108.             time.sleep(0.1);& {6 q) S$ E, q5 g6 P
  109.             try:
    , D$ n* s! i( S6 e* q* p) K
  110.                 data = '';* i, G+ G, i0 }) p/ z
  111.                 n = self.l_serial.inWaiting();
    $ H) M6 V; X0 j5 x& Z# O
  112.                 if n:
    , n# S7 o- T- E' L
  113.                     data = data+self.l_serial.read(n);
    ( }$ b8 C5 F4 A+ c) D% b* `
  114.                     #for l in xrange(len(data)):
    9 f7 M: c/ y5 d5 Q2 G
  115.                         #print '%02X' % ord(data[l]),
    0 {7 v! J9 s/ [4 K  h4 X
  116.                     # 发送数据
    3 M0 g, g( J: R) l2 G
  117.                     print u'->请求:'
    $ \9 K# u  j$ ^( g; [, g
  118.                     print data;
    $ K% u* m% ^# E: m
  119.                     mylock.acquire() & [3 _# u2 j! q0 x+ M5 h
  120.                     self.snddata = data
    . n: v) K5 U+ r; f, I; h6 T5 J\" n
  121.                     mylock.release()
    6 q- E% p, }\" i0 o
  122.                     #print_hex(data);8 }1 V! t8 `4 c2 T6 \
  123.                
    / K8 W5 p0 ~& H8 {* P$ D4 B6 q
  124.                     % Q' V6 q, o: |+ e8 R* u5 E
  125.                 # 判断结束
    6 i; P2 I& [; }' M  B7 \. N, ?* @
  126.                  e0 o# J' M0 ?- U; L1 G
  127.             except Exception, ex:+ M+ G+ _$ p! d
  128.                 print str(ex);
    9 c3 x7 {* N3 s% E

  129.   s8 E6 M4 j5 e  l* @! K) a
  130.         self.waitEnd.set();5 N, ~8 \7 c! Q- D, Y* Y
  131.         self.alive = False;
    : V1 n\" ~\" d/ m3 F2 Q( h

  132. + V5 v\" p. o' L. Z
  133.     def FirstWriter(self):; Z. e6 K) G# g2 H; }! u5 i
  134.         while self.alive:
    ) c0 p\" P; i+ s2 f4 u3 x* [
  135.             # 接收间隔! q+ \' X4 ]- _0 R* f, G1 e$ |
  136.             time.sleep(0.1);
    % z/ ^9 x  A- |' r8 H
  137.             try:% R1 X9 d, s+ c5 x1 n\" e. R
  138.                 #snddata = raw_input('\nenter data send:\n')/ K$ N& @  }. R: j+ i: ?( F
  139.                 if self.rcvdata!='':, u/ L0 O7 @8 \+ E) t( c
  140.                     self.l_serial.write(self.rcvdata);
    6 ^  r4 Y- F/ E
  141.                     print u'-<应答:'
    1 y# E' K7 Y/ t5 k% v
  142.                     print self.rcvdata;
    8 _& S  M* e+ Z! P
  143.                     mylock.acquire()
    2 e- u, U) ]6 v  a& g
  144.                     self.rcvdata = '';/ n- p) u$ w) \\" k: b6 S# F
  145.                     mylock.release()\" B  u8 Q8 ?' |$ Y2 |& f
  146.                 #print_hex(snddata);
    0 Z6 ~9 G2 P: C2 p
  147.                
      g1 |$ v/ F! o. Q9 P
  148.             except Exception, ex:
    4 \) H% f0 C& A/ [0 z1 q) h* O
  149.                 print str(ex);% S+ M2 U( V4 ]  ]7 ?- d
  150.         self.waitEnd.set();3 K# w$ Y/ @( `  j
  151.         self.alive = False;% h; p; F: A& u+ a2 D\" |6 i
  152. 9 x& i* F2 L5 h7 X, m+ J$ {
  153.     def TcpClient(self):
      _0 J$ N! w$ b. c# [0 O
  154.         while True:& F3 U, b+ u1 U* y( i/ J$ q
  155.             # 接收间隔' S8 n/ o- J( w* {5 S6 G\" c. j2 H4 Z
  156.             time.sleep(0.1);\" S6 t4 W+ h- o8 S0 }; ]
  157.             self.connection = socket(AF_INET, SOCK_STREAM);3 V' I5 |( a3 s5 ^- K+ M$ F
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    1 h. c2 j& t- r! n: V5 V$ K
  159.             print 'Connect to Server OK!';* C! s# }2 A/ _9 ^6 A
  160.             self.snddata = '') v, S% N' ^4 K0 Q
  161.             self.rcvdata = ''' b& e7 J2 V8 [% G; k
  162.             while True:\" m9 U7 m! n+ [$ @& C
  163.             #读取客户端套接字的下一行
    ' x0 k- G% }! V& t* F& }  k3 _; `
  164.             data = self.connection.recv(1024)0 k( _' r% g5 f
  165.             #如果没有数量的话,那么跳出循环
    # i* W7 O8 C8 I& s
  166.             if not data: break
    / l9 j, Z; O' Y! G3 u
  167.             #发送一个回复至客户端
    , G- A( ^/ y# }4 l
  168.             mylock.acquire() \" v( i0 ^5 Z. J% p\" \) q- C
  169.             self.snddata = ''* _2 l3 l% |: P$ _( A
  170.             self.rcvdata = data
    3 S% ^\" m% m1 ^/ ?1 g( @! {
  171.             mylock.release()
    ) c$ X. D8 E$ Y3 s
  172.             #connection.send('Echo=>' + data)% h3 q3 ?( I9 p; \0 l# U) x
  173.             self.connection.close()1 |' v: r. n0 W# |) F
  174. - d% ?# `% {) a, ~6 m2 C, D
  175.         self.waitEnd.set();4 `# u1 ^8 y3 ]+ ]! |3 [! Q, G
  176.         self.alive = False;  ~0 P4 l% V+ m, Z; u. e! F( M1 S
  177. 4 n$ y* e* u2 ]8 l% z: ?9 E- `1 a- ?
  178.     def TcpSend(self):* |# t5 p$ V0 u0 t$ R% Q0 \$ G) m$ f& Q. ~
  179.         while True:5 I- H+ @# M  E: F% D9 ^6 q
  180.             # 接收间隔) k0 t$ T; ~2 `
  181.             time.sleep(0.1);
    $ q7 k/ `: M+ ?/ s/ A) p
  182.             while True:7 J\" M' s: G' C2 o9 Y, j
  183.               time.sleep(0.1);
    ) O, q* u; r6 s
  184.               try:: V9 `7 N5 ~4 n  i
  185.                 if not self.connection is None:
    3 I) E3 g% h4 p5 B: [
  186.                   if self.snddata != '':
    / Q) a: X7 H! n1 t; N& ?, B
  187.                     self.connection.send(self.snddata)+ Y: ?0 k: y. B5 ~6 L5 k2 I8 U$ a% e
  188.                     mylock.acquire()
    : E, M+ K8 X! R% ]* I
  189.                     self.rcvdata = ''
    5 g+ h* P; `7 E\" o6 a$ h$ N; x$ C! @
  190.                     self.snddata = ''
    / g4 b6 w) S4 E2 ^1 g
  191.                     mylock.release()
    0 S- }3 I* g( Q; L1 S
  192.               except Exception, ex:
    ) a# ~8 F, n. I1 @0 j7 O% F
  193.             pass        / |9 x# ^0 B+ o* `! E/ a
  194.     def stop(self):
    # T. H$ L+ I/ x9 ]1 m. ~
  195.         self.alive = False;0 g5 @4 m+ T) W: Y0 T  z
  196.         self.thread_read.join();
    $ Q/ {5 [% v9 v6 i4 z9 f
  197.         if self.l_serial.isOpen():% y) j# X, o' w. p/ d
  198.             self.l_serial.close();
      Q' K) N% }. b$ r4 R! e% h7 ?) r

  199. 0 t\" m) W- Y0 f8 ^2 g8 J
  200. * M/ k. W) Q9 J

  201. & M* N6 n& y9 p6 \2 V4 e
  202. #测试用部分; q$ V5 }) N( y' m
  203. if __name__ == '__main__':7 J: e8 b\" e; c! a( K5 I+ o; Z
  204.     print 'Serial to Tcp Tool 1.00\n'
      y; f  v: ?' c4 G
  205.     print 'Author:yangyongzhen\n'* c  G! R+ \# e( E4 @8 c( E9 B
  206.     print 'QQ:534117529\n'! ~% a6 t+ L( S4 _# n
  207.     print 'Copyright (c) **cap 2015-2016.\n'
    , d. A/ s# R$ {1 g\" h- T0 ^

  208. ! }\" }8 ~% `2 J, w
  209.     Server_IP = raw_input('please enter ServerIP:')
    ' T\" i& X* k; P$ V$ a  X
  210.     print 'Server_IP: %s' %(Server_IP)
    9 Q$ y/ A! j$ E1 z\" `
  211.     Server_Port = raw_input('please enter ServerPort:')' A& o2 o5 E, n' C0 E( F, Y
  212.     print 'Server_Port: %s' %(Server_Port)
    \" p: `7 w1 e6 ]4 \6 ~( g0 D
  213.     com =raw_input('please enter com port(1-9):')5 @( r- u0 o/ y! ]
  214.     rt = ComThread(int(com)-1);
    - d0 W6 v+ Q8 d
  215.     try:9 L$ E0 W\" i$ o0 G% {( ~
  216.         if rt.start():
    8 ^1 Q) `' U/ p! E
  217.             rt.waiting();
    , N2 ^5 u. B: i' u
  218.             rt.stop();
    0 g, V! ?  H: y
  219.         else:5 k7 J. e1 }+ O* F- H
  220.             pass;            
    6 }3 i; ?, x) q) E8 M/ C, Q) I7 E/ Z
  221.     except Exception,se:
    & @9 X6 v- d8 I. R
  222.         print str(se);& q8 u9 T* p( @8 u, u

  223. 7 O! r/ {4 \7 L
  224.     if rt.alive:$ e8 [  S- B3 _2 K1 \( i
  225.         rt.stop();3 {* Y6 o\" l, Q
  226.     os.system("pause")2 i4 \. g1 t' k* |

  227. : t0 P0 d) ~\" s' w
  228.     print '';8 a( I9 h4 G! _. g7 K- P5 p0 f
  229.     print 'End OK .';
    3 U8 T; f6 ^/ ]5 G& |
  230.     del rt;
复制代码

1 l6 _1 M, f  J8 h
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-6-3 00:52 , Processed in 0.568292 second(s), 51 queries .

回顶部