QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    & h# u2 v6 o: l3 B; u4 Z
  2.   Z5 r2 n3 P' D1 H4 C/ B: P. |
  3. 6 r6 b5 h% Y  b% s# h, M( L! q9 X
  4. import sys,threading,time;
    # z) v9 ~% f7 H. j( d5 E* h
  5. import serial;( ^% h- \% R( [' @! u0 u0 W2 y
  6. import binascii,encodings;6 N! I* U! q8 U- b0 e! o+ B% H' _3 z
  7. import re;\" {% ~* v5 U2 T
  8. import os;
    ) ?+ G) y; V% K
  9. from socket import *
    8 ]* T/ q# e8 X1 s5 w  a. T
  10. from struct import *;. X\" c- [; j4 b$ |\" X
  11. #from myutil import *;
    ! g( d\" N: g4 K
  12. #name: myutil.py8 ]( j9 N3 K5 S& x+ S# ]# Y

  13. 0 X: B( `* ^7 y, c6 T
  14. mylock = threading.RLock()
    6 x& I\" T' i5 K- D( K. Z) T4 a

  15. ! b8 q5 Z: J; }& t1 Z
  16. Server_IP = ''' }/ {6 Y; U; i: h8 `. q: I
  17. Srever_Port = ''
    6 k/ c' W2 C) M) h8 i

  18. 7 U: L3 Q$ U+ S- g6 _7 U6 w# U
  19. def print_hex1(s,prev='0x'):
    & q: ~; Y4 X0 K. Q* d3 p- ~
  20.     for c in s:4 E9 M* U1 G\" r- p4 D% s/ i
  21.         print '%s%02x' %(prev,ord(c)),
    \" Y; w, @' `- Q\" s( E
  22.     print
      T1 g* y% x% L% k* @( Q
  23. def print_hex(s):
    & ^% P' `7 Q6 ~+ W7 x
  24.     for c in s:
    3 _/ _8 [7 F5 {\" S+ s\" ]
  25.       print '%02x' %(ord(c)),+ C0 n3 `$ `) D' s) w
  26.     print
      o3 k: Z% w) ]% V, [1 q) W4 a
  27. : o' g3 ^( O0 n: w! t$ \
  28. def hexto_str(s):
    $ b* s2 l+ _4 q7 W: b0 J3 |
  29.   r =''1 X# F/ ^1 K' `7 t, h+ O1 V8 @
  30.   for c in s:& x% T, T5 b; i# f- g$ T. b
  31.     r += '%02x' %(ord(c))- [* E( C; o+ A3 ^5 u: f5 D7 p
  32.   return r! N  N\" M8 k% }0 G$ o* o
  33. def strto_hex(s):8 B* y; H$ I1 \, Y6 p
  34.   r = s.decode('hex')
    * T% z+ ?3 a9 s
  35.   return r
      b3 ?$ r9 T# c: l1 D+ J4 M
  36. #''代表服务器为localhost7 j$ v; ^  ]# _! I0 p
  37. . i8 j' A. [/ o0 `% z& r4 E
  38. #在一个非保留端口号上进行监听
    * J: c2 {8 E1 K4 E2 N
  39. ' Z0 ?9 X# C, @

  40. 6 I9 ?4 D* O) p5 X* u  T( C
  41. class ComThread:
    8 [* p2 \8 @7 X# e+ E' T! }( ]
  42.     def __init__(self, Port=0):  i1 Q. L6 P2 R* e  s! G
  43.         self.l_serial = None;
    / o% V5 b1 D* i5 i. Q( J) X4 f
  44.         self.alive = False;) F# p) v6 l! L$ U: @
  45.         self.waitEnd = None;# Q3 q9 s6 E3 C5 m- L+ b
  46.         self.port = Port;
    ( `) R) i9 W# o* w, w8 c( ]

  47. / V, b% x\" p% i. \6 E7 b- n# L
  48.         #TCP部分
    ) W1 o9 Y6 Z8 o
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    6 C' f% k. s) G8 |' p6 O9 S; z
  50.         self.connection = None' F% x9 B! z5 R5 E0 |
  51.         #数据
    . z3 l# F/ P0 r& k. m, I
  52.         self.snddata = ''
    0 d+ o. o# K, `/ u' g$ {) `
  53.         self.rcvdata = ''
    ! K\" H/ Q) p8 T6 ^1 \% g
  54. 6 m8 t% R$ s, B$ N& {
  55.     def waiting(self):
    , ]$ D0 N3 B% r! y% }
  56.         if not self.waitEnd is None:7 g3 |0 u# L6 d
  57.             self.waitEnd.wait();
    % @; K3 {  ^* b$ D3 u, ?\" o: p7 C

  58. 8 W0 |4 O0 \, n  m' _3 x& A
  59. 2 d; d9 h# R2 ~$ k4 v7 |) H
  60.     def SetStopEvent(self):
    4 A' f3 e& f: o+ ^% g
  61.         if not self.waitEnd is None:0 a4 X( S  `( _6 P! q9 Y
  62.             self.waitEnd.set();
    1 s; Q, C$ V& }% x) u
  63.         self.alive = False;
    / I\" k: p! d/ V; N
  64.         self.stop();8 a4 ~5 P) o) G! b% t

  65. \" I7 ^7 ^  U/ n: [% |- H3 m2 C8 P
  66. 8 _. t, B! V  |3 B
  67.     def start(self):
    4 _* E, i. Y( D! X# s1 b  R
  68.         self.l_serial = serial.Serial();
    9 ?: q- A# ]' r  r, c0 q' d
  69.         self.l_serial.port = self.port;+ w' M. q# j  i- l; N4 H  H. _
  70.         self.l_serial.baudrate = 115200;
    6 s+ `* a0 j: g7 c) I
  71.         self.l_serial.timeout = 2;  #秒
    4 P& L$ n\" o( _5 H; U# f1 y$ W
  72.         self.l_serial.open();8 d) N* R. X) i  b% ]
  73. 5 Y* N0 {2 Y9 s
  74.         if self.l_serial.isOpen():: V; U  a0 _8 ?; U2 \
  75.             self.waitEnd = threading.Event();8 C1 z5 b/ O' o& O$ ~) U
  76.             self.alive = True;/ _7 P/ K( P& \3 y. ?
  77.             print 'open serial port %d ok!\n' %(self.port+1)+ y: U3 s& u/ ]' E2 P( h& p
  78.             print 'baudrate:115200 \n'
    * d, L3 c* a& s  n
  79.             self.thread_read = None;
    4 l' v! y9 `- Y6 \
  80.             self.thread_read = threading.Thread(target=self.FirstReader);# T' @1 ?  B% u) {: |; P- n
  81.             self.thread_read.setDaemon(1);6 ?4 H/ \  M) ~* W; _1 j- j+ s
  82.             self.thread_read.start();
    ( D+ v# p+ \, ?  a, R& ?

  83. 1 E) _% j! M8 ?9 U4 Z7 I
  84.             self.thread_write = None;
    ' H$ b2 I7 ?. q% A5 u
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    8 C, p4 ?. j* r) P9 a* _0 H
  86.             self.thread_write.setDaemon(1);/ G. F  d& ?* _4 M2 ]- p
  87.             self.thread_write.start();: ?5 @0 Z* g8 k5 Y8 N, f0 V! O/ Y

  88. ; B$ M  F) d$ t9 J8 O
  89.             #TCP部分
    ) n8 W7 X6 j* A, v; e9 `6 Q
  90.             self.thread_TcpClient = None;
    ( `3 Y+ I3 d/ i  p4 G; c8 C* S3 i  D
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);' p4 H: o7 j# g7 U2 G! `+ ^
  92.             self.thread_TcpClient.setDaemon(1);3 u\" U; O6 w- A. A) D
  93.             self.thread_TcpClient.start();3 j6 `6 T3 |8 Y+ @' u
  94. ! O7 M5 \; K2 `& E; p
  95.             self.thread_TcpSend = None;
    1 X! b2 q5 A) M+ n
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);
    7 r3 D/ H' X. ^
  97.             self.thread_TcpSend.setDaemon(1);( E2 h6 h& K, h) D
  98.             self.thread_TcpSend.start();
    - S8 K5 Z4 |+ U
  99. 4 S6 u: h/ `% l
  100.             return True;% M4 o2 u. n0 t
  101.         else:
    # z2 U3 b$ @7 a. e/ f* Y/ D, Y\" }
  102.             return False;
    # k8 W\" y* ^! Z/ z5 F\" o

  103. + O8 }  l3 j$ N3 S6 J
  104. * {& M0 s# [0 a8 G  N\" s/ C
  105.     def FirstReader(self):2 \: u3 ]' L* l2 z+ x
  106.         while self.alive:0 {6 s' b5 f! O3 q7 o
  107.             # 接收间隔% {: P0 u( }: x- ?5 Z\" d* l+ f
  108.             time.sleep(0.1);, h, l. ~5 y  \, z
  109.             try:% i0 d1 L0 y( ^/ }; v& L
  110.                 data = '';5 p9 S. ~7 r; z3 l4 S
  111.                 n = self.l_serial.inWaiting();# j  Q5 k' `  t+ I7 x
  112.                 if n:+ P  H/ f1 h6 l- c
  113.                     data = data+self.l_serial.read(n);& w7 ?% O7 ^. v\" S, a
  114.                     #for l in xrange(len(data)):
    ( g) S3 j1 v& |, l7 G
  115.                         #print '%02X' % ord(data[l]),
    ; @\" L: j$ b4 f1 f) {! a
  116.                     # 发送数据- I, ]: L$ M\" d
  117.                     print u'->请求:'  Q/ v& ^/ c% j+ \; R
  118.                     print data;
    7 }# `  R3 K$ a2 A* @
  119.                     mylock.acquire()
    8 k/ H& A) M: q2 M6 q9 a6 J
  120.                     self.snddata = data4 @5 i7 F* O\" g0 Z8 Y/ K
  121.                     mylock.release()* A' \* m0 T+ L. E6 d% y! q
  122.                     #print_hex(data);
    $ ~\" T' S: {+ O7 b2 P
  123.                 - f- `8 @8 X+ n# g
  124.                     
    ' T- ^* o5 z, ?+ t- ?
  125.                 # 判断结束
    ) X3 R% _1 g+ O' p, H
  126.                
    # O7 b- W) m* S
  127.             except Exception, ex:
    % s. t  b$ W9 M
  128.                 print str(ex);
    ' k2 w8 ^8 Q, d4 j7 y

  129. 9 ?! C- f  n1 K5 m9 a8 {% [! F
  130.         self.waitEnd.set();
    & X9 o8 v3 s! J* K7 ~, G) f
  131.         self.alive = False;* `0 V& Z1 _& l! Q. m. x

  132. \" J) o3 B7 a, y: T
  133.     def FirstWriter(self):
    ! D* e; _8 [5 F6 U\" o8 j9 w! ]7 B
  134.         while self.alive:
    6 J) f$ P) y7 h! H
  135.             # 接收间隔# r\" z- y9 @2 ]
  136.             time.sleep(0.1);
    ; [2 Y& C3 S* S! ^! ~% M. s
  137.             try:
    . v  t; y/ x) i8 O+ C: _- D
  138.                 #snddata = raw_input('\nenter data send:\n')1 {( C% [: H, t1 x# C% k
  139.                 if self.rcvdata!='':
    . u  r: c+ ~2 z4 j5 Y! O& S\" E! b
  140.                     self.l_serial.write(self.rcvdata);
    . N9 ?) A\" x  |3 K
  141.                     print u'-<应答:'3 s' t% r: h9 R7 E
  142.                     print self.rcvdata;
    1 N\" l8 R: J, u6 k7 V) Z
  143.                     mylock.acquire()
    ' i' E7 N5 m( ^
  144.                     self.rcvdata = '';) D& W- h: R+ x2 w% m) u\" S5 {
  145.                     mylock.release()& T0 k4 T( }  A& T5 T) T
  146.                 #print_hex(snddata);, A6 W5 R* z  e+ E: h! I+ Q
  147.                
    - i+ }# l& D2 C/ a
  148.             except Exception, ex:
    6 J- \8 i: X& w6 m
  149.                 print str(ex);
    1 E# _2 q* K9 C. \1 k/ U! m7 F
  150.         self.waitEnd.set();
    4 v5 m$ a8 ]! B2 ?1 s! ~. t3 x
  151.         self.alive = False;
    1 X: g+ m+ h1 }

  152. ; r3 d) o! V! D$ P7 O4 i: d' K0 h7 J; q
  153.     def TcpClient(self):! _% Z5 V& A2 M' }( C* d
  154.         while True:3 j/ A# l1 F5 L# Z% y
  155.             # 接收间隔9 _$ W9 w8 l1 g# U3 j5 g5 T9 h) M8 c% x
  156.             time.sleep(0.1);
    + G  ^( }% f$ T0 p! }1 }2 H+ b
  157.             self.connection = socket(AF_INET, SOCK_STREAM);
    \" m: D: X! B* N2 N: K# Y6 j) D8 l
  158.             self.connection.connect((Server_IP, int(Server_Port)));+ l2 |/ Q! l% v5 U8 B/ W
  159.             print 'Connect to Server OK!';
    ' f( P3 R! G6 }\" u+ O1 f# q5 I4 M
  160.             self.snddata = ''& K5 ?  K1 h1 y: j6 i, u7 [
  161.             self.rcvdata = ''
    # S8 L! d1 y: [+ v
  162.             while True:
    : ]6 \* Q* `\" b) T0 r* Z
  163.             #读取客户端套接字的下一行. }$ A0 S$ Y$ i: T: N8 S' ]
  164.             data = self.connection.recv(1024), k7 e4 g6 S  [9 [9 b6 F6 o* v# s
  165.             #如果没有数量的话,那么跳出循环
    / C4 H5 X! X6 |8 d
  166.             if not data: break0 ]7 q, e/ h8 v4 P7 @! j8 \0 o
  167.             #发送一个回复至客户端9 C9 A9 b  y4 t
  168.             mylock.acquire() 7 `5 F\" T$ \' z0 f- f( f$ k* K# A
  169.             self.snddata = ''/ B: V) ?0 x: P
  170.             self.rcvdata = data
    * g8 u/ g1 S) Y3 O. D
  171.             mylock.release()
    5 _+ B) |* W/ c8 D
  172.             #connection.send('Echo=>' + data); N& n) h2 W  H& B# W8 k5 r6 S
  173.             self.connection.close()5 |3 w2 h. v# f

  174. / ^3 D$ w4 X3 X\" z! e
  175.         self.waitEnd.set();( u$ R6 c\" D: ~' A/ T1 k+ g
  176.         self.alive = False;' n$ @1 x# j& y: K  N

  177. . \$ ~$ j8 _5 h* B. ~  B
  178.     def TcpSend(self):
    1 c$ ~# I& O! n9 ^/ T, {, ~
  179.         while True:
    4 ]' T+ l0 f: q9 z5 @( x
  180.             # 接收间隔3 s/ v; ?. K0 `% z) V
  181.             time.sleep(0.1);3 }! W& W. _  e$ f- D8 P
  182.             while True:* d7 F% i0 h- l  y2 b0 B
  183.               time.sleep(0.1);- Z% s, R1 f: `9 g6 ?: U
  184.               try:
    / c+ P# S* S8 b1 k) Z# ~* d: A% ^
  185.                 if not self.connection is None:, N9 w) `7 L3 }8 K+ E
  186.                   if self.snddata != '':\" U7 S& i' [/ H
  187.                     self.connection.send(self.snddata)
      u' k0 L$ y- O% Y) M. C
  188.                     mylock.acquire() 7 V- `' {5 }+ t( b\" ^  ~. ^# ?
  189.                     self.rcvdata = ''
    , W4 I0 N5 {5 t, h, r) E
  190.                     self.snddata = ''2 W. z; s+ W+ E/ ^1 J0 E5 x9 i
  191.                     mylock.release()
    ' P% Z$ S* @* k
  192.               except Exception, ex:6 A* Y3 Q' y7 H( T
  193.             pass        
    ) R5 @2 n: @5 o5 [) }! ~8 L
  194.     def stop(self):
    3 k! L6 C  `/ @$ |6 s# w9 U
  195.         self.alive = False;
    , w, E7 T2 r: I
  196.         self.thread_read.join();
    ( P& l' C6 U( S- L( J
  197.         if self.l_serial.isOpen():
    - L6 B1 t# J5 w3 w7 Y6 w
  198.             self.l_serial.close();. `. n9 Q4 k9 `1 F7 [9 U4 E

  199. : B2 V  C9 a$ N/ y\" i/ H/ g
  200. 8 W, E; Z3 F5 t5 Q
  201.   Y  d* {! S* j' K% B
  202. #测试用部分
    - w& ?* w* R( I9 E) k9 e
  203. if __name__ == '__main__':- N) `4 u+ \\" N7 o2 j
  204.     print 'Serial to Tcp Tool 1.00\n' 4 ?4 ~8 p) N4 x# E
  205.     print 'Author:yangyongzhen\n'
    # z/ y# s1 W8 X\" ?
  206.     print 'QQ:534117529\n'
    & m) O1 S+ V1 W( ]) A* Z# y, ]
  207.     print 'Copyright (c) **cap 2015-2016.\n'% B2 T! L, i\" W3 H5 R\" C9 z
  208. ) y5 O! }! }' J9 O
  209.     Server_IP = raw_input('please enter ServerIP:')7 ]: Z1 Z! d6 H
  210.     print 'Server_IP: %s' %(Server_IP)
    & @6 J/ M! D- D5 M
  211.     Server_Port = raw_input('please enter ServerPort:')! j( ~8 A( g& k! ~( ?/ u  `' u
  212.     print 'Server_Port: %s' %(Server_Port)
    8 n3 B# K# v. n. c. l' \
  213.     com =raw_input('please enter com port(1-9):')\" q) `* _4 q# n( n9 e9 S5 B% p
  214.     rt = ComThread(int(com)-1);
    \" d. F( q$ z; D4 Y. ?5 q+ A6 O
  215.     try:
      y- x+ Z\" \2 Z
  216.         if rt.start():. a  b\" d8 n: B
  217.             rt.waiting();, o* d# A; a( z) r# @6 H% v5 O
  218.             rt.stop();  T; l( D5 J5 E7 V/ T, b& S5 D; L3 W
  219.         else:
    5 ~: A: o5 n( ]  ]3 i6 @
  220.             pass;            
      o0 z. g4 M- d/ t8 R( ~/ M+ }
  221.     except Exception,se:6 o: k* I4 a5 J  _6 e
  222.         print str(se);
    4 p( v  s\" z. s
  223. 9 f0 [2 n! U3 c5 O  ]; G+ w5 |
  224.     if rt.alive:
    ' C, B\" Y) O- F! B# \2 t
  225.         rt.stop();# j& \  d  z$ V; X3 j
  226.     os.system("pause")
    ( m0 f; A* z, _7 ]) Z\" y

  227. 3 @5 f3 T: v/ [/ @
  228.     print '';
    & O% ]8 f8 e: v1 e2 J. a$ M+ A
  229.     print 'End OK .';
    0 c5 c2 r% \; c8 P\" S/ I
  230.     del rt;
复制代码
6 H: r+ B$ a0 ]/ d4 P5 ]7 a
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 07:14 , Processed in 0.435014 second(s), 51 queries .

回顶部