QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-85 A3 Y, I\" p/ v! N/ l: c' s) z3 e
  2. % S2 N0 e1 Z; S% l9 [\" u

  3. - X8 ~1 `/ R* v1 X$ |. ~7 k2 ~3 P
  4. import sys,threading,time;, |- z5 `3 K* \2 X
  5. import serial;0 c6 O, G1 B- C6 K5 @; u3 h% p% ?
  6. import binascii,encodings;
    : R9 \: m# H2 Q& y# ~8 N5 `
  7. import re;
    $ k& m* U5 X) o; A# D
  8. import os;* ^6 I3 m4 h  Z5 j( ~
  9. from socket import *. _\" |2 a) y9 }, Z2 f: a$ C: _
  10. from struct import *;7 P* y5 g  Y4 u! i- A# ?3 A* E
  11. #from myutil import *;( ^% ~\" r3 _5 w5 d
  12. #name: myutil.py
    ) ~% k$ U7 A% j/ t+ B\" z
  13. 5 I9 N% [- S9 i\" W( k
  14. mylock = threading.RLock()
    ! ^4 H# d+ J) Q% L/ g; x$ Y+ v2 k

  15. 5 ^4 m7 q9 O% X7 F\" X
  16. Server_IP = '') |$ ^8 ?6 T3 v+ o7 J! q
  17. Srever_Port = ''
    # _3 l\" H6 n% b( ], t9 O

  18. 5 E+ Z4 z' s+ P# }) Y' a
  19. def print_hex1(s,prev='0x'):
    8 k/ y8 Q) h! i7 H- e  r2 b
  20.     for c in s:
    - I* M) d; q. s
  21.         print '%s%02x' %(prev,ord(c)),
    # B* b3 N/ t5 }7 Q4 z\" L
  22.     print
    ' e/ H$ ?5 Q! s: i
  23. def print_hex(s):
    + k1 N& D) X# j8 S- o6 l! g
  24.     for c in s:
    ( l7 r+ w* v% c  A
  25.       print '%02x' %(ord(c)),
    2 X- X+ N* S# ^' [9 b
  26.     print
    # P; w$ H/ ]' y2 R: K
  27. - }9 u! o. o, ~
  28. def hexto_str(s):: g% _5 T6 N# G1 _5 `  M
  29.   r =''
      h4 q) S+ v. T
  30.   for c in s:$ X: f* {8 C' w0 ]
  31.     r += '%02x' %(ord(c))  P/ z* R! H9 K# {
  32.   return r
    : ^1 k9 \9 c! w9 Z: I# x! D# T. X1 \
  33. def strto_hex(s):! j0 ~1 V) Z  G( a% j; Z
  34.   r = s.decode('hex')
    ! ]4 u# U) V0 S- I6 q1 v
  35.   return r
    8 ]; V4 l\" p/ R+ Z, w
  36. #''代表服务器为localhost$ J3 n' s4 D& [0 ^% L% d( p

  37. : h$ c+ D) z* @3 u( u# r' ?
  38. #在一个非保留端口号上进行监听
    5 E: V7 `; I$ u4 d

  39. ' S/ c$ }' d7 I7 n! I

  40. # F/ G/ X% }1 N7 {& D2 [9 [, b
  41. class ComThread:
    8 P5 w: y. o2 H$ S1 n
  42.     def __init__(self, Port=0):
    - t9 {2 N$ _( z4 L
  43.         self.l_serial = None;
    + V) p\" {( d, `* j# ~5 X. M
  44.         self.alive = False;
    7 q( [% R5 I3 p3 H
  45.         self.waitEnd = None;\" s0 U7 r0 V\" J  J: T
  46.         self.port = Port;
    - n4 @3 e5 P1 Z# f( `3 y

  47. ( a, ^( Q1 b, a+ Q6 e- S; m
  48.         #TCP部分. g2 J! _2 A# [* Q, i
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ' \. T- _' V+ ?7 D
  50.         self.connection = None
    . y. ~) w. v% W5 b$ e
  51.         #数据
    ( a7 ]5 v/ e- z6 @
  52.         self.snddata = ''6 r5 |9 i$ n- X: g  m6 F; Z7 F
  53.         self.rcvdata = ''
    2 Z+ L8 F' c% V. s* L6 b0 K! w
  54. ' t6 ^8 X\" n9 D! H- p. |9 M6 U
  55.     def waiting(self):
      _\" W; v. D. ~9 U/ V, b  {
  56.         if not self.waitEnd is None:# f8 r: h! N) S1 b
  57.             self.waitEnd.wait();( O3 Y, F9 z- L$ s

  58. % F2 \6 ?\" @) f* V8 s7 q3 i0 H

  59. 1 d3 e! Z' M' ^$ s
  60.     def SetStopEvent(self):' C7 E' [- J8 a% U% x
  61.         if not self.waitEnd is None:0 }* B+ ]# c% W# L- F4 W+ P
  62.             self.waitEnd.set();1 m/ k1 E+ U3 e& A  w
  63.         self.alive = False;& O2 q/ ]- x% Q
  64.         self.stop();) [7 F  H- a1 \) j, L
  65.   x( ?0 [$ f  @2 ]2 D
  66. 0 h: m4 P; Z8 S
  67.     def start(self):( x\" |  h) n- I* F: H
  68.         self.l_serial = serial.Serial();
    + f, Z! s8 j, [: X
  69.         self.l_serial.port = self.port;
    3 h5 S/ Q% H/ w! [' j
  70.         self.l_serial.baudrate = 115200;
    3 Z; O- ?% k# ?# D( R# U
  71.         self.l_serial.timeout = 2;  #秒
    4 v5 R0 T) |8 u) Y' {2 v; p
  72.         self.l_serial.open();* }  z. W! ?8 d9 b\" d/ h+ x. ~
  73. 0 b8 a! @; [+ N\" L\" a
  74.         if self.l_serial.isOpen():6 w6 p& v0 r$ u$ W
  75.             self.waitEnd = threading.Event();- i8 J$ F$ h- y9 h/ w8 V6 R2 {
  76.             self.alive = True;' f/ s9 R8 K2 E; G/ a% |% F6 I
  77.             print 'open serial port %d ok!\n' %(self.port+1)* G6 [+ E% Q- W
  78.             print 'baudrate:115200 \n'
    ) P# X7 h% [2 j! i& x& f6 ~. E* t
  79.             self.thread_read = None;
    / I5 B7 c$ ]! y+ M4 ~
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    \" R& y% E/ A$ h' H
  81.             self.thread_read.setDaemon(1);% L; ^0 L1 ^+ e5 U9 C2 M: Z
  82.             self.thread_read.start();
    0 E9 K' q6 ^0 S# E! z4 j' b1 B
  83. ! D: A8 ]$ J, V2 e  |* B3 |
  84.             self.thread_write = None;' }: w+ c# m. P
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    * Z6 e. h! H# t: @/ ~
  86.             self.thread_write.setDaemon(1);4 b# e0 ~3 [+ @5 w
  87.             self.thread_write.start();
    0 r& R% u, d$ G; }6 u\" ?  i( c3 o
  88. 3 y; ~\" f: C# x1 m! q# I
  89.             #TCP部分
    ; X4 R) [2 N% y6 e  l
  90.             self.thread_TcpClient = None;
    0 N4 |9 ?$ _  @, V$ i0 c3 h4 P
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);7 N% r  E. f5 X, l+ f. B
  92.             self.thread_TcpClient.setDaemon(1);6 {5 u- l+ M) k1 N# C\" O% x
  93.             self.thread_TcpClient.start();
    * P; k9 d; G  O& o! s5 Z\" {4 v
  94. & M  V# o2 o. c2 @\" ?$ L1 D
  95.             self.thread_TcpSend = None;$ Q% O( W9 s$ a( C
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);% ], d8 S4 [! ~
  97.             self.thread_TcpSend.setDaemon(1);* }4 p, G+ `) m+ F1 ~8 v
  98.             self.thread_TcpSend.start();5 ~0 [, v8 w) q\" [) K1 ]

  99. ; [) J$ k* s/ Z( v$ P$ ~
  100.             return True;
    7 M& y; k% E5 Q# _
  101.         else:
    1 O7 D# S\" X/ S! d+ k- r
  102.             return False;. {& d& P( g3 S- ^
  103. ) X2 e/ t6 F\" s; ^
  104. \" D* W/ Q7 G: g  v' T4 p\" I# x4 V
  105.     def FirstReader(self):% h9 e2 }- h- ?\" y( z( A
  106.         while self.alive:7 c8 ?7 d( l1 I/ |* {5 T
  107.             # 接收间隔% N, Y* t+ j- ~
  108.             time.sleep(0.1);8 J$ d7 B+ b7 }6 P/ K
  109.             try:
    3 ]8 E( z\" G+ k% i
  110.                 data = '';
    ' A* S8 f1 x. ^  f! w& ?
  111.                 n = self.l_serial.inWaiting();
    2 F1 X& J+ s6 H6 I
  112.                 if n:
    ( A8 e0 v* E: S) }
  113.                     data = data+self.l_serial.read(n);/ J6 G6 d! ]9 b* B2 @/ h% r
  114.                     #for l in xrange(len(data)):6 K8 }4 U1 }4 h8 y
  115.                         #print '%02X' % ord(data[l]),: ]0 `\" i; f) N- Y' }0 B8 n
  116.                     # 发送数据' O$ f) _% I' P9 `1 E: e
  117.                     print u'->请求:'7 z; p  l6 c7 S9 k\" ]5 G. E
  118.                     print data;# e+ K5 L6 W9 l5 ^$ G2 W
  119.                     mylock.acquire()   {0 B  g. k5 @; u6 E* d8 d
  120.                     self.snddata = data; ]( @4 v4 G2 V) u& h\" U1 @3 O
  121.                     mylock.release()
    5 O5 n5 M0 q4 L$ Z) g+ [
  122.                     #print_hex(data);
    ( n/ q* }+ k! |1 ~/ T( s$ S! h\" I
  123.                 7 H: j# A( R0 S
  124.                     
    & V9 Z; A0 c7 ^: K% s/ U
  125.                 # 判断结束
    8 b' O8 a6 n* o\" z' Z
  126.                , b) p  R  W* i$ W; @
  127.             except Exception, ex:
    * N+ z( @: I0 v7 }9 P
  128.                 print str(ex);
    \" T* M0 V' Y1 F\" U/ `/ i

  129. . ?4 |+ [) E( S3 w: V% a2 e+ C
  130.         self.waitEnd.set();9 q$ }- X( v% _1 f! ~- A# E- x, e0 p
  131.         self.alive = False;4 |! K: S$ Y. M1 y& k6 L

  132. ! Q; t$ ^# L+ h) {% v% A3 B! L; Z
  133.     def FirstWriter(self):8 ^+ [\" D5 @5 F8 I\" t9 h  C
  134.         while self.alive:
    * _9 s7 m2 e0 {; T. v) O3 j- z2 S4 \; b
  135.             # 接收间隔+ i' D8 ~( u* Y3 B9 [# e
  136.             time.sleep(0.1);- G- }9 P5 d* H6 U
  137.             try:+ C. k# j2 i! i) c
  138.                 #snddata = raw_input('\nenter data send:\n')
    4 A, X/ Z5 Z6 |3 F9 }9 p$ N* e
  139.                 if self.rcvdata!='':& Y3 D+ U9 o- z* W  s/ t: n6 Y6 L
  140.                     self.l_serial.write(self.rcvdata);
    ; p& u7 y  ?3 ]) ]$ B% t
  141.                     print u'-<应答:'
    . p( C$ g\" O/ Q  J: w+ [
  142.                     print self.rcvdata;( q/ l! s# c! ^; n9 ^
  143.                     mylock.acquire() 6 g/ e% Y+ }8 q/ P, D5 ^' k
  144.                     self.rcvdata = '';
    & l4 k! b1 W  T( r* T: s8 F8 O
  145.                     mylock.release()
    % L: E5 P0 d  [& s3 I! f
  146.                 #print_hex(snddata);
    1 r/ G; o& f& l1 n/ d7 K3 V
  147.                
    1 x5 e/ M9 @/ @! S7 o
  148.             except Exception, ex:
    / `; G! t6 A4 v/ V) g, l' u7 U
  149.                 print str(ex);
    ; R$ A& L4 S. b' x! X/ c1 p
  150.         self.waitEnd.set();% l* F& K! M. z# i4 H+ p
  151.         self.alive = False;
    \" t1 a% L, G4 I8 @9 u' @# i
  152. $ G. t7 k; K# }5 C: |4 c
  153.     def TcpClient(self):2 s0 V& N4 ~0 K9 u. T
  154.         while True:
    * ]& E3 t$ y: V: d
  155.             # 接收间隔/ Q/ E7 m: d2 S
  156.             time.sleep(0.1);
    & h! c$ L4 X  c( c6 J
  157.             self.connection = socket(AF_INET, SOCK_STREAM);; ^% D3 n1 w\" h
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    ' V& i. ~, _2 y7 J3 ^0 ?
  159.             print 'Connect to Server OK!';3 K' V9 U1 c; }2 O
  160.             self.snddata = '') a\" z# f: |, z; W
  161.             self.rcvdata = ''
    , c- {' ^+ J$ s. u8 J1 [
  162.             while True:
    - V% v9 f! g6 T0 t+ ?, m
  163.             #读取客户端套接字的下一行7 [% c4 B6 n( Z9 T
  164.             data = self.connection.recv(1024)  o0 b; Q1 U# y  f+ ?! q
  165.             #如果没有数量的话,那么跳出循环! x, e5 U' _1 G' @; ^
  166.             if not data: break
    8 c5 g0 R- K; G: J
  167.             #发送一个回复至客户端
    # e. f3 t) k. F\" y6 b) |  w
  168.             mylock.acquire()
    - T( o\" Q5 x1 g1 z) {* a2 x
  169.             self.snddata = ''/ \$ H6 t, m  Y
  170.             self.rcvdata = data5 b% Z! Q1 J; N! O$ v% m6 z
  171.             mylock.release(): i. f' E2 B4 X- v9 p7 p3 r\" c
  172.             #connection.send('Echo=>' + data)
    . I4 y( C6 r\" F' h2 b6 _
  173.             self.connection.close()
    ) A) F) p6 h& W: m/ d

  174. ! l7 u, J- a, f
  175.         self.waitEnd.set();# O; P+ p3 k9 i# L. h8 L& V0 q
  176.         self.alive = False;
    ' Q) i& l) ~: U  j

  177. ; @6 T! G7 \( c  a6 K$ n2 F* ]
  178.     def TcpSend(self):3 P( L1 L- _: K7 \! e* b9 B1 Y
  179.         while True:$ g8 D! _9 F\" k9 }1 t) q
  180.             # 接收间隔1 y* @# Q8 S2 G. B
  181.             time.sleep(0.1);
    ' ^! C; l6 B; E$ d2 N\" B0 F8 A
  182.             while True:
    ) q5 c. @\" y! d9 B
  183.               time.sleep(0.1);* p3 V. d\" q' R
  184.               try:* U4 y4 a# Q  c4 U4 C) y2 i' m7 I
  185.                 if not self.connection is None:
    5 y3 X: o6 A( z) ?, \% J
  186.                   if self.snddata != '':
    + }( ?0 r; V+ ?( m+ Y1 a
  187.                     self.connection.send(self.snddata)
    / I9 `3 |1 E  w
  188.                     mylock.acquire() / V! @8 l2 Y% Y! s& ^
  189.                     self.rcvdata = ''
    - W  E) ]) S8 f% X
  190.                     self.snddata = ''
    2 w$ Y) ?9 z! q/ x4 e
  191.                     mylock.release()
    ! j; c5 x+ d9 R, o3 D9 B
  192.               except Exception, ex:
    * l, |% c) C+ L& C
  193.             pass        / j3 m) `# y1 |$ h$ \8 w
  194.     def stop(self):' k; k9 R( m) E% t
  195.         self.alive = False;6 v  J, C6 K9 Z5 x, Q; _2 X4 C
  196.         self.thread_read.join();0 T+ t5 K  i' y2 B, D5 o5 x
  197.         if self.l_serial.isOpen():: @( F  h) s6 s- C2 t, n
  198.             self.l_serial.close();
    8 i\" R( s3 d! I1 K  u8 B( _
  199. * d; T! \, K3 z/ ^6 R

  200. ) s1 s' {  f/ J( g, E: ^
  201. . u* F2 N; j% o' ~4 P3 B
  202. #测试用部分/ f5 u7 c8 i% ]7 k\" N. k
  203. if __name__ == '__main__':
    0 s) r' T% n\" h/ D* h\" ^/ c  a
  204.     print 'Serial to Tcp Tool 1.00\n' 8 B) b& P. a2 N3 x; M: K. h1 _
  205.     print 'Author:yangyongzhen\n'! T  Q: {: {- `/ V
  206.     print 'QQ:534117529\n': Y& u4 M4 R) h' w
  207.     print 'Copyright (c) **cap 2015-2016.\n'. ^0 |+ _( e* G' |- `/ }

  208. # y3 ~8 B! b4 D$ t
  209.     Server_IP = raw_input('please enter ServerIP:')
    7 Y9 ~1 G0 c; J' r) o2 D
  210.     print 'Server_IP: %s' %(Server_IP)
    ! x) `3 I1 h7 ]% e
  211.     Server_Port = raw_input('please enter ServerPort:')
    + K. _# e\" h. Y) L
  212.     print 'Server_Port: %s' %(Server_Port)
    1 W6 `+ F9 d% z  u% G. Q
  213.     com =raw_input('please enter com port(1-9):'): ?4 D* g# `& ?\" ~/ p
  214.     rt = ComThread(int(com)-1);
    ) n& z\" N! ], G/ r& d- c7 N& C* ?
  215.     try:
    ; l) B) u8 E. L- h, Y: f
  216.         if rt.start():/ W* R6 B2 P6 h+ k- s3 o* J
  217.             rt.waiting();
    . T0 k: P9 }* K! F0 h, X8 Z( p
  218.             rt.stop();
    7 M5 h# z( B! d: e9 v8 S8 E  V
  219.         else:
    # M1 p0 C) d; t6 d( R
  220.             pass;            
    5 y0 c4 |+ ]. `8 \& \. n
  221.     except Exception,se:
    3 d/ }: B+ @2 g$ X% N
  222.         print str(se);
      K* C4 i- G\" h  Z

  223. $ G, z) ?6 o8 B8 e/ l3 ]+ v' [, F
  224.     if rt.alive:
    $ p* K$ d2 j$ n  w/ y
  225.         rt.stop();\" W% l$ z4 r8 y+ ~
  226.     os.system("pause")) N, T0 S* X0 ~( X' B3 [! @
  227. ! D! n% c) c( p1 \, y: N* n. |
  228.     print '';
    6 w5 i, v9 A; \4 T; X. R
  229.     print 'End OK .';
    : {/ M, W1 R+ a* ^
  230.     del rt;
复制代码

' V7 i1 ^, B& g" \/ n
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 06:13 , Processed in 0.508416 second(s), 50 queries .

回顶部