QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8: m3 Y\" Y0 v5 a+ X
  2.   N# }\" e0 e# Y% ^( d
  3. # ]+ A8 a2 X2 r4 k1 C& @
  4. import sys,threading,time;
    , |& ?4 i# h1 X
  5. import serial;
    * i7 N+ v) F6 g( B4 ]
  6. import binascii,encodings;* O) W. l+ D0 H0 v# M
  7. import re;
    7 V: b; P( x9 e
  8. import os;. W4 O6 D7 B; W% ~* b
  9. from socket import *
    - V7 @  ]% j& g* s5 y8 D5 b
  10. from struct import *;; u; n+ }7 m3 a! E
  11. #from myutil import *;: k# ^5 y: Z. z3 t) L
  12. #name: myutil.py4 j. ]6 O0 P2 D/ j# q

  13. 2 u+ z2 X  _1 Q( ^
  14. mylock = threading.RLock()
    4 F/ X, g8 f  [\" n. M3 ?\" _

  15. - V; M2 Z5 y* C; x9 v# s* Q
  16. Server_IP = '': `# d\" u3 k  B- ^9 ~
  17. Srever_Port = ''
      u7 E/ o7 c7 |+ j
  18. % V& Z4 a/ T+ A! M1 H2 q; I3 G! w
  19. def print_hex1(s,prev='0x'):3 X/ _0 E# |\" y
  20.     for c in s:$ S, t7 h2 G9 G% ?
  21.         print '%s%02x' %(prev,ord(c)),
    5 x6 y9 P% q* ~
  22.     print0 x6 y% ~! J4 I% |: ^) c
  23. def print_hex(s):# V* K  ]' N  y! h( Q
  24.     for c in s:
    + R. i) ]\" h* s\" h8 s
  25.       print '%02x' %(ord(c)),3 s5 `6 r) I- d+ x3 b
  26.     print
      I: M2 ~9 J1 _2 v, l: D: f% }
  27. 0 @  u0 e& P0 h- e  `9 L4 O
  28. def hexto_str(s):6 ^! |& u) G; @: f6 m
  29.   r =''
      n3 `8 u  v* _, |+ p4 c
  30.   for c in s:6 C/ o7 X, w- I* N! v
  31.     r += '%02x' %(ord(c))
    \" A& Q! O, ]* [0 E& m
  32.   return r3 i0 }4 Y5 D4 v; e
  33. def strto_hex(s):+ A! Z+ w+ t8 d8 f8 K; H0 W
  34.   r = s.decode('hex')) J  A5 f# ^! U6 ~
  35.   return r
    5 E2 n1 d1 Z7 G$ J+ ~- {
  36. #''代表服务器为localhost
    . W8 s/ @9 W2 @, E  r

  37. & }0 g9 x$ b; z- b% O8 ^
  38. #在一个非保留端口号上进行监听! S. i6 K: T/ W: S9 o& F3 X
  39. + p  w& t' N2 ^! p

  40. 9 w( v) j5 p: J\" a- N7 E6 _. T
  41. class ComThread:
    4 w6 w8 n6 {: _% U' J5 U
  42.     def __init__(self, Port=0):; y* e; e# D: n% g% Z0 @
  43.         self.l_serial = None;
    ; @7 q0 B. b# X5 o' v
  44.         self.alive = False;  k* ~: Y- Z. r3 ^
  45.         self.waitEnd = None;
    ( W6 ~* p8 {1 B8 ?8 `\" C9 Y
  46.         self.port = Port;
    . `\" I+ p9 r$ R  f
  47. * `9 H. H2 x3 h( V5 j5 J2 r. n
  48.         #TCP部分
    8 f  F  f* {% _+ P
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)\" K6 B; [6 [/ \) ?4 N1 u7 p0 g4 J
  50.         self.connection = None
    % ?8 _, ~1 r; L; I. T: J
  51.         #数据) ?; z: H( V\" m; Q\" A1 ]( e
  52.         self.snddata = ''
    2 j* y1 m\" P9 M\" y/ t5 z
  53.         self.rcvdata = ''
    , L% C- F6 I5 f% B  @- J/ O
  54. 3 Z- _. Q\" i1 f; |, [
  55.     def waiting(self):6 R  T1 c- j$ w! F: O& s! B
  56.         if not self.waitEnd is None:
    , g% [% ]2 G1 e  c; q+ y% L1 T
  57.             self.waitEnd.wait();
    7 s1 A; J+ c( s: M0 u9 I
  58. . k) c! p1 B. {( R9 y; I. [& G) S

  59. 8 t- k. {\" t& E1 S2 L/ y4 f
  60.     def SetStopEvent(self):1 O1 M, X# J. H0 e/ x
  61.         if not self.waitEnd is None:
    7 C) k( j) V: S1 N
  62.             self.waitEnd.set();
    3 Z- N, c5 }$ s\" B. I- c
  63.         self.alive = False;3 t, B6 C- U\" Y& u& a9 h9 C
  64.         self.stop();3 I( x% D1 ~5 V/ `2 e6 m

  65. : U* |5 C. _8 ]1 B5 ~

  66. + B! Y, F5 I# O7 c# o! p- U2 Z
  67.     def start(self):
    - v) q$ P8 I1 w  }  ?# C
  68.         self.l_serial = serial.Serial();
    ' ~2 x/ T  W7 g4 |) Y
  69.         self.l_serial.port = self.port;
      d' J4 M+ S6 j: I
  70.         self.l_serial.baudrate = 115200;
    9 p& _7 v8 \; Y6 G( c
  71.         self.l_serial.timeout = 2;  #秒( B4 Z( W: D9 O' P7 q( o
  72.         self.l_serial.open();1 e. y0 ?* F: _* h

  73. \" g2 ]5 X9 U' }/ E\" x
  74.         if self.l_serial.isOpen():
    2 y8 K\" N7 d+ s, u8 ~+ e3 M
  75.             self.waitEnd = threading.Event();
    4 W0 N& |6 [4 t* w0 g. Q
  76.             self.alive = True;, o! F) J  d6 j2 k' S  `$ ~0 l
  77.             print 'open serial port %d ok!\n' %(self.port+1)
    7 B+ C2 N& |5 U  L! O% v
  78.             print 'baudrate:115200 \n'9 Q/ M) I0 U. a) ?  W  F7 `4 K
  79.             self.thread_read = None;
    * q, P% J' k: s3 S; P
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    * [. i; S5 D6 m\" F# u: q4 E
  81.             self.thread_read.setDaemon(1);
    1 m: v) D. g$ w( X! i% Z
  82.             self.thread_read.start();\" i* ]6 L$ T6 N6 L: L) [4 Y\" e! k3 ?
  83. / Q+ {& g: R5 B. s* I5 I\" z; z
  84.             self.thread_write = None;  _% d6 l6 |, f1 ]
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
      H1 |' N( s8 F. G5 A# e9 ^
  86.             self.thread_write.setDaemon(1);
    2 y4 D' W\" a$ v( ?% \0 o1 ~3 q
  87.             self.thread_write.start();. Y6 c9 _; {3 s

  88. # F8 g- v$ r' N! |' ]$ S
  89.             #TCP部分
    + b: m0 A( q8 y/ Q/ k
  90.             self.thread_TcpClient = None;) v) B% d2 V+ o) ^
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);4 _2 Q: B. l6 }) N% J- D
  92.             self.thread_TcpClient.setDaemon(1);5 c2 v* h0 H* `
  93.             self.thread_TcpClient.start();
    , {8 K0 r4 W/ E+ q

  94. % U9 L; \% d- y) d4 {
  95.             self.thread_TcpSend = None;
    4 g. F' F+ K$ d9 v7 l- m# }8 D. r+ C0 f
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);$ m  t+ F& H: y
  97.             self.thread_TcpSend.setDaemon(1);; T* `4 G! T1 s2 j) t$ I6 h
  98.             self.thread_TcpSend.start();7 A9 p0 A0 f& l; p, Q
  99.   i6 a  N* L: j
  100.             return True;8 D  g1 c  B: V4 R# \% G. O
  101.         else:
    ( M! P2 ^% B0 Z2 y
  102.             return False;
    & B& A1 H) x! V& a( q2 N

  103. ( u6 J! u. ^- e# }
  104. # p; V* v# x\" ^; J/ y( u\" b. b
  105.     def FirstReader(self):  w3 s9 u0 \9 f\" K/ c
  106.         while self.alive:2 r6 ~\" n1 B: U6 E
  107.             # 接收间隔' J- O9 l\" Y6 R# k6 U- A
  108.             time.sleep(0.1);1 x4 b0 {' G$ |9 a7 a2 e
  109.             try:
    8 F1 R4 M7 [7 w6 b2 N
  110.                 data = '';
    7 |3 y+ K/ M# a/ w7 M% ?0 @, e. F5 e
  111.                 n = self.l_serial.inWaiting();  r\" K, I* ~$ r+ `
  112.                 if n:) G0 S9 C  q0 f  r
  113.                     data = data+self.l_serial.read(n);5 c/ I6 i$ {, a
  114.                     #for l in xrange(len(data)):\" E5 K$ x5 J3 P
  115.                         #print '%02X' % ord(data[l]),
    + @' D6 c2 R/ z. Q\" ?
  116.                     # 发送数据* {. I8 K0 {) f
  117.                     print u'->请求:'
    9 m( a/ R$ g! n2 H; _3 j
  118.                     print data;7 t$ `$ n: C0 \' K/ }0 c4 ?8 c- s! R
  119.                     mylock.acquire()
    4 H2 Z  X$ N# X* N
  120.                     self.snddata = data* L2 |4 \# t% B# ?0 ]
  121.                     mylock.release()
    5 j2 T2 n- l$ F; [7 S
  122.                     #print_hex(data);* u( t3 a( j/ q
  123.                
    ) \7 P; i8 N2 d7 Z+ K
  124.                     - r- |+ U4 w: O! ~* \/ f$ [
  125.                 # 判断结束8 n\" y3 j. M) N/ h+ |3 n  V& L
  126.                # c! m, ^3 |8 t6 i+ U
  127.             except Exception, ex:\" B4 S. t  O# X8 S6 l; ^6 T% I3 \/ F& \
  128.                 print str(ex);
    6 p( a( T+ Q8 ~
  129. 1 M+ O: M! g/ l  I; z* f4 F
  130.         self.waitEnd.set();
    0 I; E* {3 e' }3 x\" b7 i\" o/ ~
  131.         self.alive = False;
    6 |. M# A. A* B! ]& i6 E

  132. ; B6 N6 @5 |- i2 |9 y/ N\" l
  133.     def FirstWriter(self):
    : q* }8 R( p; p6 e' H. D$ E
  134.         while self.alive:
    $ [- J3 K, \2 @  E# k
  135.             # 接收间隔
    / ]. X8 Z4 F/ @/ l5 g
  136.             time.sleep(0.1);
    / c3 F# s' q  g\" z, Y
  137.             try:
    3 s+ c4 ?; i4 k: L
  138.                 #snddata = raw_input('\nenter data send:\n')
    ; r6 }( R. B% S5 T9 i
  139.                 if self.rcvdata!='':2 S0 ~, p$ b: ~1 {: p. V$ V3 C\" P
  140.                     self.l_serial.write(self.rcvdata);
    - ~1 i( R. e* J; N' q& v
  141.                     print u'-<应答:'0 Z- S) P# p8 l8 d. d. j; A
  142.                     print self.rcvdata;: q7 \, Y! q; F; b6 I2 ?9 D; p) v
  143.                     mylock.acquire() , {; I% Q! S) [( I# J
  144.                     self.rcvdata = '';: ^: B4 L; U. _+ q, t
  145.                     mylock.release()& q4 c0 d/ D2 D+ E
  146.                 #print_hex(snddata);
    8 Z  i3 y/ t, t6 f
  147.                
    \" Z$ `# ?5 @, B# h  ^. A1 Q
  148.             except Exception, ex:  u/ q, Y' r0 n# I& r
  149.                 print str(ex);
    8 h3 @% h* `9 x- g
  150.         self.waitEnd.set();) p- w$ U6 {# ?/ E6 Q
  151.         self.alive = False;, ]+ l/ g+ k* |( o, ]9 A
  152. * Q3 `5 r* E8 H0 n0 f
  153.     def TcpClient(self):
    7 P* p/ E% _( N* E! m4 _
  154.         while True:
    % A: v$ F# F$ D4 Y6 s
  155.             # 接收间隔
    , W9 G5 d' N\" p( a  w
  156.             time.sleep(0.1);
    * |2 d2 E' N# m/ H. N
  157.             self.connection = socket(AF_INET, SOCK_STREAM);\" u2 d! e1 P; t\" |5 ^- b) Q1 i
  158.             self.connection.connect((Server_IP, int(Server_Port)));, F* A8 B. W3 V& U( K' p
  159.             print 'Connect to Server OK!';
    ) {$ D  M8 x- c
  160.             self.snddata = ''
    3 K: o, u. D( {% b
  161.             self.rcvdata = ''
    9 m\" Y4 O& M3 @+ H) h& B
  162.             while True:
    8 O8 F+ U# e( x9 i2 C
  163.             #读取客户端套接字的下一行
    3 f- R% _$ D- g/ {3 z7 x% g. ?
  164.             data = self.connection.recv(1024)1 A9 F/ b% O0 g
  165.             #如果没有数量的话,那么跳出循环. G1 G' Q. ]2 ~& T5 {
  166.             if not data: break, r/ q: S1 q- y' H9 J
  167.             #发送一个回复至客户端
    % g3 x& @0 f- k3 H9 H
  168.             mylock.acquire()
    : [1 }- S4 L: T- b9 i
  169.             self.snddata = ''
    ( t\" I* h+ ~1 g- @
  170.             self.rcvdata = data
      j0 d! D9 M  E0 q8 v8 `' C5 @
  171.             mylock.release()+ I* U. P5 ~) F, ^6 w
  172.             #connection.send('Echo=>' + data)
    ) k  x- M  k( _7 L\" n' @
  173.             self.connection.close()& N/ J9 i) h6 d/ L
  174. + K  u) q& b5 s& c2 A3 D2 j. \
  175.         self.waitEnd.set();7 {& h7 S% ~* n5 ]9 @
  176.         self.alive = False;
    ( [+ C9 Z# m0 c# ]$ ?
  177. ( D8 T0 A) n( J3 u: v' f
  178.     def TcpSend(self):
    ; p/ a. v/ Y9 s! D
  179.         while True:+ w5 {# g0 [+ {# d1 {' o% L
  180.             # 接收间隔/ X& S- E5 l9 Z9 ^3 a
  181.             time.sleep(0.1);; R; W& D- ]: M9 k. h0 X
  182.             while True:$ n: C1 m+ U  \+ n# [& y$ {5 F9 S$ `
  183.               time.sleep(0.1);\" y. U4 p5 A. @( v! i
  184.               try:
    - k9 O2 C& M$ Z* T$ ?7 x2 ^' _
  185.                 if not self.connection is None:! R9 Z/ Z/ q) q/ K+ ]0 Y  c
  186.                   if self.snddata != '':
    7 |( D6 h& T9 G- w/ B
  187.                     self.connection.send(self.snddata)
    ' n0 d& @% C; D# J
  188.                     mylock.acquire() % L! K: W& z: c; B. Z, a
  189.                     self.rcvdata = ''
    \" k9 J1 @4 h. }! r& r1 u& s4 J
  190.                     self.snddata = ''6 U, S$ f& O( b
  191.                     mylock.release()
    : [7 k9 P% }) r( O, u: r
  192.               except Exception, ex:
      j\" `; S% P+ i( Z' \! o: j
  193.             pass        \" v6 d& i8 V8 s% E0 w
  194.     def stop(self):$ r# k& E% V6 R+ g
  195.         self.alive = False;& v9 r2 P! o0 R- g/ P1 U
  196.         self.thread_read.join();
    0 b! X' g% B. t6 ~# M5 m! q
  197.         if self.l_serial.isOpen():
    6 @/ d5 n* i1 ?6 r+ v/ `
  198.             self.l_serial.close();
    # @% j7 \( `1 C: R4 T) s

  199. 4 B: C( M; B2 l) E9 J/ V- _3 P
  200. ! J) ^. V) f' r: ^& f6 J
  201. ; U, e( ^- e; ?& N5 l2 E; y+ ]
  202. #测试用部分
    . i/ G7 q* S! y; X
  203. if __name__ == '__main__':+ \0 D( h) `/ q% _
  204.     print 'Serial to Tcp Tool 1.00\n' \" W8 i# G0 B0 J1 t
  205.     print 'Author:yangyongzhen\n'0 Z; K\" M0 [- A. x! a2 ^- z
  206.     print 'QQ:534117529\n'3 v5 y1 s  H; `' `# g
  207.     print 'Copyright (c) **cap 2015-2016.\n'( [4 }: S* S- Z) [5 p. N! X& K
  208. ; Z4 M$ @) F$ P\" Q! }  i
  209.     Server_IP = raw_input('please enter ServerIP:')\" o8 w$ c$ z7 }! q5 e  E
  210.     print 'Server_IP: %s' %(Server_IP)
    ' L7 u# T3 A+ h7 V
  211.     Server_Port = raw_input('please enter ServerPort:')1 Z9 o3 a+ G) X! ^3 [# S% |
  212.     print 'Server_Port: %s' %(Server_Port)
    7 H, |2 j5 W$ I$ J, A. p  g( b
  213.     com =raw_input('please enter com port(1-9):')0 F9 O, N; ?! R6 \: w
  214.     rt = ComThread(int(com)-1);* H: O) W8 v9 R* \$ ^
  215.     try:8 K! `( c6 K& ?% _  \$ v9 ?
  216.         if rt.start():, O9 I1 _$ M7 D
  217.             rt.waiting();$ L7 P0 I8 R' n* o' Z# N, u! A\" k
  218.             rt.stop();3 [( v( u( L* [9 X
  219.         else:# G* A8 v9 W9 \! ^
  220.             pass;            
    ( h  @' Q* A! p5 V8 k' y& S1 d% i0 \( Y
  221.     except Exception,se:
    8 a% p5 g/ O( |' w
  222.         print str(se);. q8 l7 l  l0 V

  223. ! ~) [9 k1 U  a6 g6 ~1 _; O% s6 f
  224.     if rt.alive:
    9 e( U$ j* O1 z2 W- f5 c
  225.         rt.stop();
    & s- A, o; e7 k4 ^9 [
  226.     os.system("pause")6 `3 d2 v9 _\" Q

  227. . l) g0 K& ?$ A; \7 V, A' M
  228.     print '';
    & ~0 o$ f% [, U0 [\" q8 t
  229.     print 'End OK .';
    ! d, e6 [+ I# z* R! k! K
  230.     del rt;
复制代码

1 {  U! s( K9 R! O
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-9-2 08:23 , Processed in 1.496357 second(s), 51 queries .

回顶部