QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    2 f, g* ?9 r2 P# d' J: C+ F: W# Z) c
  2. , P4 ^7 F6 C9 U0 v/ e) B\" v& e
  3. / `5 e( ^3 T+ G6 \
  4. import sys,threading,time;
    9 x* {. e) M& r' R: X
  5. import serial;
    ( ~- t) w) K4 }6 M' j
  6. import binascii,encodings;/ [+ E5 m$ I$ k1 h
  7. import re;
    2 r4 c/ y; p2 ?( r$ ?& a* P; {2 K
  8. import os;3 j% D  t8 K8 Z1 J
  9. from socket import *
    7 r$ P2 @$ m; p) P% r
  10. from struct import *;
    2 n9 _2 m# e; o5 o
  11. #from myutil import *;  m2 I2 d# [0 d: \
  12. #name: myutil.py( f' ]- F, n# f

  13. 7 ]6 w! {$ Z5 O: \( o
  14. mylock = threading.RLock()
    ( u' o3 T% x\" ~6 a
  15. 5 |. N& @\" Y* U# d2 ?. _
  16. Server_IP = ''
    8 |7 p, p+ K& b
  17. Srever_Port = ''
    : ?8 Y6 {\" A# m, A6 |: T# Q# ?
  18. 8 B- R. r+ J9 k8 G  g
  19. def print_hex1(s,prev='0x'):
    ' R7 Z7 y% P8 o8 E& J+ N1 U
  20.     for c in s:
    ( T% N- [# l4 x+ a) Q9 |
  21.         print '%s%02x' %(prev,ord(c)),\" E% D0 H3 C. ~( a# i- j5 V\" g/ ^
  22.     print
    ' Q. ^* e% b- N$ X0 I: W5 x
  23. def print_hex(s):+ A& ^- K\" U  `
  24.     for c in s:$ m0 y0 b& }$ j% y6 l; u\" i
  25.       print '%02x' %(ord(c)),
    1 }: I, e. g2 ^8 c0 ?8 Y4 n
  26.     print
    - B! y8 O) Y& z
  27. + h0 x& \. C: g2 q/ H5 Y
  28. def hexto_str(s):0 L: f6 O; ^3 M/ T
  29.   r =''5 V$ [4 {; @$ t
  30.   for c in s:
    0 W& h% O! G& a2 I4 m
  31.     r += '%02x' %(ord(c))
    \" ~  K4 t% c, M, `& D\" [7 _4 v
  32.   return r
    , N+ S# @$ m* H
  33. def strto_hex(s):% ~$ `9 S\" i/ s- f) N
  34.   r = s.decode('hex')' R( K! o, J5 P: w' F* b( Q; i
  35.   return r
    # {5 |) F2 v4 w  l
  36. #''代表服务器为localhost  m: M' T/ D% A  }
  37. 4 Q2 O  f9 q* Z6 ~\" F
  38. #在一个非保留端口号上进行监听; @8 k, e5 M  _% g2 |1 e/ j) k
  39. , g$ t. G- Z\" f

  40. 4 N, ^2 y0 y9 A1 Q' h
  41. class ComThread:
    % y8 ]8 V& {\" |. \
  42.     def __init__(self, Port=0):3 Z6 K; b  _+ {# Z' g& P: j9 t- ~' ]
  43.         self.l_serial = None;
    2 M9 i& t& A7 j& h7 [
  44.         self.alive = False;
    , r1 f0 N. w* Z1 d
  45.         self.waitEnd = None;
    0 ~0 S4 z. X6 ]% t
  46.         self.port = Port;- |* Y3 e5 r3 K6 B/ O/ g

  47. , k3 `. }' K7 y& ~% D6 a' o
  48.         #TCP部分1 w8 ^. A) A& W3 x5 \
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    1 e1 n( ]( P! Z. _# W
  50.         self.connection = None# y& Q0 `8 A0 h: }. X' l# H0 e
  51.         #数据3 |6 g8 C4 {0 w
  52.         self.snddata = ''
    3 x% D3 u4 j8 C0 o0 |\" i- `/ t4 z
  53.         self.rcvdata = ''
    0 K( ?2 W9 O* U- I' ]( e/ h
  54. ! c\" f\" h* S, v8 A: f
  55.     def waiting(self):
    2 k) ^\" i$ U+ C1 y/ v% ]( z
  56.         if not self.waitEnd is None:! _) y0 P& x: i  g& @4 s
  57.             self.waitEnd.wait();9 w- c' P9 L: i8 R6 F
  58. 2 E. L3 U- n6 W1 D8 U
  59. ' A' b1 X\" I- q: u) J+ `
  60.     def SetStopEvent(self):
    6 [. O. ]# y7 n  l( j+ H. F8 b
  61.         if not self.waitEnd is None:
    % X\" r: ?, \\" \) e5 R$ m. T8 I
  62.             self.waitEnd.set();
    \" F; R9 Y2 B6 k9 D
  63.         self.alive = False;+ y, H% Q0 A2 S$ C9 o$ E3 X5 ~
  64.         self.stop();
    3 `\" u+ e' M  `2 h* l
  65. 2 J; J2 j5 m  u) I\" |

  66. 0 L# u: L2 m& B& m! n
  67.     def start(self):
    & N7 _% A3 H* v# k: h
  68.         self.l_serial = serial.Serial();
    $ e$ }1 V; O3 z7 N4 l+ Y$ @
  69.         self.l_serial.port = self.port;\" m9 Y. _# m) n: h# q3 ?
  70.         self.l_serial.baudrate = 115200;; `1 C, J+ ?5 d$ X
  71.         self.l_serial.timeout = 2;  #秒  q2 {' b( f3 S
  72.         self.l_serial.open();
    + n5 a  Q- Q5 n- K' Y
  73. \" m2 P4 u3 z+ G
  74.         if self.l_serial.isOpen():/ p8 B9 k' B; {
  75.             self.waitEnd = threading.Event();+ p, w2 u; q; ]+ S
  76.             self.alive = True;
    , L+ G\" N! w5 S6 l  ^) A) R
  77.             print 'open serial port %d ok!\n' %(self.port+1)  D) u5 h5 B2 d, i% a* ^6 }
  78.             print 'baudrate:115200 \n'% G: d. T7 O* {2 X5 @& m
  79.             self.thread_read = None;; C$ G( r. c0 |1 ^
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    8 d/ [) c5 o' [; S
  81.             self.thread_read.setDaemon(1);7 c\" k* p1 Y) v1 z' z( t
  82.             self.thread_read.start();% W3 f\" l* K\" q/ |6 a5 N  L
  83. 4 |+ s7 h% ~- f/ T4 P% e7 S9 G
  84.             self.thread_write = None;' _: \8 ^0 Y- N4 I% J
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    1 L' }! `; K6 u) z
  86.             self.thread_write.setDaemon(1);. E\" ]( V5 V1 ]! J
  87.             self.thread_write.start();
      T6 N( i* P3 Y) J1 d( m$ j
  88. 1 s  w! k& u+ N7 {5 m
  89.             #TCP部分
    3 s1 j! N9 G- V5 y) t
  90.             self.thread_TcpClient = None;
    + b6 m& u( r, F* e/ l
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);
    ) I2 `9 O( P, l$ d0 O* [- f& j# r
  92.             self.thread_TcpClient.setDaemon(1);4 A2 ^\" t% _  T3 w
  93.             self.thread_TcpClient.start();- y5 c: M. s. W( ^' Q
  94. / w0 l* ?\" K) U8 S  K% P6 O5 u( O
  95.             self.thread_TcpSend = None;
    2 @# u) @/ d/ ?
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);- B- a6 E# G! ?) p6 J\" g7 y
  97.             self.thread_TcpSend.setDaemon(1);  H: x1 f3 Z. S& {7 j( a. F
  98.             self.thread_TcpSend.start();
    9 k! D! C3 y1 H; @/ ~
  99. % Z4 }& F; E9 E. }6 b
  100.             return True;& i+ Y8 p8 D4 Q- ~& ]. g; ]4 W
  101.         else:  ]\" |2 T$ Z$ Q3 ?3 x3 T, }
  102.             return False;- G% z) S: n$ l2 L2 j

  103. / n9 m; U1 d# P+ q* B  x  J
  104. , q& P+ z8 V0 g+ n% s\" o! o
  105.     def FirstReader(self):3 j\" f! l! ~8 Z+ F3 k/ U1 B
  106.         while self.alive:
    % a/ A# ^- K3 w: X5 {
  107.             # 接收间隔$ s6 h! o- i0 s- v! ]1 i% o
  108.             time.sleep(0.1);3 N# a4 ?; M3 Q9 D8 ]8 f
  109.             try:
    4 M8 p5 L/ _* b' I! F6 c5 s
  110.                 data = '';5 w5 E6 D& D7 W- l; ~& y0 H( |\" J- j
  111.                 n = self.l_serial.inWaiting();2 M: f& |8 d' u& T* G9 l
  112.                 if n:! f. Y) m( L3 o/ a0 J$ ^3 }
  113.                     data = data+self.l_serial.read(n);! H- N8 x* D0 a% c' z$ T7 ?9 L
  114.                     #for l in xrange(len(data)):' y0 C: |% F+ I5 w/ F$ ?- ^
  115.                         #print '%02X' % ord(data[l]),) m/ J! P2 O8 V2 H  P/ T0 w9 a
  116.                     # 发送数据8 Y# o, E4 Z6 I: F0 x$ I2 W1 D$ {8 n
  117.                     print u'->请求:'4 [( I; M! n5 w8 l) y
  118.                     print data;5 s3 [* B6 \# H
  119.                     mylock.acquire()
    8 F, ~. m\" \# X. {: |, ~' o
  120.                     self.snddata = data$ Z# T5 z$ x+ s3 B3 H, E- a
  121.                     mylock.release()
    ) R& x  R9 [6 ~& m
  122.                     #print_hex(data);
    . `+ B& F5 ?- r* {% [
  123.                
    $ R/ |5 T( J& Q+ T' B
  124.                     % ~$ {; e! h) {8 \. u5 O* t
  125.                 # 判断结束
    3 S\" m. I* }! Z8 U5 X0 q# i
  126.                0 _- t( S+ k& Q& i
  127.             except Exception, ex:
    ! {$ a1 G\" P* N5 Z5 }
  128.                 print str(ex);
    ! K2 `; g3 k: e1 L
  129. 3 d! b; j7 D4 a, {7 J* `6 ?
  130.         self.waitEnd.set();. V\" G  S* Z2 I. u
  131.         self.alive = False;* |& c% {. i0 h\" y5 A4 Y
  132. 3 i& X% o: A* S3 K% X# d- Z
  133.     def FirstWriter(self):
    , Y9 ^$ X. q; L: Z
  134.         while self.alive:' i6 G: ?/ C4 c) y
  135.             # 接收间隔
    * V$ M$ S# I! V3 h
  136.             time.sleep(0.1);
      b: }# F4 v- O! g
  137.             try:7 Q- w; O% t\" B7 |8 @
  138.                 #snddata = raw_input('\nenter data send:\n')3 K3 W0 ?6 Q3 I3 Q
  139.                 if self.rcvdata!='':& e8 `, I# C5 X4 \
  140.                     self.l_serial.write(self.rcvdata);
    : F. i) e- ^% M. p
  141.                     print u'-<应答:'; Q+ @# S1 B' _
  142.                     print self.rcvdata;; s5 A+ X0 p/ m
  143.                     mylock.acquire()
    ! X6 y. V% {& ]$ z\" }
  144.                     self.rcvdata = '';  f6 v: H6 x4 C0 S, Y\" u2 G
  145.                     mylock.release()
    2 z- ]2 u6 P- E, v$ V6 }1 e
  146.                 #print_hex(snddata);- Y3 L8 M6 ?/ I( g$ H
  147.                 ( ]! Z6 \' c) s  _, Q
  148.             except Exception, ex:9 O! m( e\" A7 ?
  149.                 print str(ex);# K: e\" r4 F. b
  150.         self.waitEnd.set();4 w3 q4 w' \3 B9 @3 r6 U5 b( @( C
  151.         self.alive = False;0 r% M) R* V' f# l0 p

  152. # o: Y# Q, h2 n: S
  153.     def TcpClient(self):
    $ m! N! Q; {; z
  154.         while True:
    & J$ h6 l1 ?0 K: g2 U4 F
  155.             # 接收间隔& v$ g1 ^8 f! }5 y2 k\" V1 w
  156.             time.sleep(0.1);
      F, v/ r8 Z/ T! ?6 N3 J
  157.             self.connection = socket(AF_INET, SOCK_STREAM);8 w$ C+ D6 i* x0 W& z# D+ [6 B% ~' m
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    3 p  t% d\" X. R9 n4 I: ^' C
  159.             print 'Connect to Server OK!';
    % S8 c% N# V3 u% j: h) Q
  160.             self.snddata = ''6 D5 `' l9 E* E! C\" _0 s
  161.             self.rcvdata = ''
    # }( z0 S# y! J8 J$ H
  162.             while True:6 [) }% S- g* C7 G* u5 y
  163.             #读取客户端套接字的下一行
    1 n# a2 `/ {9 s5 Q\" g2 u% _% ^
  164.             data = self.connection.recv(1024)
    - @: Z+ P) \- e: b' `
  165.             #如果没有数量的话,那么跳出循环! b9 v/ E* t$ k8 O7 Q+ w' M  h
  166.             if not data: break* q5 ]* e\" ^) b; V8 Z! S
  167.             #发送一个回复至客户端
    $ f( q  W/ m2 y; d: [& J% ^
  168.             mylock.acquire()
    - q0 [9 {4 W' w; a$ _* g
  169.             self.snddata = ''7 s( @3 q# x% x6 e
  170.             self.rcvdata = data
    8 i  m* t# g, F9 s. h( ~
  171.             mylock.release()
    9 o% p+ W* `- d+ x
  172.             #connection.send('Echo=>' + data)
    2 n- u* v5 Z; m9 n+ ^, Z0 V: t* i  d
  173.             self.connection.close()) q7 w0 N7 g$ a% v/ q3 u

  174. 2 X! }\" S) w7 n\" A
  175.         self.waitEnd.set();
    - ~* H\" k( X\" K/ o\" h. z, W$ p
  176.         self.alive = False;
    ( x- t9 h( A% O* O. d3 b( }

  177. * f3 x\" z$ N: a2 H9 N& G0 g
  178.     def TcpSend(self):
    * e% k% p4 N; W! s- V
  179.         while True:
    % o2 j% Q2 L5 n% R  g) Z
  180.             # 接收间隔) x+ R3 y: T, d+ q( X6 u/ P
  181.             time.sleep(0.1);( ~$ }  r$ J3 M
  182.             while True:5 x0 Z$ X5 O\" K2 t  G
  183.               time.sleep(0.1);; e  Q: P/ p6 C: \+ j
  184.               try:. D( l6 O+ d3 I/ C9 [( y5 F7 |8 q1 i
  185.                 if not self.connection is None:
    2 w% V4 G9 o  f- i3 C! _: z* \
  186.                   if self.snddata != '':
    . E( P( h# B; E& z
  187.                     self.connection.send(self.snddata)
      k! d8 _: s! H
  188.                     mylock.acquire()
    3 W  o0 ^& x$ n3 Q1 F) v/ C
  189.                     self.rcvdata = ''
      F. T3 S: e  x% u7 k* K\" N+ r* `
  190.                     self.snddata = '') t( Y* y* b4 |5 e
  191.                     mylock.release()
    ' Y% L% d# A2 }6 P/ M
  192.               except Exception, ex:9 _& W# X: x. I\" U& q
  193.             pass          }; L7 q\" j5 ~
  194.     def stop(self):, Y% H' b' z! G
  195.         self.alive = False;
    / i, A6 M5 F# B\" O5 j2 g+ E. B5 X
  196.         self.thread_read.join();
    9 C- U/ F\" [. l0 r  j
  197.         if self.l_serial.isOpen():
    - q/ M0 {' C- \+ z
  198.             self.l_serial.close();$ g5 K+ d* \2 ~& t/ ^% _# e( e\" D

  199. 6 {9 D6 N. L, N1 k

  200. # e  w# v. T) ?* M) n& }
  201. $ G( M6 X' T1 y( x; X
  202. #测试用部分
    + p1 o: l1 I' [2 r% p: S4 l
  203. if __name__ == '__main__':5 z- @5 \7 ]: r  q, Y5 Z
  204.     print 'Serial to Tcp Tool 1.00\n' ' s) P9 N! k# o% e2 a7 p6 I
  205.     print 'Author:yangyongzhen\n'
    ! o5 g/ ]5 }( |) q+ h& S
  206.     print 'QQ:534117529\n'2 T7 I/ S  `, k5 c! o
  207.     print 'Copyright (c) **cap 2015-2016.\n'6 g/ p7 w$ G. j% y

  208. # G( o, T, u: p; i* S3 z
  209.     Server_IP = raw_input('please enter ServerIP:')* N/ N1 B( R1 X- P' D, y) e
  210.     print 'Server_IP: %s' %(Server_IP)
    , M) Y4 H\" y\" O& _3 e
  211.     Server_Port = raw_input('please enter ServerPort:')
      R5 k3 m. y! ^/ Y# u. a4 a) A! t
  212.     print 'Server_Port: %s' %(Server_Port)' v# T! G+ ^4 Y; ^8 r; k
  213.     com =raw_input('please enter com port(1-9):')# l& U$ S$ D: e1 @$ @: M
  214.     rt = ComThread(int(com)-1);
    9 Y; N; j* S+ J4 O- F. x
  215.     try:# f. D+ g9 t' a+ K/ N+ g
  216.         if rt.start():
    & C3 H, |- h8 b3 o
  217.             rt.waiting();
    - u\" }! r' t5 S( p
  218.             rt.stop();
    \" W; c/ G5 U9 ~9 |' s( c
  219.         else:
    ; s% a9 g1 u* F0 ^6 W
  220.             pass;            4 g, S$ L5 p: ]( k
  221.     except Exception,se:
    , ?: S) B7 y8 w5 z% u# d* X
  222.         print str(se);
    ( r+ \4 V( }# ]

  223. 4 B1 W* V( S' ]- l
  224.     if rt.alive:
    8 A+ c$ U; O1 m5 m7 j0 f  U
  225.         rt.stop();
    ) T$ D. K\" L0 M9 k\" F
  226.     os.system("pause")
    + l+ U- K6 P) t9 e- u

  227. ) r1 S\" y7 d* e- X2 F6 P
  228.     print '';1 F& h0 W2 C. e- W
  229.     print 'End OK .';4 S7 j1 L\" ?1 D- x9 u, l3 K( \2 r
  230.     del rt;
复制代码

6 V+ c* A- A3 L8 h: r' L
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-2 22:38 , Processed in 0.447515 second(s), 51 queries .

回顶部