QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    # ~/ c# Z# }) O' I# j3 M, M

  2. : e2 D6 f- |2 c7 N0 E& I
  3. ( C/ y9 o) U9 c& }
  4. import sys,threading,time;6 K, o' y' R4 w8 N
  5. import serial;
    2 ?# H' d' w+ H9 L0 x6 m; Q
  6. import binascii,encodings;
    4 p2 _. O3 U9 n. B% N
  7. import re;
    & |- z9 Y8 Q1 v% ?
  8. import os;
    7 r$ \  J6 ^* `9 }8 R; L! P. L
  9. from socket import *
    2 z$ Y\" K, X, C+ o$ s$ b3 n5 r+ G
  10. from struct import *;
    / b. O' v9 Q  C1 ~- Z
  11. #from myutil import *;
    & S- [\" @) O$ A- f
  12. #name: myutil.py7 x\" Y( D/ C) c6 Z2 {

  13. 9 R. y! ^7 ?# l- N  b
  14. mylock = threading.RLock()
    ( T\" H/ _2 T' Y\" k# `: v
  15. * k$ M9 ~! z- W- o* F5 y
  16. Server_IP = ''% K$ R- V( D  G3 u/ U0 l& h
  17. Srever_Port = ''' c7 @- [  u- U* J6 k3 D
  18. ( C+ Z; V& d' H
  19. def print_hex1(s,prev='0x'):
    & n% W$ y+ T, k' X/ e& x
  20.     for c in s:
    0 l9 S$ w( ?+ @4 l. H% W- U6 I
  21.         print '%s%02x' %(prev,ord(c)),9 o+ \3 @& j% |, L
  22.     print
    ( |0 Q. P' F* A+ H4 Y
  23. def print_hex(s):4 h  X4 S% Z: G4 p\" B3 k+ q
  24.     for c in s:3 a0 p$ @9 L1 z) a
  25.       print '%02x' %(ord(c)),
    - ~& K0 K; e# b: k/ }1 ~( Y
  26.     print
    8 }# G- C4 B; i, h
  27. \" P) m0 f5 f9 `4 m) b7 o
  28. def hexto_str(s):, E, ~\" T- l6 V
  29.   r =''4 W- d, ]& \1 \- i1 s# `
  30.   for c in s:
    / l  q( \+ L% F2 e. g2 O  `
  31.     r += '%02x' %(ord(c))
    ! j' z) \9 N7 D  J, s0 Z5 W; U* f5 w
  32.   return r
    & Z3 |  ]$ O4 ?$ O$ ]! X# E7 @
  33. def strto_hex(s):9 j; D5 v7 N7 j
  34.   r = s.decode('hex')6 x$ ~9 L4 L* g* M/ ^
  35.   return r
    ; d% L& I2 Y: {1 O+ f  Z5 r
  36. #''代表服务器为localhost
    4 j; A0 }$ ~' d9 B: i5 U: x

  37. $ N( e) x$ ]! s
  38. #在一个非保留端口号上进行监听
    / ~, W: _- e1 r: U0 k% r4 l* O' M

  39.   ]7 e4 _6 _\" u+ o! n
  40. ! |\" v5 S\" j) }% O; R* r. u
  41. class ComThread:
    $ |9 Y: l6 W: ^\" x$ c- }' ]2 T
  42.     def __init__(self, Port=0):\" @- V0 n; b: ]+ t5 x' a
  43.         self.l_serial = None;1 c3 n5 a+ W, z+ i$ `$ r2 F
  44.         self.alive = False;
    0 |* |& b. q& `, x% y3 ]7 J
  45.         self.waitEnd = None;
    ; y- {! }* X. S- @# Z
  46.         self.port = Port;
    2 n\" V+ b; u1 R  ]: d, i

  47. 6 T: r% B. t& c/ ]' D3 _2 K
  48.         #TCP部分
    # t% ]( q) U( o1 K0 x
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    1 G& x0 V; K# |6 v
  50.         self.connection = None
    # h! J5 A( f7 u; t9 _1 l* n
  51.         #数据* B8 ~# |. n& f0 H3 b2 O* H+ t/ u( H
  52.         self.snddata = ''
    $ Z9 ~  K1 J1 Z. N
  53.         self.rcvdata = ''/ F4 F+ @6 ]* Z0 ~) i

  54. . U0 Y* h5 x$ C& v- M1 @
  55.     def waiting(self):3 ~9 Y) H# e7 G# b- f9 p0 {
  56.         if not self.waitEnd is None:; {9 R7 A7 T  s9 H
  57.             self.waitEnd.wait();! r6 R$ j: ]) L0 e. e  K% ]

  58. ) d1 e. t( U0 H5 F% q# `4 b8 f

  59. 2 ^+ g7 e& Q3 |  G1 m1 _( b- c
  60.     def SetStopEvent(self):
    7 `$ x( f+ N% S& i
  61.         if not self.waitEnd is None:
    , F) m, O1 t9 S/ M
  62.             self.waitEnd.set();
    & x8 y$ w2 A* x  W2 t& r9 ^
  63.         self.alive = False;
    3 S# G8 ]0 ]7 w9 q! p
  64.         self.stop();
    - h# m/ r4 B  _% e4 a6 p- ~

  65. 7 W* M6 d: }2 Q2 T1 ]% D
  66. 4 A0 @6 D3 V\" L* ~5 A- [
  67.     def start(self):
    3 X4 N8 N& R8 I
  68.         self.l_serial = serial.Serial();  }' `8 A( v4 m. [
  69.         self.l_serial.port = self.port;
    % @3 U; W) K  \1 D# P8 d! z6 [
  70.         self.l_serial.baudrate = 115200;
    7 {7 a6 `% n! ?1 o) l  j! Z
  71.         self.l_serial.timeout = 2;  #秒
    2 G. Q' H8 G' q+ J
  72.         self.l_serial.open();
    ' Y' T: n% B+ s% V7 ~

  73. $ J0 H2 t. ]7 \- a$ }* z9 U
  74.         if self.l_serial.isOpen():. o& N  K& Y5 c
  75.             self.waitEnd = threading.Event();( v1 i% H- Q1 j% K5 i
  76.             self.alive = True;% I$ X) _5 |- ~+ @! T
  77.             print 'open serial port %d ok!\n' %(self.port+1)
    # S+ |: f9 c3 p( z9 S( v( j1 \) h
  78.             print 'baudrate:115200 \n'+ z; I+ B! H6 ?( a; B
  79.             self.thread_read = None;
    + L! l( V; R$ x0 ?6 m
  80.             self.thread_read = threading.Thread(target=self.FirstReader);- d$ T+ l; D# d/ o! w
  81.             self.thread_read.setDaemon(1);
    - }\" Z! X7 ?' f7 P7 }) c\" F
  82.             self.thread_read.start();
    % w! j4 H; ]8 h\" V! B
  83. 9 f: }/ I. l  O
  84.             self.thread_write = None;1 }9 F; X- j! h: n6 H
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);/ W7 h! E- ]! X3 u
  86.             self.thread_write.setDaemon(1);6 B$ k: t& L) G& P
  87.             self.thread_write.start();& s' U- [* f! u$ |7 P: z2 K
  88. / g, J1 a$ W* j& J/ L# w3 @
  89.             #TCP部分
    # J* U- R( O5 |0 F# C( _, ~
  90.             self.thread_TcpClient = None;
    4 Y7 V- p2 ^/ o* Z9 G
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);' b& Y& E2 D! E, ?5 a: f
  92.             self.thread_TcpClient.setDaemon(1);5 R! F+ Z( ~\" {) R! ~3 {
  93.             self.thread_TcpClient.start();% e) ?$ [9 I6 a\" n) Y/ ]
  94. 5 y) a3 U: _/ H0 V* I
  95.             self.thread_TcpSend = None;, }. h. |5 V2 m$ H1 o
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);
    5 h% P7 D8 q, d% w
  97.             self.thread_TcpSend.setDaemon(1);
    $ a. d4 |1 U9 l' l
  98.             self.thread_TcpSend.start();- v) Z\" T% r& W
  99.   B6 v. X1 }! Y: [4 [1 k, k  p
  100.             return True;
    . e) j2 w$ T% X\" q
  101.         else:# Y$ s/ X/ I3 d- |% m\" b
  102.             return False;' d\" f' g* h* {3 H
  103. 5 X# [/ Q8 x5 r1 @0 j

  104. 9 e4 r* Y; i: U5 c! H1 l
  105.     def FirstReader(self):
    # d$ [& n0 D( ^) X8 s4 O
  106.         while self.alive:
    ! J: p8 h0 K  g3 B; \7 ~& G
  107.             # 接收间隔' `/ z0 {# R3 M& N& |
  108.             time.sleep(0.1);
    ! c9 w9 S; s* z; ?
  109.             try:1 t2 _) A! m4 g- U. S/ H, X
  110.                 data = '';6 r( v; m7 Y0 X6 r( P
  111.                 n = self.l_serial.inWaiting();3 s4 F/ @% Y. c
  112.                 if n:- h& G: n# H) h& e
  113.                     data = data+self.l_serial.read(n);2 y1 p! h% y* n  K8 U1 L
  114.                     #for l in xrange(len(data)):3 y% L( A0 N2 A8 X( B
  115.                         #print '%02X' % ord(data[l]),
    5 ?9 P& y2 Z* h- T: ]- q  n
  116.                     # 发送数据3 w* I. }  p, D8 F
  117.                     print u'->请求:'# _% X+ r: E2 A% z# w. C
  118.                     print data;: ?/ e* ]% V9 c5 p  o
  119.                     mylock.acquire() 1 ]* z/ t* ^: X% j: }; w0 j
  120.                     self.snddata = data
    6 V' X/ F- c6 ?/ A! [
  121.                     mylock.release()5 o9 H% o$ L% J% ]' ]3 ]3 F
  122.                     #print_hex(data);
    / P2 ^: D3 m/ u/ |# J! N4 t  w
  123.                 6 F9 r' g  ?0 w( }  ^* x1 d9 m
  124.                     4 v  I/ h\" E& b' f8 s2 D
  125.                 # 判断结束
    - P, c: k9 L( T( o& T
  126.                
    % U7 {! p& g* o  J7 M
  127.             except Exception, ex:; c9 e% i* Q  Q, n- ^
  128.                 print str(ex);# g\" \( K6 b9 b/ S' o' O

  129. 6 z( C0 \! K& P1 \+ o
  130.         self.waitEnd.set();
    # y) T8 O; @3 C
  131.         self.alive = False;
    ! `  Z# T& Z5 r0 G- j) @

  132. 9 j! s+ t$ u# X7 m9 p
  133.     def FirstWriter(self):) ~0 }0 l% W8 w6 e+ s& b  I3 i% F
  134.         while self.alive:
    7 R1 \' o) A. f( q$ i, L( S
  135.             # 接收间隔# _# \, F3 [9 h( `2 j6 ~
  136.             time.sleep(0.1);
    # ~5 J; K/ j$ v( }2 z
  137.             try:
    1 M: J3 _( O+ o0 x6 r, w
  138.                 #snddata = raw_input('\nenter data send:\n')
    ; L* j' m& ~5 @5 q% I$ p+ j: X' Z
  139.                 if self.rcvdata!='':
    # A5 ]4 ^3 R! Q$ w
  140.                     self.l_serial.write(self.rcvdata);
    + y! [7 H8 G% N1 g7 X\" E
  141.                     print u'-<应答:'
    ' E0 [  a8 @0 N3 y  c, D$ Q7 y4 ]
  142.                     print self.rcvdata;! G- n! @% [7 _0 L* W! I' _- t
  143.                     mylock.acquire()
    : F% D% W% ?: _8 m4 ?: _' b
  144.                     self.rcvdata = '';5 i5 Z* ^( ?% A' X! Q7 \, I7 a+ r
  145.                     mylock.release()
    , t  R, A7 @/ ]& @8 n% ^
  146.                 #print_hex(snddata);
    1 T\" U5 J) _( a8 \9 d5 t
  147.                
    6 H' Z8 g1 |9 G+ g0 `) z, y7 B
  148.             except Exception, ex:
    , G9 z; e7 ]7 F! J5 ?9 H
  149.                 print str(ex);( m$ m; @* p' L& X
  150.         self.waitEnd.set();( S3 F0 ]# I5 V. C4 i\" D
  151.         self.alive = False;1 G, t' ?8 d\" L. R4 E4 m1 D2 h
  152. ( x, [$ Q! \* h, |0 c
  153.     def TcpClient(self):
    $ V0 C: v4 Z1 ]/ j1 L- ^
  154.         while True:: t( `2 w$ m3 u( o7 G  i3 C' B4 m
  155.             # 接收间隔1 a. [* l# Y4 V* V0 a, j' n  y
  156.             time.sleep(0.1);
    ) Z3 A5 j9 Q- L; U6 J' x6 ]
  157.             self.connection = socket(AF_INET, SOCK_STREAM);
    \" m4 H& l$ @+ k# r
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    # G, c8 ^+ x5 T2 Z9 H
  159.             print 'Connect to Server OK!';
    # z; v- p\" W& q0 Z+ i: X
  160.             self.snddata = ''. l$ ]% Q# I; }8 @
  161.             self.rcvdata = ''
    ! v1 |  ?& X1 \6 q. \
  162.             while True:, i& P. B9 y\" y7 ?
  163.             #读取客户端套接字的下一行
    \" n7 ~) \/ z1 y8 d* H
  164.             data = self.connection.recv(1024)( w9 Z4 f7 M6 C3 }
  165.             #如果没有数量的话,那么跳出循环
    2 e! o7 q( [9 Y3 _+ J
  166.             if not data: break$ A$ W9 D- j3 ]+ J! P
  167.             #发送一个回复至客户端$ o8 u8 o/ O! A. \# l
  168.             mylock.acquire() 9 Y0 ]% d7 f. B2 S  Z
  169.             self.snddata = ''' M$ \& r7 m+ C# X: }, G
  170.             self.rcvdata = data& \. u2 a0 @\" ]
  171.             mylock.release()- r/ D- f* }& z
  172.             #connection.send('Echo=>' + data)& e1 [) ?1 t* }
  173.             self.connection.close(): k1 ^8 Q( U  D! k4 x7 G/ n, \
  174. * K8 R( T. L. ]; V0 {3 S% _+ {. @
  175.         self.waitEnd.set();; D2 S  R' _- T% `5 L
  176.         self.alive = False;' B' q, Q6 H, }7 I) r9 S# A
  177. 1 {# Z) M/ ]6 a2 F9 X1 ]) j
  178.     def TcpSend(self):5 s\" Y: c3 V. p5 X0 S
  179.         while True:) W2 B; {% V. ~( a% v' Z( S
  180.             # 接收间隔
    * ^+ t! ]* I2 x0 M; P
  181.             time.sleep(0.1);5 `( R/ f/ [3 C1 Y. T! d
  182.             while True:
    6 }& `2 {* d% x: Q% k3 R  [
  183.               time.sleep(0.1);
    + ]6 ?8 q' m! P9 D- d- }' {7 S$ x
  184.               try:3 b- Q- k- T0 Z% e6 `
  185.                 if not self.connection is None:) g) N4 d1 @. ~\" i' M
  186.                   if self.snddata != '':3 W$ L3 O$ q7 T2 }; ]  u9 D4 o
  187.                     self.connection.send(self.snddata)3 A! U# ~  x- T' o- _! c
  188.                     mylock.acquire()
    ! E$ |\" H! Z; X9 N
  189.                     self.rcvdata = ''+ D! ^0 h& J, g; M( w
  190.                     self.snddata = ''; e* h* ?  ]8 p
  191.                     mylock.release()
    % n9 u, B2 \# |4 R, P4 J+ H
  192.               except Exception, ex:0 C\" k9 O% L1 G7 z- E
  193.             pass        
    0 l2 u  ~. g3 [! F\" L/ O
  194.     def stop(self):
    5 T2 r4 |6 \2 E8 N' V& t4 z- m
  195.         self.alive = False;+ K\" A% i& \  D& Y) Z/ z
  196.         self.thread_read.join();/ R/ W& `7 @' F) O$ @- W6 b. A
  197.         if self.l_serial.isOpen():
    ( I2 V. S: G' I% f+ w5 F  a
  198.             self.l_serial.close();
    # I\" U* N8 Z( D8 ~5 ~1 N

  199. ' g6 H# |+ m4 [6 }3 c; Q\" N1 E
  200. * N1 O4 R; P8 c\" `& D

  201. , V, p6 v- y9 f9 d5 S
  202. #测试用部分0 _+ f7 n) C4 d
  203. if __name__ == '__main__':
    ( q! j' B+ r! P' E) r4 d
  204.     print 'Serial to Tcp Tool 1.00\n'
    6 i+ W: K! d# u' g/ U7 j
  205.     print 'Author:yangyongzhen\n'/ \4 F- {+ B: E+ O% U\" Z. {
  206.     print 'QQ:534117529\n'
    5 D\" e4 k\" {  C
  207.     print 'Copyright (c) **cap 2015-2016.\n'
    3 j$ ]0 s/ Q& R, Q& l- |\" m' g

  208. - x4 A\" B: M7 {) P* C
  209.     Server_IP = raw_input('please enter ServerIP:'). X# l; T2 X& }: @- Q7 C( X
  210.     print 'Server_IP: %s' %(Server_IP)
    $ S* o- h\" X! ?( Y( f+ y. ?5 r
  211.     Server_Port = raw_input('please enter ServerPort:')
    + ]6 B7 y( U- S
  212.     print 'Server_Port: %s' %(Server_Port)
    1 f  g/ s1 \/ u3 Q# C
  213.     com =raw_input('please enter com port(1-9):')
    $ S\" T3 B8 Y- {  l; ^# E
  214.     rt = ComThread(int(com)-1);
    8 c; L# U% Z) Z2 ~9 ^4 G
  215.     try:
    - ]5 _2 _+ v6 R9 B
  216.         if rt.start():9 E, a  y/ g\" z* c5 {' }* u
  217.             rt.waiting();4 N  f( h  s2 C  B( {: V' n
  218.             rt.stop();7 D5 h' l- v( V7 E
  219.         else:
    0 ^\" g7 w- B\" }; a2 b
  220.             pass;            \" k. W\" ?/ c  X# q9 W- n
  221.     except Exception,se:
    1 w4 G7 ?( e. F0 e1 H' `, A
  222.         print str(se);0 ~; l' w+ S) x0 d. a# H
  223. . |\" m3 j5 i2 G3 G
  224.     if rt.alive:; K' N' n' _8 ^  O2 o% |  }' N
  225.         rt.stop();
    ) Z7 i\" U! b7 T8 Z
  226.     os.system("pause")8 o4 g  @0 i' Q# c9 s
  227. ! \3 b. A! |\" \( k0 n# @
  228.     print '';\" t9 Q' u0 O  A/ N
  229.     print 'End OK .';
    , \+ G- V/ ]2 [: j% W
  230.     del rt;
复制代码

; r5 o3 A6 _- S
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:55 , Processed in 0.317693 second(s), 51 queries .

回顶部