QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8. U4 Z) Y7 D, q! S! k- @* J7 D- }

  2. 4 k- G- |9 h/ A( B+ W

  3. 4 ]9 X9 |' D! h. H; E: j: i
  4. import sys,threading,time;; b# y4 q: c0 u% ?/ x+ f
  5. import serial;4 Y+ Q) _( M4 V8 c
  6. import binascii,encodings;& M. Z3 o9 x  y\" J8 ?2 n
  7. import re;1 T1 H0 v( M, \
  8. import os;
    , a& A( _- R$ s
  9. from socket import *
    + G* v& d, H9 q$ r- c1 _) F5 L, I8 G0 p\" y
  10. from struct import *;
    & V/ r% {. w) C2 R6 i1 Q6 Y/ b2 h
  11. #from myutil import *;1 k  d5 d' [8 U
  12. #name: myutil.py9 x\" t0 [8 h( E
  13. ! J- y/ Q  X# Z\" n5 H$ Q$ b
  14. mylock = threading.RLock() # P' _5 O  c7 T& }6 ]' E
  15. - E1 G0 n. h' Q1 B
  16. Server_IP = ''
    9 D* |3 E8 k' Q+ g
  17. Srever_Port = ''& X; J5 m1 z& ^# S) b+ C5 Q
  18. 3 w: E\" u$ g7 a2 k6 t( G, k8 I
  19. def print_hex1(s,prev='0x'):
    0 {' N( F9 @3 q/ m8 f1 ^! _
  20.     for c in s:8 }- \& Y; l, C6 j
  21.         print '%s%02x' %(prev,ord(c)),
    0 K$ a7 O8 A\" P\" _
  22.     print\" \2 k  z9 a/ K
  23. def print_hex(s):7 c  T# E$ A+ S8 j; K
  24.     for c in s:
    : B% c; Y, W4 b1 F4 k
  25.       print '%02x' %(ord(c)),  s) P! _# }: N+ D9 B( o% A
  26.     print8 C\" O4 B. W! B4 k' G* m8 u% I

  27.   k' W- ~- x+ P% D
  28. def hexto_str(s):
    ' u6 y0 l- G0 y4 y, y. Y$ e' _, k8 w
  29.   r =''
    ) A- {  S2 B) a% f3 [
  30.   for c in s:
    * I8 m* n1 u: k) p6 w
  31.     r += '%02x' %(ord(c))) k( G+ z& W, y  q\" e# A+ n
  32.   return r* D, @% ^- V9 W4 w6 d) H9 N) s
  33. def strto_hex(s):! X2 J; n* a6 ?2 {3 h' N% T$ u0 M
  34.   r = s.decode('hex')
    ( g3 u  h- ~8 M4 [6 z
  35.   return r* i! Z0 ]8 g; c5 k
  36. #''代表服务器为localhost
    5 I2 ^  y3 e, P2 H8 b  s8 R
  37. + ~1 `9 W* e! `8 A' u! d: R
  38. #在一个非保留端口号上进行监听3 O& g% \, ~; n2 _+ S

  39. . F4 v\" P6 t\" b8 S
  40. / T: q4 v6 T( k; m8 _
  41. class ComThread:
    ) E5 w; k; d& ]& f5 x
  42.     def __init__(self, Port=0):
    0 p* B4 h, x2 l
  43.         self.l_serial = None;
    \" ^2 _7 n# K' t& \) f' c' W: a! J( M
  44.         self.alive = False;
    0 u% `1 v: Z! Z' j5 ]& c. [
  45.         self.waitEnd = None;2 l- u* G& h3 U: _* n
  46.         self.port = Port;
    5 i# Q\" H) W) Z$ U; Q9 J( l4 v
  47. & K* r9 I\" D2 ]) s$ l
  48.         #TCP部分
    - @\" A  w' I& a' r/ ^* [
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    % L$ Z: i0 f8 q# ~# S  Z/ X
  50.         self.connection = None% ~* `  k; W. B0 e7 j( ~# O
  51.         #数据
    4 Q\" `# z, b. h% i& T! N: D
  52.         self.snddata = ''
    9 V6 j. x  `- e$ p
  53.         self.rcvdata = ''' @/ W5 Y$ c! s
  54. 2 y6 n% J7 C\" k; B) Q# l
  55.     def waiting(self):: K: L2 U- w2 j
  56.         if not self.waitEnd is None:
      P' Z' j) F7 X4 M8 V+ U% e4 h& }
  57.             self.waitEnd.wait();4 u8 I5 c! `% i& d. S9 X& P  D

  58. 9 ?3 b* R/ ^/ d6 c
  59. ; D& |2 S9 [1 H& k/ Q2 s
  60.     def SetStopEvent(self):
    / t% K7 c7 l+ ^( [. o: m
  61.         if not self.waitEnd is None:
    # L/ E, C! g* O9 c# C
  62.             self.waitEnd.set();- U$ ~3 j8 z0 r' q. G
  63.         self.alive = False;' a- A0 B% T5 k6 l/ }& v
  64.         self.stop();( ], S2 l\" g# j8 t, s3 q& @
  65. ' t% A6 W% G2 l3 D) I6 |$ e

  66. $ T! W$ }+ O! i! g3 X! u
  67.     def start(self):
    5 N! a$ K, ]8 @
  68.         self.l_serial = serial.Serial();5 P7 V5 {! x% s! }' [
  69.         self.l_serial.port = self.port;# v% P: e4 ?& {- l7 L\" D# J6 {
  70.         self.l_serial.baudrate = 115200;7 r* P, {' h/ p7 }7 N
  71.         self.l_serial.timeout = 2;  #秒
    + ~# L+ w$ A& u6 F- W9 T
  72.         self.l_serial.open();3 V: H9 a; h1 I

  73. ) l* t1 J$ I- s0 N% Y
  74.         if self.l_serial.isOpen():1 H: x) H( u. I. Y! a
  75.             self.waitEnd = threading.Event();# W( l0 R) x% l6 {/ F
  76.             self.alive = True;
    9 u8 |$ f# C! w' B6 u1 N0 p% H9 m+ t  ]. k
  77.             print 'open serial port %d ok!\n' %(self.port+1)
    ( _9 q& {' }& e& \
  78.             print 'baudrate:115200 \n'7 G9 u) p' u; N
  79.             self.thread_read = None;/ U; I; x' ^# U9 k- b: A
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
      T. y! [5 t% G  Y# n- d$ Z
  81.             self.thread_read.setDaemon(1);\" F  y, ^; x5 ~8 H2 Y\" P; d% }
  82.             self.thread_read.start();/ R* R+ j) m7 N: [# j1 _

  83. ) I% s3 E3 u9 h; T# W
  84.             self.thread_write = None;
    $ j, |\" l$ z4 G# m9 N0 D7 {, I
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);% T4 Z' M1 ]2 g; l, f
  86.             self.thread_write.setDaemon(1);
    ' f1 r. B! u8 a) m
  87.             self.thread_write.start();
    2 d9 Z( p2 ~\" K7 |

  88. % s- O2 Z' Y9 U+ O) o
  89.             #TCP部分2 O3 p! v3 [. Z0 I* @5 A
  90.             self.thread_TcpClient = None;( z# g# N4 W& ?+ e4 x: D, y
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);9 n# Y/ G8 X2 ?: }- {% {8 I' ?# q
  92.             self.thread_TcpClient.setDaemon(1);
    ) b$ J2 `  S# _$ E8 c( H( _
  93.             self.thread_TcpClient.start();& ^2 B# P% M, F9 R. A7 q
  94. 4 w\" n8 c( N% Q6 E5 [; p  m
  95.             self.thread_TcpSend = None;, `* H\" f' r, e9 @2 x+ Y* I$ f
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);
    / ?1 U$ ]% }2 j: I. P
  97.             self.thread_TcpSend.setDaemon(1);9 J  `4 B7 O& b. R* V
  98.             self.thread_TcpSend.start();8 N$ T; E  o7 I+ |  ?/ L

  99. # \7 P& E; y) F! A
  100.             return True;  x! |2 O$ J$ ]& n6 Q* u
  101.         else:/ T. G- [* e6 {6 q/ [/ m) j3 _
  102.             return False;1 s3 M3 d8 s7 |+ v& ]9 ~1 X# g

  103. ! C, V1 {1 j9 J# ~3 f( ~

  104. : w\" M, d2 w6 o6 Y+ X5 z. d( R
  105.     def FirstReader(self):2 C  u\" ?: ]% e8 w6 F2 J\" I/ I9 A
  106.         while self.alive:. Q& O) F, c% r8 l3 |+ c
  107.             # 接收间隔* P0 S* S3 f) t
  108.             time.sleep(0.1);+ e: \\" n; `1 j& x, t1 j
  109.             try:) e5 |! Z- b5 R! m: `1 p4 t
  110.                 data = '';' _7 F8 n( ]+ q9 H: k\" v5 ?# w
  111.                 n = self.l_serial.inWaiting();- M$ F! I# x& [4 d8 X
  112.                 if n:
    4 b0 ]' C9 O7 t\" Q, v4 b* q
  113.                     data = data+self.l_serial.read(n);# }, V- U% W2 Y  w3 `9 z. y
  114.                     #for l in xrange(len(data)):
    , }0 G8 ^4 W4 H8 }0 i
  115.                         #print '%02X' % ord(data[l]),
    2 S) K: a* ?2 s( `
  116.                     # 发送数据7 z# f. p: a# h! B0 y
  117.                     print u'->请求:'
    8 J, Z+ R2 i9 K. U' m  _
  118.                     print data;
    ( A& B! B& L4 A, Z! q: y* o2 s
  119.                     mylock.acquire() : Q& g- G6 o2 Z1 B) h
  120.                     self.snddata = data
    3 @4 G/ Q0 A4 y/ h\" p
  121.                     mylock.release()
    9 ^1 Y( `. \$ U. x, Z( f
  122.                     #print_hex(data);
    * J- o0 v6 k0 b+ D# `
  123.                 # f  V* G$ c  g0 I' {& `
  124.                     
    3 r4 s# Q3 k& C0 Q% H( a$ m; j
  125.                 # 判断结束% [( S0 D3 ]! \+ G$ H
  126.                
    ( W% Q; A! u# N/ w& J
  127.             except Exception, ex:
    ' ^6 X% h- W) l
  128.                 print str(ex);
    & F! g9 ?0 j6 v* n
  129. 5 m/ a9 e- B3 M' J( M
  130.         self.waitEnd.set();# D: R! s0 z7 b7 o\" k; V
  131.         self.alive = False;5 x; v& T, y  M4 w- a4 C* V

  132. 8 J; k5 Q! N- }; b% t; V
  133.     def FirstWriter(self):
    + L/ }0 Q8 Z8 l& ^# b9 ~
  134.         while self.alive:* r, C; u! f; A
  135.             # 接收间隔9 q9 n\" r$ \2 b0 N6 A2 |. s
  136.             time.sleep(0.1);
      g7 Q+ M. @+ v/ V7 L5 j; c
  137.             try:
    . @# ^/ X. }) _& e  M
  138.                 #snddata = raw_input('\nenter data send:\n')
    * `: a8 D- V# w9 s8 J\" M+ [% Z$ Y. ^$ a
  139.                 if self.rcvdata!='':4 V0 Z# j9 Q8 x: h2 {/ G; X
  140.                     self.l_serial.write(self.rcvdata);
    6 V& G$ Y4 _3 c3 y2 f
  141.                     print u'-<应答:', p( O0 w. x3 n* ?
  142.                     print self.rcvdata;
    2 N; m, P. H  h+ M, L7 Y. ^
  143.                     mylock.acquire()
    4 \8 E\" f5 _# Y* j. z
  144.                     self.rcvdata = '';. \+ B2 |1 b! I' h
  145.                     mylock.release()
    / g/ m5 T* ?) J, W) l+ E& Z
  146.                 #print_hex(snddata);# H5 B' j9 c# P7 o0 }4 O9 q0 O
  147.                
    , |# C8 i5 [% F# X0 Z
  148.             except Exception, ex:9 G1 \' t9 b  f
  149.                 print str(ex);
    - _- R, ^* \\" p! X8 m8 \
  150.         self.waitEnd.set();/ ~. H' T7 [* I: @
  151.         self.alive = False;
    + Y3 A: @- P' |* b& a

  152. 8 {9 K/ g/ M+ }+ \
  153.     def TcpClient(self):
    % }5 E: h% p) C3 e0 v! F% f
  154.         while True:
    $ l: z) v8 |  s. A2 D$ s: P% a
  155.             # 接收间隔
    ( z5 d7 y, ?) M4 K2 k
  156.             time.sleep(0.1);
    6 d\" c, n; p9 \
  157.             self.connection = socket(AF_INET, SOCK_STREAM);- [% X/ w6 x; m2 r: M. `\" l, H
  158.             self.connection.connect((Server_IP, int(Server_Port)));3 y4 ?( r4 ]( G: D- y
  159.             print 'Connect to Server OK!';
    ( J) u% E' Q, v; G' z7 g0 ]
  160.             self.snddata = ''
    $ v$ e: M$ W3 n8 ^( ?1 W
  161.             self.rcvdata = ''
      S, [5 }; i5 l  R
  162.             while True:# \: m6 O' @+ e. R2 a& ^
  163.             #读取客户端套接字的下一行8 G9 |2 U  H2 Z6 C\" Y1 N
  164.             data = self.connection.recv(1024)* W/ F3 @4 l' R- a9 N
  165.             #如果没有数量的话,那么跳出循环
    8 n+ N$ _: n5 h% |3 R0 f
  166.             if not data: break
    : K# G; c' {6 T* R
  167.             #发送一个回复至客户端
    ( B& k( S% ]6 b2 I. B) \. E- v
  168.             mylock.acquire() . I. p2 B) _6 f+ \5 i( o1 x' l
  169.             self.snddata = ''+ E8 H3 R. w5 R, W+ V# N
  170.             self.rcvdata = data+ {- k- k2 e2 T7 X
  171.             mylock.release()
    / s! W1 P8 L+ I2 h
  172.             #connection.send('Echo=>' + data)! m: x3 W; |8 z. p7 M, [
  173.             self.connection.close()/ W5 e& L: ]) ?7 p; v) W

  174. # C! _$ u& L9 j0 ^\" [
  175.         self.waitEnd.set();
    % }  J6 b4 z\" M$ j* v
  176.         self.alive = False;3 M# b& R4 Q$ I7 i
  177. 1 X' n$ R, o+ E+ J8 \6 [3 V\" V, [# z
  178.     def TcpSend(self):
    , g* N) U* A% n\" o4 X
  179.         while True:) m) W4 j* u& o8 t- c\" w, z9 p3 ]& M; j
  180.             # 接收间隔9 h9 m, J8 E: C% u4 {3 p8 P3 w+ r' c
  181.             time.sleep(0.1);
    , k  q/ r3 H' U) l) q% ~* m
  182.             while True:7 n! T8 [0 e7 E2 Q; d9 i4 U- n
  183.               time.sleep(0.1);
    ; b& z1 T- \$ D# Q. M
  184.               try:
    0 f% c( B; @\" f5 R1 s
  185.                 if not self.connection is None:9 a7 b9 j) p: Q+ L4 f; ?# ]( x4 t/ a
  186.                   if self.snddata != '':
    0 ]2 R- x4 l\" K# t
  187.                     self.connection.send(self.snddata)
    $ t  {% J0 e- w
  188.                     mylock.acquire()
    ! ~& L$ R7 j3 r. f( ^6 K! {
  189.                     self.rcvdata = ''; O\" b( S/ `+ z# z) L3 ]
  190.                     self.snddata = ''
    + b2 L1 @: K% Z2 l$ l! b
  191.                     mylock.release()
    0 @& J; ^3 ]- Q) b- b
  192.               except Exception, ex:
    2 B- ^% E' S! k2 d  M
  193.             pass        
    1 T! j: C* ?: a
  194.     def stop(self):
    9 T  y( s5 n, o: \
  195.         self.alive = False;( t; _3 u) r( W7 X0 U  D; d! V7 p
  196.         self.thread_read.join();
    & o6 y  M0 Z$ ^' E
  197.         if self.l_serial.isOpen():( c: p\" Z$ Z; e8 [; m9 j
  198.             self.l_serial.close();
      U0 q9 {# ?% E

  199. 8 j$ N- [+ f1 E

  200. ' l5 e( |) W: k5 z

  201. \" v$ L8 @4 l6 N0 m5 ~5 k. m
  202. #测试用部分
    % a( L8 {5 X/ W  d
  203. if __name__ == '__main__':) Z( k! p# \! z. f
  204.     print 'Serial to Tcp Tool 1.00\n' & j5 z9 g7 T6 c& m8 \3 x) z4 k
  205.     print 'Author:yangyongzhen\n'
    ( z: e5 P3 G5 q9 {$ B
  206.     print 'QQ:534117529\n'
    3 m( H\" C' B$ T/ z' a# e, _: T( t
  207.     print 'Copyright (c) **cap 2015-2016.\n'# P7 X0 |6 f2 a! _. ^! ]

  208. ( f+ D1 Y# I  n& v2 u6 z
  209.     Server_IP = raw_input('please enter ServerIP:')
    + w1 W! f* `/ [* P+ e; V
  210.     print 'Server_IP: %s' %(Server_IP)( g\" h1 |, h# Y/ g% k5 \
  211.     Server_Port = raw_input('please enter ServerPort:')8 m- W+ h, U5 Q
  212.     print 'Server_Port: %s' %(Server_Port), ~6 x4 v0 e/ n1 i+ ^- Y9 O
  213.     com =raw_input('please enter com port(1-9):')
    * _9 l% m6 ?* l
  214.     rt = ComThread(int(com)-1);' P4 l1 q6 M; ]
  215.     try:( j2 \: w9 h! b! m/ W1 I6 [
  216.         if rt.start():, I; }0 Z$ R1 K7 D) {2 G
  217.             rt.waiting();! l8 l\" y- H7 f/ j% H
  218.             rt.stop();
    # O9 [5 g. M( M1 U$ V2 O: t
  219.         else:
    ' F+ y) N6 F; e
  220.             pass;            7 m4 `9 L( ^. |* @' _' y) g; C
  221.     except Exception,se:' {+ U+ v7 q/ q4 {
  222.         print str(se);
    + c' l7 H7 H. p5 Q
  223. 1 D8 s  _# r5 T3 [7 i
  224.     if rt.alive:6 b( A5 O5 O! b
  225.         rt.stop();  @0 `8 K' R$ h, Z8 j0 `
  226.     os.system("pause")
    5 q$ q, d  ]! Y% X$ U4 E7 r4 U
  227. + _+ _9 ?2 {+ S; G$ f3 {* G\" x( R8 X
  228.     print '';3 V* K4 L9 l  C! `0 Q. P9 A+ A1 p9 e0 A
  229.     print 'End OK .';) p) E; u# }* ?; l/ z+ t0 \
  230.     del rt;
复制代码
7 ?# |" v, J9 ~5 ~( @
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-1 07:28 , Processed in 0.468929 second(s), 50 queries .

回顶部