QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    ( o7 ]$ k, E8 D* S8 r9 M* S3 T
  2. 0 \9 z0 o8 Z8 [: u3 [4 W
  3. 9 ]! z6 U* p& ~, H7 f1 D' ^
  4. import sys,threading,time;0 k! X: D/ t0 U* B+ @9 b
  5. import serial;
    3 l. L% c, I2 {+ a6 P2 p8 \1 t
  6. import binascii,encodings;
    7 _2 P* m1 S* L/ y\" @0 g) G
  7. import re;; E4 E+ e) O% [3 v
  8. import os;
    : `% T1 \( m- [( q/ m1 x' N
  9. from socket import *
    . t. K/ x8 h1 A$ t. x6 U0 R9 B\" a, ^
  10. from struct import *;
    ) c0 x/ V7 E; T; U9 I
  11. #from myutil import *;
    ' o* H( g' i8 e+ |: u, W3 [
  12. #name: myutil.py
    ) U! w1 A0 q- r

  13. ! @' ?9 g. N+ v# z
  14. mylock = threading.RLock() 4 L' ~' Q. V2 `: a0 D' d/ F! M\" n

  15. / Z' a6 t& \  h$ H: ?& P% j+ d
  16. Server_IP = ''
    - u' N8 @8 d# o2 r# l9 t; I
  17. Srever_Port = ''
    % L( M2 f' D( d

  18. , q* t4 x) O7 M3 F' T% Z' K5 N1 b
  19. def print_hex1(s,prev='0x'):
    9 k( Y% p2 N; K/ D, T\" k  S
  20.     for c in s:
    . y1 D: f8 f/ B# p. T4 ]
  21.         print '%s%02x' %(prev,ord(c)),2 W4 D, i* n5 |* t0 W
  22.     print
    6 M1 N# g4 H( }' j7 ^
  23. def print_hex(s):' r& J& C0 |7 ]7 {: b# T' X
  24.     for c in s:+ m. y$ r- f- I6 E\" ^/ d4 K
  25.       print '%02x' %(ord(c)),: f0 s$ v5 u4 l/ W! ?9 A. O
  26.     print& f4 b+ F: l, O\" c2 h. O
  27. 7 |\" Y, A, G& o& I% o
  28. def hexto_str(s):+ a' y5 @  C' U1 ?. w6 E
  29.   r =''$ `1 \4 p# ^# `! a' [0 T
  30.   for c in s:* [: W/ [\" I! q
  31.     r += '%02x' %(ord(c))* h: D7 n1 m0 ]1 T- t3 z4 x
  32.   return r) r% Z( f6 s% d3 H
  33. def strto_hex(s):  V: k8 z2 \4 `  ]
  34.   r = s.decode('hex')/ j5 N' b& d: P& n, Y+ R
  35.   return r
    ; m: A8 G2 Q+ d) Q: o' V
  36. #''代表服务器为localhost5 Z6 K$ a$ N2 Y; a/ d/ o5 p

  37. & \; v$ I$ c6 q8 v* F7 l
  38. #在一个非保留端口号上进行监听. S* m5 w6 c4 M/ s

  39. 3 ^1 Z0 m  w/ [- Y8 ]- j. [  m
  40. / [! N  ]) _\" Q2 B& G
  41. class ComThread:, b5 F5 B; K+ P9 v) c
  42.     def __init__(self, Port=0):
    / Z3 }( t2 N. X) Z
  43.         self.l_serial = None;5 t  v& L. y) r. k1 X0 e
  44.         self.alive = False;$ U4 m6 _! Q3 W0 G# c7 L5 k
  45.         self.waitEnd = None;4 g1 v* T: p+ c& G& D
  46.         self.port = Port;
    6 |: d; H\" J+ S, a. n
  47. 8 P4 T+ m- O( Y$ o2 S7 b' M9 I
  48.         #TCP部分
    + c9 l/ q3 J) y' G2 x( x' Y, _8 ?
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ) K9 G2 q: v' }1 h
  50.         self.connection = None0 q1 r, |0 p% {# ~8 P9 j
  51.         #数据6 Z+ m, t; j' m+ A! m& \
  52.         self.snddata = ''
    3 o$ I8 g9 T# }. [( s\" f' s( Y
  53.         self.rcvdata = ''
    \" }! g( z1 k2 Z8 R* H# q\" |

  54. ' Z$ k  v) \  h. Y
  55.     def waiting(self):
    % J4 D  J3 x0 a
  56.         if not self.waitEnd is None:
    ' L- T1 A) _1 i+ [4 ]
  57.             self.waitEnd.wait();
    $ g6 J- h' r+ T

  58. 4 [0 ], @7 ]( C: s! O

  59. 6 N# g; U4 X  Y; h3 r* u
  60.     def SetStopEvent(self):8 V9 u7 Y0 s7 Y
  61.         if not self.waitEnd is None:) t+ y0 N5 Q+ j7 {% V
  62.             self.waitEnd.set();, y  E) l- F: T9 S1 t
  63.         self.alive = False;) m; Z3 A3 V9 z: A$ q: P8 C  w8 e7 t) V
  64.         self.stop();: Y- M- R6 z! R! o; G: }
  65. # J5 x, Z. A% o4 l' S) l
  66. ) W3 `3 `+ v! _3 t! P5 y% C4 u7 D2 Z
  67.     def start(self):
    ( u/ M\" d& [* G2 P; ?
  68.         self.l_serial = serial.Serial();( G4 @: F! D7 ~4 Z* @
  69.         self.l_serial.port = self.port;
    ( r9 S6 _- f/ ?% N) w3 q/ i. S
  70.         self.l_serial.baudrate = 115200;. x( j' D+ X6 [. h$ S\" S2 `
  71.         self.l_serial.timeout = 2;  #秒* x$ l  ^# o; G4 B4 A( r& y
  72.         self.l_serial.open();
    # C7 c\" P\" k$ |( q2 V( f
  73. , J/ k+ P% Q. O: U0 t1 a& {
  74.         if self.l_serial.isOpen():
    , T' `9 z  C3 W: m7 l: U# c4 S
  75.             self.waitEnd = threading.Event();9 j4 j  O: p$ J2 H% f! ]; j
  76.             self.alive = True;4 _\" J$ i) r( x, d3 [3 p
  77.             print 'open serial port %d ok!\n' %(self.port+1)
    ( u: C, X/ W7 g
  78.             print 'baudrate:115200 \n'1 w, a* t: ?* w9 ]  T* ^% s8 F
  79.             self.thread_read = None;
    # R\" G. _& ~4 \0 ]. t+ O
  80.             self.thread_read = threading.Thread(target=self.FirstReader);9 y9 G\" F4 z0 w( i6 M: `
  81.             self.thread_read.setDaemon(1);7 k3 B, v' u2 w: @- B: |
  82.             self.thread_read.start();
    9 X0 Z2 Z5 l, h1 r% @# J- h
  83. $ N1 W# |& n0 O% N* Z7 q) R3 o
  84.             self.thread_write = None;
    % ~$ }$ @# O; }  D8 `9 G5 x) I: E
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);6 \2 z5 J3 K  l' S! x
  86.             self.thread_write.setDaemon(1);
    . `% {* l\" j9 C: k$ l: @; \  D3 {
  87.             self.thread_write.start();
    1 Q0 P& ]\" q& z' s
  88. + F) E9 E/ R# ]3 v/ K
  89.             #TCP部分
    9 `$ w: g8 x4 R! h' X6 D- Y
  90.             self.thread_TcpClient = None;
    . D! W3 R) y) i0 P' R7 p; F
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);% |% h+ X- x: k. P9 E6 X6 C! }  o7 M
  92.             self.thread_TcpClient.setDaemon(1);
    5 N6 `' h* b( e1 O! c: E
  93.             self.thread_TcpClient.start();
    3 n* o, ^* y1 w- R6 o& e1 Y

  94.   w: T  V* V3 @( x/ L
  95.             self.thread_TcpSend = None;& D9 V0 m3 q. u6 h$ y/ Q
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);/ U$ y\" R% g- S% a' R: s' M+ ?- ?) I
  97.             self.thread_TcpSend.setDaemon(1);
    + z) e) M2 M5 s- J+ J! U. C  L! p
  98.             self.thread_TcpSend.start();6 g% ]% M) A( x  S/ d: L

  99. 1 Q; i+ Z' F# c4 Y+ Y9 _
  100.             return True;: a6 B% N; u! u. z# ^9 P! e8 N
  101.         else:! w! }0 a: @5 b* T7 r) ?
  102.             return False;
    5 G$ B5 Z! U* m  v* ~9 N% K
  103. ; }, ~) M- [, q4 X
  104. 3 ]5 A4 u6 S  F  k* v
  105.     def FirstReader(self):
    0 h7 X( P6 i6 @. O\" O\" j% _
  106.         while self.alive:
    ) a/ M7 d% b  p2 r! s
  107.             # 接收间隔- _5 H5 \/ p, F) l2 e
  108.             time.sleep(0.1);5 n; e, F& U- n3 a! S6 L
  109.             try:5 T, |, o* ]3 b8 a
  110.                 data = '';
    $ [1 h9 z) `: F, j+ w' N
  111.                 n = self.l_serial.inWaiting();
    + H! V! h9 t6 M9 i- M
  112.                 if n:
    6 ]7 Y6 d3 c1 U: `* o8 E
  113.                     data = data+self.l_serial.read(n);
    , p* T) D+ R2 Q4 U6 ^
  114.                     #for l in xrange(len(data)):
    5 N1 q\" X/ A# d  v: V; t% t( ]
  115.                         #print '%02X' % ord(data[l]),0 i2 E! X! y# Q! B5 W1 d9 b& R: u$ P
  116.                     # 发送数据
    ( Z( Q0 \  W- t' s  Y
  117.                     print u'->请求:'
    7 x2 C9 g! v, ^2 n# w, _( |* s
  118.                     print data;
    ( W% a) p8 G  ~9 L
  119.                     mylock.acquire() 4 S' q3 q7 X1 z) y( [( U. S
  120.                     self.snddata = data
    # P; _$ W$ K5 U, m( }4 @
  121.                     mylock.release()% W  P. d' `2 h- T8 v  Z
  122.                     #print_hex(data);5 @+ E. `) J( m) l  `\" r. _% _
  123.                
    ) e6 m4 X, L. E. D5 g7 J: W0 @& X
  124.                     
    7 W\" @. h, y2 t  ?
  125.                 # 判断结束
    * y+ g0 s; x# E- X9 _+ I
  126.                \" J4 o! U$ ^$ r* w9 `' l  T
  127.             except Exception, ex:
    * s& a\" D! g: }\" o' }6 \
  128.                 print str(ex);
    9 R6 Q. s$ r# _\" P9 |

  129. 5 U4 M7 O3 O' d\" v\" J
  130.         self.waitEnd.set();
    7 x- [$ N# A* f
  131.         self.alive = False;9 J\" D( ^4 ~5 S  H. n: |
  132. ( n% U: Z' K. N* S) g5 v& |
  133.     def FirstWriter(self):
    * o1 N( G! C6 m3 ~7 u! F
  134.         while self.alive:  s0 d/ u+ _8 F
  135.             # 接收间隔
    3 w) p* z0 B) `  K
  136.             time.sleep(0.1);9 }6 v& B, C- ]* V/ p& ]  c7 k
  137.             try:& T& A2 `' |4 t% T' ]9 S: Q! \( x
  138.                 #snddata = raw_input('\nenter data send:\n')
    - N- T1 v' N/ ~6 p' F
  139.                 if self.rcvdata!='':
    7 Z7 ]6 R  W: [! _' h
  140.                     self.l_serial.write(self.rcvdata); 5 O- J\" F% w1 q& q9 H
  141.                     print u'-<应答:'
    - K: |7 i\" v3 T+ j% n* B; p
  142.                     print self.rcvdata;  `) o+ v8 I9 R; c, y\" @
  143.                     mylock.acquire()
    # ?/ x4 z7 m8 ~
  144.                     self.rcvdata = '';
    . @; t8 L& m5 j! q% |+ ?
  145.                     mylock.release()
    ( }& `$ F, ]$ F+ ~9 J' y, V6 C
  146.                 #print_hex(snddata);
    : g. e6 }2 e  w( @9 S
  147.                
    ) m\" I0 y6 T$ S
  148.             except Exception, ex:
    1 {; F8 L! e2 t1 C! i( O' K
  149.                 print str(ex);
    7 ^3 v& t8 i+ N
  150.         self.waitEnd.set();
    8 z! m2 l9 j, _- i0 q0 S% Y
  151.         self.alive = False;: ~3 s8 M; R/ ?1 p1 T3 f

  152. / O  b8 i# x) r: y
  153.     def TcpClient(self):
    ( q  v- H; ~6 D3 U
  154.         while True:
    7 K- F3 m/ O# k+ c% C
  155.             # 接收间隔
    7 g8 U& _, M8 `0 C
  156.             time.sleep(0.1);1 l# e8 w- k0 a4 l& l$ T
  157.             self.connection = socket(AF_INET, SOCK_STREAM);
    ; B) y  M/ X% Y8 D6 T: z8 C
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    - s% J+ d1 m# M) q
  159.             print 'Connect to Server OK!';
    + ~- a3 f4 X/ ^' ?: v! {
  160.             self.snddata = ''4 O6 W2 m% s7 J; X% x- u5 p0 e
  161.             self.rcvdata = ''# |* \) ^8 Y: j& L' k6 r' ?: e
  162.             while True:+ |+ Q9 p$ S  M( n6 [
  163.             #读取客户端套接字的下一行
    ! ~. `' B7 L( }) y+ T$ z: l7 ~
  164.             data = self.connection.recv(1024)
    5 n. }( h' |7 A8 U
  165.             #如果没有数量的话,那么跳出循环
    ; t8 ^0 Y# _\" [# G# B! A
  166.             if not data: break) D: x/ V( A! q& D. j
  167.             #发送一个回复至客户端
    8 x$ q/ N0 k9 o7 Y
  168.             mylock.acquire() 1 Y- x4 I* `# @% U
  169.             self.snddata = ''7 F9 m% d3 G$ W1 y
  170.             self.rcvdata = data
    / l# O+ s7 \  M+ k% \( [& |8 N; M
  171.             mylock.release()
    $ I+ ?; ^* e# c# t* i8 q+ Q1 M\" i! G
  172.             #connection.send('Echo=>' + data)
    2 o$ B* N- S' Z; C  Z$ b
  173.             self.connection.close()
    ' b# V% ]) n! ~5 Z
  174. ! {0 j, G! |- j& J; i
  175.         self.waitEnd.set();
    ) B3 n2 p; Z. {, e
  176.         self.alive = False;
    1 O& H8 h9 a& E/ }5 T& t- e
  177. 6 z5 k( ~/ ?. |$ h# z
  178.     def TcpSend(self):
    7 ^% C7 _2 w  s9 K3 T* L
  179.         while True:# }4 t! w; D9 m
  180.             # 接收间隔4 i  R& S' a/ y7 y5 _  n  M
  181.             time.sleep(0.1);
    $ L& m1 v* d- k3 p. V0 [+ d
  182.             while True:
    ' E! {' G5 y\" n4 M3 K4 I( x
  183.               time.sleep(0.1);
    2 J8 n: b0 C\" e; H5 J$ x
  184.               try:+ ]! `  d  k8 g- N
  185.                 if not self.connection is None:6 R! k/ C2 s  A
  186.                   if self.snddata != '':
    2 y6 W1 I2 Q, ?. j
  187.                     self.connection.send(self.snddata)$ N$ F: `4 v5 c6 h
  188.                     mylock.acquire()
    ) `: b% S\" J  @+ T  Q# }. x
  189.                     self.rcvdata = ''5 H  s( E' T/ f4 F# [
  190.                     self.snddata = ''
    . x: N( q+ `& x+ y- \
  191.                     mylock.release()
    ; z! W5 m/ L. _* }0 A8 e
  192.               except Exception, ex:
    9 \. X  k1 U9 Y- ]( R
  193.             pass        : X7 \! \: `1 C( O2 I# c
  194.     def stop(self):) d! Q, v& L6 x# V) F. |
  195.         self.alive = False;
    \" j* E/ N\" k1 c3 r$ p; Q
  196.         self.thread_read.join();
    \" R( l2 c# a7 ?. }# v: j+ @, g, f( a
  197.         if self.l_serial.isOpen():
      f, B. M& I6 c* s
  198.             self.l_serial.close();9 x7 P. z& ?: h; E8 ^
  199. 7 Z& H; y\" o& `: w& [
  200. - u6 u6 a' ^2 A. Q& u% q
  201. 0 e9 m0 a; B: l
  202. #测试用部分
    / d, P* \9 \' H0 y; O
  203. if __name__ == '__main__':- J2 `- _* i* D; P! b
  204.     print 'Serial to Tcp Tool 1.00\n' ; ~; P8 c5 _) _  G7 c- m: d
  205.     print 'Author:yangyongzhen\n'- j0 d# [. r# z& O4 f. K) I5 u
  206.     print 'QQ:534117529\n'
    - {' x% s8 A5 d/ D9 ?8 I
  207.     print 'Copyright (c) **cap 2015-2016.\n'
    5 s; X, @: b9 T

  208. % [; h: R# y' p/ _( r+ O, u4 ]+ B
  209.     Server_IP = raw_input('please enter ServerIP:')
    - F- q9 `. D# `) Y! P: N/ t' O& F4 S
  210.     print 'Server_IP: %s' %(Server_IP)
    / |9 ?/ _0 u4 c! {( i. d7 U( e/ U* A
  211.     Server_Port = raw_input('please enter ServerPort:')' E* f& ~5 o% c; F: B) G. I
  212.     print 'Server_Port: %s' %(Server_Port)
    ' M, d' E- v5 q* {% i4 Q6 A. U
  213.     com =raw_input('please enter com port(1-9):')
    # e7 u  o  j8 x: ]( X! {# M8 ?# S
  214.     rt = ComThread(int(com)-1);# X8 @% ~- V7 }  h0 c5 p8 I/ W
  215.     try:
    2 K5 S: o+ b' x/ V7 I
  216.         if rt.start():9 a7 e+ H8 c$ a! _  {
  217.             rt.waiting();5 s# w6 a+ L$ j1 o; ?\" w$ s, X6 L
  218.             rt.stop();' b* u' V7 G3 m, O+ Z) H) A\" {0 j
  219.         else:# c, W) Y$ o; Z4 s  }7 \, S
  220.             pass;            
    0 t2 T2 v2 P+ P/ l: w. h
  221.     except Exception,se:
    + V7 o6 M) b0 n) D& S
  222.         print str(se);
    5 ^  }6 b! \7 |8 U: w& m+ L/ M

  223. 3 u% _) z1 S' [5 B* [& x
  224.     if rt.alive:
    6 v. ?' T9 i9 o& s
  225.         rt.stop();
    ; S0 V/ t; X. Q3 g$ L
  226.     os.system("pause")- F7 n' [/ H! Z1 Y7 J

  227. $ q0 R8 ?1 F8 d- N7 |3 z, R, d
  228.     print '';\" y\" y% {( H0 F% x! I1 N4 z
  229.     print 'End OK .';: L  d\" N! T: @6 a
  230.     del rt;
复制代码
3 p3 }0 [! s6 [- ]
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 03:55 , Processed in 0.354732 second(s), 51 queries .

回顶部