QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    : |2 w4 _6 Q4 W5 [

  2. 3 i+ u0 p& X3 U6 A# x; ^

  3. 9 c' j# w7 [4 e3 ~( E
  4. import sys,threading,time;5 z: |! Z% s, D5 I# ^
  5. import serial;
    . I' _: }. {# P2 F
  6. import binascii,encodings;
    5 N- S: k( v3 ], z
  7. import re;6 E5 g9 u6 f1 K  }
  8. import os;) E0 z( r$ _, X' K7 e  j  i3 [
  9. from socket import *
    # A0 d7 m\" G/ }
  10. from struct import *;
    ' }, c: K$ A\" I\" A; k; R: o
  11. #from myutil import *;% \/ w' |$ p8 J6 r& j# v
  12. #name: myutil.py
    2 Q$ \7 v' {3 f) `

  13.   b1 X* q& e' N0 L/ `
  14. mylock = threading.RLock()
    + e4 ?8 Q- E3 A; t' T3 K& e* f

  15. ; c- [3 P# q' v) n. t4 d
  16. Server_IP = ''3 @+ k  `( Q0 x& a4 Z5 A* @
  17. Srever_Port = ''
    % \# V4 u\" |9 z) o$ v
  18. + q5 }+ E5 W) s\" |
  19. def print_hex1(s,prev='0x'):
    $ A9 R  b\" q, y, i
  20.     for c in s:
    1 h4 x% z% h$ ?& S& r: D9 E$ [
  21.         print '%s%02x' %(prev,ord(c)),  R  N: m' I9 E3 g9 D( B
  22.     print! p\" N0 R7 E( o/ T
  23. def print_hex(s):
    9 U0 H+ I1 b( |1 v2 C
  24.     for c in s:% {# {6 e3 M( x/ Q# f% C, v* o
  25.       print '%02x' %(ord(c)),
    ; Q9 Z  k$ u! Z2 t
  26.     print  R4 C$ R% m! s

  27. 7 l2 }\" E9 G2 k0 M\" C
  28. def hexto_str(s):
    4 D+ ~* M  @- x% \; d
  29.   r =''
    % g$ K; Z; O2 I! d5 L$ `
  30.   for c in s:6 J. {+ Q, U* \/ k
  31.     r += '%02x' %(ord(c))
    * F# O7 ?( T( K/ t- U/ U- C) g
  32.   return r
    8 y$ M- ^2 p: E; H$ X) Z0 z
  33. def strto_hex(s):% _& U# m* Y\" f  z9 \
  34.   r = s.decode('hex')2 b& Q# d, T1 F  ?: i
  35.   return r  w5 q0 j- w' L  K0 A& P
  36. #''代表服务器为localhost\" c3 V2 G  `0 d+ l- w! `7 [

  37. + G& `( G; x* P\" t
  38. #在一个非保留端口号上进行监听# y  V' f& i* k/ C8 @
  39. . |; _1 J2 ~6 I& x5 `$ h8 ~( ?

  40. * P\" A) z  y! M$ d# c' E2 |7 {
  41. class ComThread:4 w8 ^0 }\" A* n' c; p5 Z' O; B; N+ ~
  42.     def __init__(self, Port=0):% A) w. B# q( @  V6 J+ r% G  e
  43.         self.l_serial = None;: ^: g1 R8 |8 u1 c% w- p
  44.         self.alive = False;- r3 j7 u( X\" q8 p8 p% D9 N\" X
  45.         self.waitEnd = None;
    \" v; E\" t) n5 g6 c% v, e4 @
  46.         self.port = Port;$ M7 u6 m; W7 E! y9 E0 f0 w( J& M6 [
  47. ) n- r: p: S8 N$ \
  48.         #TCP部分0 V% p* Z; f: z6 b* ?3 K
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    3 R2 E& R; r- [+ y; b# d
  50.         self.connection = None9 N9 [! `' Y, O
  51.         #数据
    / z9 z# f3 j& g7 B3 H: }1 [
  52.         self.snddata = ''
    ; u  ], r% c8 ^. v) L) B2 Q0 K- a
  53.         self.rcvdata = '', }% e7 P0 k2 p4 P0 s- F+ H) _! N# s

  54. % Z- h) \! }# \
  55.     def waiting(self):
    7 S8 Z# ]9 e# @9 N! X
  56.         if not self.waitEnd is None:
    6 L. u( z3 o; j4 k  Z  q
  57.             self.waitEnd.wait();
    * R) A& s3 u7 }! Z0 ]0 Y) l
  58. ; m, x1 ~4 e! S  v/ M* V
  59. 9 u3 p: ^, Y\" ^8 B; q7 p5 I6 g
  60.     def SetStopEvent(self):7 M\" Y0 {7 M/ v/ {+ c
  61.         if not self.waitEnd is None:8 C$ h/ A) g4 r( ~0 v, q( P- T
  62.             self.waitEnd.set();2 _+ O1 F+ g) |2 D
  63.         self.alive = False;1 Z# n6 C' A3 ]1 W5 V% {7 S5 v! o/ }
  64.         self.stop();6 }$ ^9 m' j  i# {* K. P

  65. 3 _, p9 t# S7 Q
  66. 5 \% b& M! R  d
  67.     def start(self):
    . r, u3 j2 N% v5 O/ z
  68.         self.l_serial = serial.Serial();
    , S. L( n- R( Y- o! ]/ l
  69.         self.l_serial.port = self.port;' _# q; c# _0 C* r
  70.         self.l_serial.baudrate = 115200;1 k! i+ s8 l$ i
  71.         self.l_serial.timeout = 2;  #秒
    ( n! C6 N( W( x) M5 A5 v1 P
  72.         self.l_serial.open();
    , K# z/ {9 o7 j; J
  73. / o  o% U2 s: I' J6 Z
  74.         if self.l_serial.isOpen():
    % j3 x% _# H# K
  75.             self.waitEnd = threading.Event();
    ( }& I9 Y% k6 n$ {7 p
  76.             self.alive = True;\" Q# n+ g8 R7 ~( P\" u. c' ]; A\" A
  77.             print 'open serial port %d ok!\n' %(self.port+1)
      G7 L2 Z5 F9 S% A* i+ H
  78.             print 'baudrate:115200 \n'! B; t. J6 @  E0 w9 u: w. d% m
  79.             self.thread_read = None;
    # D\" b4 R$ |9 t/ {: r\" e
  80.             self.thread_read = threading.Thread(target=self.FirstReader);& a( @' |; F; n4 |
  81.             self.thread_read.setDaemon(1);
    # s% q0 E' w# I0 A4 N0 ^5 M' S
  82.             self.thread_read.start();
    ( {. l) `- N\" n. s8 l; L
  83. / a5 W( q% a0 u+ Y; x0 s
  84.             self.thread_write = None;* o0 o+ T8 K7 P( z; p: b% B; g
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    - e) q& `9 W7 m4 D! x1 O
  86.             self.thread_write.setDaemon(1);( D. R5 z, q, B; B1 N1 w: |# y
  87.             self.thread_write.start();
    5 b9 ~( A* f/ U$ V
  88. \" R( b% W2 y. H
  89.             #TCP部分( A3 @# q$ q! N& a3 d% e
  90.             self.thread_TcpClient = None;2 r/ l$ k\" b( R5 U& z
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);& k6 k1 e& h; N8 o
  92.             self.thread_TcpClient.setDaemon(1);4 N, ]1 t5 B1 g; ?5 M
  93.             self.thread_TcpClient.start();
    9 t4 i4 K( n# e$ u6 c( q% z. g
  94. 9 S# D: e/ Z# W# o
  95.             self.thread_TcpSend = None;# v( S$ V5 _' M7 s$ g
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);
    6 m7 ?! ^  |& I) y% [& v
  97.             self.thread_TcpSend.setDaemon(1);  y! U+ M# c- P, M/ {* b: j+ e
  98.             self.thread_TcpSend.start();
    ! n$ l% Q0 D1 Y: V

  99. 5 }9 |) |, m( P9 |* s$ U6 V5 U
  100.             return True;
    . _; R* g  U% [3 H/ b
  101.         else:
    ( m( d\" T4 ?4 j4 w
  102.             return False;
    7 n6 z\" \* z* T5 m% N' M

  103. 5 J0 q* |3 B' s$ i8 r) V$ y\" H! [

  104. , d, ]\" O/ p+ [% C- [
  105.     def FirstReader(self):
    & A' ^% ]$ i8 z& V6 `
  106.         while self.alive:( C* l9 s\" g7 A- d\" @
  107.             # 接收间隔
    6 C9 j5 T: G* t5 n' Y/ |
  108.             time.sleep(0.1);! L! F$ X9 w: [! ~
  109.             try:* f\" t* U1 ~. e) E; e# ]% H
  110.                 data = '';
    0 [1 v+ C  r8 K* j5 F
  111.                 n = self.l_serial.inWaiting();
    ( Q9 a2 m& ~& x5 W0 u. l0 i
  112.                 if n:
    \" i7 r2 P; e\" Y\" j! z* f/ W2 p
  113.                     data = data+self.l_serial.read(n);$ Y# a2 C  O; Y4 r4 N6 i( r
  114.                     #for l in xrange(len(data)):\" \: w. e/ k, j
  115.                         #print '%02X' % ord(data[l]),8 U! ]* M+ H4 L; A& I* ]
  116.                     # 发送数据! |# d+ }& n. \8 r7 C; U$ \3 \
  117.                     print u'->请求:'
    / h7 {/ ^2 {' c4 Q& m9 o/ R# ^3 n
  118.                     print data;
    1 h7 Q+ n$ t& H3 t
  119.                     mylock.acquire()
    # j6 @8 z  g! h) v  Y+ [8 W( d; |
  120.                     self.snddata = data! W1 }6 M1 ?, @4 b8 o: e$ |
  121.                     mylock.release()! X5 G; V$ L# L- w/ s& n
  122.                     #print_hex(data);1 ~! E, o9 V  h1 n1 j+ _) v/ L% h
  123.                 + w5 o: t$ b0 s# C2 A/ i
  124.                     
    / L  n\" w) s7 Q+ P8 C; u& S6 D) \3 @
  125.                 # 判断结束+ o+ M# J% Y: {3 ?8 }
  126.                
    ! h+ ?\" P# V' x) h4 y, g
  127.             except Exception, ex:
    # w; B( [1 m# G- x2 t4 d- x8 ]& q! o$ P
  128.                 print str(ex);# |0 K/ E3 L7 `\" s0 j) }2 n
  129. 1 n  }2 m4 W- G
  130.         self.waitEnd.set();+ F. y: @: }4 W* [
  131.         self.alive = False;. r: p* Z4 |5 G0 l  }

  132. # v9 j; a7 z5 x: {
  133.     def FirstWriter(self):
    4 A4 }+ n+ h1 S4 H
  134.         while self.alive:
    4 d# A9 |# y( G! u\" U- K9 h; [% I  z# W
  135.             # 接收间隔
    % K; z+ p: n2 }$ i8 g, g
  136.             time.sleep(0.1);3 A! I6 J* x8 g+ J2 [) \4 b7 |
  137.             try:; v: j, L9 T6 p3 a
  138.                 #snddata = raw_input('\nenter data send:\n')- T0 J9 M8 b# G( `
  139.                 if self.rcvdata!='':: F; }2 e\" X% x7 X/ Q4 ?
  140.                     self.l_serial.write(self.rcvdata);
    5 f# p\" `0 d. f, Y2 J. a
  141.                     print u'-<应答:'
    : T( Q. w: Q4 s1 `/ Z5 W
  142.                     print self.rcvdata;! X& n5 _* x! q, k, @
  143.                     mylock.acquire() ( ?% a3 s' H' e; L9 l
  144.                     self.rcvdata = '';% d( L* _: d- W: _, }, U\" ^# D
  145.                     mylock.release()0 j0 G( X3 x; E* d7 w1 P( b( Q, ^
  146.                 #print_hex(snddata);3 b7 O' A  t, }7 l& R1 I8 z6 v' h
  147.                 ( F0 k1 S  f: a( |8 f% }
  148.             except Exception, ex:0 P5 d0 i6 j7 E2 N: R
  149.                 print str(ex);5 Y& {. u7 n4 V- r! l) T3 w
  150.         self.waitEnd.set();
    . e4 r& r! u2 }/ g) G
  151.         self.alive = False;
    \" _* `7 T6 p( u& M' S  c
  152. % |3 k* G3 S4 z) x' e6 j\" K0 `- S
  153.     def TcpClient(self):
    , B2 ~4 @& o6 s
  154.         while True:
    % A4 K5 ~. z  O. v# O; o
  155.             # 接收间隔; h% {) u0 X7 x& Y7 u! d\" s
  156.             time.sleep(0.1);
    * S2 ?5 D5 c# i
  157.             self.connection = socket(AF_INET, SOCK_STREAM);) Z6 ^$ R- \8 |  A
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    % Z9 o5 Z2 [  ?; I5 g( i
  159.             print 'Connect to Server OK!';
    1 V; u6 T5 \- P. K) z6 E/ n; N
  160.             self.snddata = ''
    - I) P9 o, x% E# l! J' j
  161.             self.rcvdata = ''
    * Y; L5 B3 V5 e
  162.             while True:
    & b* |) f2 {0 X: |6 m
  163.             #读取客户端套接字的下一行
    9 B  a! D' Q; \# h% U8 T1 j
  164.             data = self.connection.recv(1024)5 {4 D- P+ X8 Z% l
  165.             #如果没有数量的话,那么跳出循环4 c. H% ~; a! p
  166.             if not data: break
    8 C& ^5 h( V$ c$ r( l! Q' O  W
  167.             #发送一个回复至客户端4 b- @4 Z- m1 s
  168.             mylock.acquire()
    \" H3 ~- M( a+ w% e/ B
  169.             self.snddata = ''1 `8 w# m( t# P# k( b  R9 n
  170.             self.rcvdata = data! s4 J  Z3 j4 H2 K* _
  171.             mylock.release()
    % Q, {( M) h+ S\" R
  172.             #connection.send('Echo=>' + data)% z1 T: z! G& J# o' Y1 Q( D6 m  L
  173.             self.connection.close()
    4 d, J- p/ ~7 H9 h4 X

  174. - h& Y8 N( Z8 c/ F\" b2 R3 ^, {
  175.         self.waitEnd.set();
    1 U0 b( z  S2 k& j) L0 c
  176.         self.alive = False;
    # i4 ^4 |: [& e7 C: ]4 G% A0 i, W% y

  177. * x: K4 _. d\" W, s
  178.     def TcpSend(self):\" A# Z, X0 f. o4 O. m
  179.         while True:, J9 x) w, z  g
  180.             # 接收间隔4 q3 D% H+ p( i
  181.             time.sleep(0.1);
    : N( }\" l# z) d8 v* h* J; ?6 y
  182.             while True:
    9 C1 P# O\" T% _4 }\" O2 _
  183.               time.sleep(0.1);
    2 k( d1 i: e6 q\" m  w% _! A/ Z
  184.               try:) M6 v2 Z4 v* V! w# C+ @' ]
  185.                 if not self.connection is None:% B4 V: k7 t; I. T8 b1 _& T
  186.                   if self.snddata != '':: |( {1 J+ y' x# N6 z& E* |: i
  187.                     self.connection.send(self.snddata)
    . i/ z1 V2 P; F- B, w
  188.                     mylock.acquire() ( O  \, v% U6 h& h+ h1 ]1 C
  189.                     self.rcvdata = ''1 Z5 p9 j' l8 X+ l! p
  190.                     self.snddata = ''  s+ ?) n. @# W! V3 A+ p/ s+ q3 ]! {\" R
  191.                     mylock.release()
    & E& R2 a& Q1 s: w
  192.               except Exception, ex:) p5 s  q% A/ K3 F7 }# ~- s
  193.             pass        % W2 ~5 ^# ~\" Q2 E3 t\" A
  194.     def stop(self):
    1 c7 c& `7 e  `, X& M+ h4 E* T0 i
  195.         self.alive = False;
    ' `, T6 t0 K5 j* M' j
  196.         self.thread_read.join();
    + p* T+ i/ w3 ]* h: g& J& h
  197.         if self.l_serial.isOpen():! P% G\" E0 y% v\" e) D' i: n+ F
  198.             self.l_serial.close();
    0 S, R, J; e2 j' @
  199. + E! R% r( }- x- u7 l
  200. ; y2 {\" |3 L# J! m  n! n( Z* c
  201. 9 M  P% r( m1 O$ S$ K8 p8 i# p; ?
  202. #测试用部分
    & ]& F5 Q\" F; B8 R0 w0 u
  203. if __name__ == '__main__':/ s8 d( S& }& c+ e9 X  X3 V* F
  204.     print 'Serial to Tcp Tool 1.00\n' ( y: R! p. A& q3 S
  205.     print 'Author:yangyongzhen\n'
    7 d3 {* x+ |\" y3 L
  206.     print 'QQ:534117529\n'
    + J1 m8 Q9 O' m2 z- u8 h1 R
  207.     print 'Copyright (c) **cap 2015-2016.\n'. v8 I3 G) D0 S3 t9 j# k4 ?% e

  208. * r! k9 `5 {\" [6 q& ]
  209.     Server_IP = raw_input('please enter ServerIP:')# I2 ?  L3 Z( Q8 u) b' }
  210.     print 'Server_IP: %s' %(Server_IP)
    # `: ?' D& x  e8 R3 Z8 Y
  211.     Server_Port = raw_input('please enter ServerPort:')
    1 \  l9 B+ g. b7 k+ W7 ~+ z  n
  212.     print 'Server_Port: %s' %(Server_Port)
      t& m1 U; O2 N1 x
  213.     com =raw_input('please enter com port(1-9):')- i1 {  d3 w$ ~& f\" ]) H
  214.     rt = ComThread(int(com)-1);
    2 i6 O' C5 e* H/ r
  215.     try:
    9 y! x. C1 A6 x+ u3 N7 E
  216.         if rt.start():0 j- X4 b9 s! o' s8 ~( y! ^
  217.             rt.waiting();
    1 T6 @% s& b8 O' Z* G
  218.             rt.stop();
    3 u) s\" Q. F2 n$ O- u/ s
  219.         else:
      G3 ]8 L: ?' J3 {0 h) Z
  220.             pass;            \" W6 F* L& e) {7 C
  221.     except Exception,se:
    / E, }\" w6 k/ `, O$ {1 B8 ^
  222.         print str(se);8 v4 I+ f: m' Z  ^( G) P- }1 R

  223. 6 A9 j( _& t& @7 Q- e; R; a; Y5 O
  224.     if rt.alive:* V2 V4 h% L; I
  225.         rt.stop();0 x- I9 @8 S. Y5 r( c) S
  226.     os.system("pause")
    . M$ _( D, Q\" v$ N$ A( e4 v% v
  227. - U2 H& O$ A, }3 D+ ?# z! F
  228.     print '';
    * v$ Q1 x0 B) }% B+ m' X7 n5 t2 {- H
  229.     print 'End OK .';
    * E; @\" T  K& }, m
  230.     del rt;
复制代码

+ N, q& h, i: j) W+ v$ r
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 08:26 , Processed in 0.422797 second(s), 51 queries .

回顶部