QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    ' I) X8 R; B1 ~) Z% m
  2. \" K# H2 {# c7 M/ p0 t/ f

  3. ( h, a/ T8 _9 B3 L6 l4 N5 J
  4. import sys,threading,time;
    5 I4 A+ g0 x7 W2 g* E; f
  5. import serial;
    ; l7 G6 n) T, R
  6. import binascii,encodings;
    4 Z; g' W& G! Z3 I! e
  7. import re;
    & w) V3 I0 L- k% V8 Z
  8. import os;
    $ _0 _$ F7 V; J- Q% B! r1 r3 p/ m+ u- u
  9. from socket import *
    1 G6 w. `; e9 J0 y3 Z& o' ]
  10. from struct import *;
    3 U& T1 t  [/ ]
  11. #from myutil import *;
    ( t9 n1 b1 t\" q5 O4 x
  12. #name: myutil.py
    ; A3 `, g/ g3 a
  13. 4 A5 N* Q\" a+ `/ X4 o+ d
  14. mylock = threading.RLock() 0 g) @. F$ p8 w
  15. - C  K5 d) f5 r
  16. Server_IP = ''7 i3 u' T$ H& q
  17. Srever_Port = ''
    ( v1 r: U/ h% @4 |! f: ~

  18. - o0 a+ F% i8 ~! }# h\" |  ^8 h
  19. def print_hex1(s,prev='0x'):
    ( I% m- Q, c- h\" P0 [3 Q
  20.     for c in s:\" [+ L  V6 k* j/ `6 l$ [
  21.         print '%s%02x' %(prev,ord(c)),2 B4 ^1 @) ]7 Z7 ~
  22.     print+ g+ p. r3 K$ v; E& `! H3 T
  23. def print_hex(s):- t: d- ~5 y' L, [6 W' f9 ^+ i2 l8 j\" \
  24.     for c in s:2 Y4 \* A8 X4 d, l6 ?/ u
  25.       print '%02x' %(ord(c)),
    6 O* X8 }2 l: V+ v5 n
  26.     print
    # x; f$ i' X( _% ]$ y1 d  J
  27. 9 \( x* d( ]5 O$ u; n$ `
  28. def hexto_str(s):! m! O, o2 r! I* C
  29.   r =''
    6 X  @* w+ q, q0 u, s
  30.   for c in s:; u/ D8 g( P& X4 n& ]# _0 A
  31.     r += '%02x' %(ord(c))
    . V4 ^3 V6 |) ]( I2 D/ Q9 D; V
  32.   return r
    2 _3 f# M5 y2 a) [
  33. def strto_hex(s):; o, \) t' S9 v! y. l2 c2 _$ f
  34.   r = s.decode('hex')
    0 Z  y; `2 F\" L' ~1 x  a! F  Z# \8 b
  35.   return r6 K* ?4 c; P0 Y+ k( N& D
  36. #''代表服务器为localhost
    0 q' a, a& g0 s( C3 r/ s* I. w

  37. \" m$ |% m7 G; ^5 w3 T: R
  38. #在一个非保留端口号上进行监听. ^$ y5 O9 O( C$ ?# O$ g& e/ L

  39.   ~& v2 R( B& H3 F9 w( a
  40. : {5 l$ O9 {# J2 Q
  41. class ComThread:- x2 e1 J: V$ U$ N+ U
  42.     def __init__(self, Port=0):1 b6 Z7 E( a6 v9 w) _! `1 ~) N
  43.         self.l_serial = None;
    ) y1 E5 i2 v* [: a2 a- p- V
  44.         self.alive = False;
    2 `' n1 H2 }4 n- U/ H' G
  45.         self.waitEnd = None;3 `\" q1 A$ B1 u- d! k( C
  46.         self.port = Port;
    2 E, l$ g0 o8 S3 `, c2 N

  47. - `; j$ Z6 X. ^2 Y( F; y( g: n! G
  48.         #TCP部分
    0 ]\" ^: x/ K6 C; W; ?, Y! @  f$ ~$ c4 w
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    \" j/ _! z* j- b9 X) [% s' t* I
  50.         self.connection = None- d9 y$ m. o( w2 ?% L& g* z
  51.         #数据
    6 U  i5 V' o\" Q  g: D& {
  52.         self.snddata = ''' N6 O0 j& u3 I6 Y: B
  53.         self.rcvdata = ''
    / ], c/ x- l+ _, i6 e4 ]; u\" i

  54. 8 O8 L+ I' j' ]0 @5 ?% E+ c
  55.     def waiting(self):; O3 x4 ^' l/ H7 L
  56.         if not self.waitEnd is None:
    % V8 u$ g0 B5 q+ g5 \
  57.             self.waitEnd.wait();
    . }8 t. g\" b; X; e( v
  58. ; w9 @- u$ s8 q

  59. % R6 W2 N1 _/ _5 ?
  60.     def SetStopEvent(self):
    , L\" _+ A1 X* m3 P1 Z6 [  e
  61.         if not self.waitEnd is None:
    0 _6 X6 E3 j% U
  62.             self.waitEnd.set();& L2 r, y' i9 S9 o$ G& C; C8 q
  63.         self.alive = False;
    % A9 E- g' L! i
  64.         self.stop();
    ; N9 F3 [- r. ]) [
  65. 0 P+ _, d. R# y: w9 |/ X

  66. ! @5 a5 M' S( L1 e% L9 K
  67.     def start(self):
    4 k. }2 v* D! ?- H
  68.         self.l_serial = serial.Serial();
    ! i6 r& A6 c7 ^9 h3 y
  69.         self.l_serial.port = self.port;5 U8 e6 `9 {\" r7 ^! x5 o0 t
  70.         self.l_serial.baudrate = 115200;3 j# u2 s0 m3 v$ S: e
  71.         self.l_serial.timeout = 2;  #秒5 m* s% B! A  w\" O9 t7 o
  72.         self.l_serial.open();# f, Q4 g2 S7 k' j

  73. 7 Y; Y$ g\" n% Y2 j2 @6 Y. B
  74.         if self.l_serial.isOpen():
    - l1 @1 ?* R$ w* Q- ~% H$ z
  75.             self.waitEnd = threading.Event();4 b! S+ I$ |, E
  76.             self.alive = True;
    9 F, z# g+ H7 j- b9 R\" s4 l
  77.             print 'open serial port %d ok!\n' %(self.port+1)  v4 l+ p5 b* ?3 s1 j; w' m2 u5 C
  78.             print 'baudrate:115200 \n'! `' E9 V+ G) `0 g, k+ O
  79.             self.thread_read = None;
    \" i; w8 V& a\" j: w+ x
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    ) C# {' W, l0 j# Z4 d/ S
  81.             self.thread_read.setDaemon(1);8 @4 x3 d\" o: e8 G# E
  82.             self.thread_read.start();
    $ A6 p9 R. E8 h5 T) J
  83. , @3 m+ n$ U; C; a: t: z, W, q
  84.             self.thread_write = None;
    $ _1 u9 U7 U0 |
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    9 B9 {) n+ w1 n  v- l
  86.             self.thread_write.setDaemon(1);; f& D\" F0 ^' g  D6 R9 h5 g
  87.             self.thread_write.start();
    1 z( [6 B: j; e  r

  88. : y9 d) D# l6 C, Y! t
  89.             #TCP部分
    4 x9 y8 B- d- B) F) w
  90.             self.thread_TcpClient = None;3 Y+ `/ H$ `# G+ T- l
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);
      x4 s3 U6 u7 e( r
  92.             self.thread_TcpClient.setDaemon(1);
    ( [, C* J4 W  }2 l7 Z
  93.             self.thread_TcpClient.start();
    2 A; C, ^/ K; y8 `* V; G

  94. & }* w. \7 U3 l! }! \% o
  95.             self.thread_TcpSend = None;) l, f2 q5 Y: ?, l
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);
    ! m! n8 K7 ]' A, k. b
  97.             self.thread_TcpSend.setDaemon(1);- c2 h3 |5 ?7 |\" v1 X( e
  98.             self.thread_TcpSend.start();! t2 p, z1 f: E
  99. 9 R+ Z3 r\" s2 h  Y( g$ k/ ]; v& {
  100.             return True;& q( N0 i5 u\" `
  101.         else:
    # X; f2 T; Q6 [  v\" W
  102.             return False;
    - o2 _2 p\" R* I7 {* O: e1 p! f  v4 X

  103. * N1 A5 u* \6 c$ O+ ~( U/ e
  104. . ^$ j1 V3 E) x5 H- t3 s
  105.     def FirstReader(self):
    9 m! R7 r& d+ I\" s- j( j
  106.         while self.alive:* t3 y- w/ s& `' G
  107.             # 接收间隔\" ~9 [4 T  w: M* Z0 m0 C
  108.             time.sleep(0.1);3 v+ q+ g+ H( _' Q
  109.             try:
    ' i& C9 N, M( V9 h% P) R
  110.                 data = '';
    1 U8 y: f- v9 M% {) P: W. @# C* Y
  111.                 n = self.l_serial.inWaiting();
    8 f4 q5 ?' u0 V. y
  112.                 if n:5 v1 L* J* \: j: ~5 y8 g- G# K
  113.                     data = data+self.l_serial.read(n);
    ' k\" f- y& D0 `2 e* E
  114.                     #for l in xrange(len(data)):: [1 Y/ ?+ o' |7 Y: P
  115.                         #print '%02X' % ord(data[l]),0 C' P7 x, f6 i1 ^' u) W
  116.                     # 发送数据$ g\" t5 U' N$ Z! O
  117.                     print u'->请求:'
    \" l* Y3 t/ g- o4 U; B9 x6 o0 G5 T
  118.                     print data;
    4 g. b& w2 V  \# U5 I0 d
  119.                     mylock.acquire() 7 O# t& Y7 r& d+ d4 F* [  V+ }
  120.                     self.snddata = data
    $ P/ u( B! c( o/ E\" f2 O
  121.                     mylock.release()4 q5 N4 S% d, P- P: a
  122.                     #print_hex(data);, Y: }\" R7 \$ J  K$ M
  123.                
    1 `. Z+ J' O) `& }# L1 U* C' P1 U
  124.                     
    + N% J6 ?% z+ f# L; s5 W4 {$ A, d3 ]
  125.                 # 判断结束+ [+ b/ [! J' Z' y& k$ o+ m/ d) Q3 L
  126.                0 g4 E6 ?8 j( M# b
  127.             except Exception, ex:. m& U$ u' h9 T+ V/ ^6 V
  128.                 print str(ex);4 O5 T9 J/ ?7 A5 P8 D; v\" x

  129. - k; e+ L# ~, }: W9 a+ r
  130.         self.waitEnd.set();
    $ ]9 U/ m/ m( K' i
  131.         self.alive = False;
      C- @\" ~, @; |2 L4 q
  132.   X% z9 }( G3 o8 r5 w- y
  133.     def FirstWriter(self):
      S3 K9 t+ Y* R+ D- ~9 q
  134.         while self.alive:  m\" y1 b7 ]% U6 w
  135.             # 接收间隔( Y1 s6 o. M: W( @3 ^5 d
  136.             time.sleep(0.1);7 n1 L$ Z; K+ s. h
  137.             try:7 ]( }! I, o# n) S/ m. l. `
  138.                 #snddata = raw_input('\nenter data send:\n')
    + d8 _5 `/ D! N- X
  139.                 if self.rcvdata!='':
    ! ~6 M- u( ^3 i& w2 z
  140.                     self.l_serial.write(self.rcvdata);
    % Y# @3 f4 E' L' R5 C4 z' f
  141.                     print u'-<应答:'+ C( R4 v6 @/ y! L+ {5 r
  142.                     print self.rcvdata;: i& u5 W7 O8 F3 U3 Y# i+ n
  143.                     mylock.acquire() ) B3 O% x) p\" Q8 _  l* e
  144.                     self.rcvdata = '';
    ! n; e( e5 W; d
  145.                     mylock.release()4 @& n\" L( n9 f- ]2 V
  146.                 #print_hex(snddata);
    ' d* d4 w+ L2 U\" A1 O
  147.                 4 q4 a0 @& U: O, `4 B
  148.             except Exception, ex:
    ' g4 R* O' A' c) I1 [: z* m
  149.                 print str(ex);
    0 M# h7 P# D* a\" e' l
  150.         self.waitEnd.set();
    - ]1 p9 z7 r6 r( O& v( X- x
  151.         self.alive = False;
    + O1 x/ n9 A4 A8 u( t

  152. \" J8 I5 O/ f) D! y- Z) a
  153.     def TcpClient(self):* t; z# j; h, Y) J  Z
  154.         while True:
    4 L3 o/ H\" Q7 ]: O6 k0 Y: d9 j# w
  155.             # 接收间隔
    2 q& h\" v2 g/ q5 \- O+ w* j/ n# z
  156.             time.sleep(0.1);; B% ?* e0 `  F\" a
  157.             self.connection = socket(AF_INET, SOCK_STREAM);
    4 }2 _6 m3 x/ L1 x( ?, v; v
  158.             self.connection.connect((Server_IP, int(Server_Port)));1 |  F9 F  S/ k4 C9 v6 [
  159.             print 'Connect to Server OK!';
    * O6 c% }  K0 C4 _! s8 r
  160.             self.snddata = ''
    ' y! }) U6 w2 l* x: K4 l
  161.             self.rcvdata = ''
    6 e0 v\" i0 U  c\" l9 m
  162.             while True:. w* v- k6 T' A/ y1 h9 y- o
  163.             #读取客户端套接字的下一行
    ; `6 T/ c  K8 L2 j
  164.             data = self.connection.recv(1024)
    ( l: h1 z$ ~4 C( f0 ]9 U
  165.             #如果没有数量的话,那么跳出循环7 E0 b- y; I8 a+ u/ Q
  166.             if not data: break2 ?/ r: i: Q# ?1 R2 D
  167.             #发送一个回复至客户端
    1 L9 {* ]4 A+ I' x' z! e
  168.             mylock.acquire()
    * H, o% c1 T  w8 I$ X
  169.             self.snddata = ''
    1 A$ }6 v3 U: U0 ?4 U
  170.             self.rcvdata = data4 H8 l2 u: L# c+ o) b5 D
  171.             mylock.release()2 e7 }  y3 j9 w( n' T7 J7 @
  172.             #connection.send('Echo=>' + data)
    # x! b4 o/ R3 x# u2 J$ c* V1 o) O
  173.             self.connection.close()) k, v' l9 Q- ~4 @. @# H$ t
  174. + {* S( ^9 b2 Z( U/ a  Y
  175.         self.waitEnd.set();& z$ m' `& o0 P( M- e* g  w6 Z
  176.         self.alive = False;\" b8 K! v; ?% i' d& m) c3 t

  177. 2 U- L* U! g\" D3 t. x& t4 O8 {$ l. r
  178.     def TcpSend(self):
    % S: ~7 l+ G  T# v
  179.         while True:
    + y- j( H8 h0 B6 j8 `2 Y: @
  180.             # 接收间隔. Z( E& L, D* c) ]+ d8 g$ x
  181.             time.sleep(0.1);
    ( v% B, q3 q5 Z* J6 G2 s; h3 |
  182.             while True:
    2 ~: u! w8 F1 e9 P
  183.               time.sleep(0.1);, r1 r  k* L  r5 |
  184.               try:, l5 R) Y5 J. U. N6 I: d7 u7 K
  185.                 if not self.connection is None:
    # G- U, }& s0 J+ y
  186.                   if self.snddata != '':
    \" d4 a7 ^+ l+ L- ^
  187.                     self.connection.send(self.snddata)- H# M. g% X& h6 R- e( [
  188.                     mylock.acquire() ' F\" G\" V9 s; \+ E4 r% b
  189.                     self.rcvdata = ''* h3 i- p6 [- X1 n: t8 N
  190.                     self.snddata = ''
    * l5 L6 R% @6 p: r1 W
  191.                     mylock.release()
    ' Z8 S1 a6 l' u+ C; r$ o5 K
  192.               except Exception, ex:
    7 J) @# u' K8 f* M& z  c5 V
  193.             pass        
    / t$ x9 a& F4 w' f# E8 ]2 r5 c
  194.     def stop(self):( d0 d9 d8 a: a
  195.         self.alive = False;
    & Y5 Z( w% A$ L+ j, A9 K2 `
  196.         self.thread_read.join();9 |/ ^  b5 w/ H2 q6 C) Q0 T% Y$ ?
  197.         if self.l_serial.isOpen():
    7 B* i* ~2 q, s# K' q( \. }
  198.             self.l_serial.close();
    * h# Q- m$ z, n7 r# K) [+ e) `6 m

  199. 8 ^\" D) G* C7 W$ j( ?

  200. \" k0 b+ h. Q% ~3 @* a
  201. 0 e! O4 x* p\" u7 J# R# E
  202. #测试用部分0 P\" e3 x8 t$ L! F; f1 Y6 r6 V
  203. if __name__ == '__main__':) O2 Q/ |: }  c5 s% Z
  204.     print 'Serial to Tcp Tool 1.00\n'
    ' s0 I+ e. ~0 o5 {8 t  A
  205.     print 'Author:yangyongzhen\n'. i; `: k% U( r: V9 z$ L4 S
  206.     print 'QQ:534117529\n'
    ! g7 z( h7 V7 K  W7 p1 p
  207.     print 'Copyright (c) **cap 2015-2016.\n'
    ) \5 Q3 G7 }% p* s; Y* r
  208. 5 O\" y2 [# R- N; c6 I2 I
  209.     Server_IP = raw_input('please enter ServerIP:')
    \" h6 @0 m( U# W8 `4 f
  210.     print 'Server_IP: %s' %(Server_IP)
    : J: C; R) K! e: i5 M
  211.     Server_Port = raw_input('please enter ServerPort:')
    \" \/ v% o' a/ ^' g% u( W% ]$ I
  212.     print 'Server_Port: %s' %(Server_Port)
    \" G1 b5 J; e. C' X/ i\" r7 @
  213.     com =raw_input('please enter com port(1-9):')\" X& y' u% s1 C6 f& [
  214.     rt = ComThread(int(com)-1);' [: {\" K( a& |6 H$ w
  215.     try:* O& p$ i6 C5 N$ I
  216.         if rt.start():6 X+ x. B* L: Q! c
  217.             rt.waiting();
    ' O# q' n- ]3 m\" l# z
  218.             rt.stop();
    4 u; j# s; D% V+ d8 S7 _1 ?2 a
  219.         else:  g9 w% S: F0 U5 w
  220.             pass;            6 X/ |5 {1 x4 Z* s/ C
  221.     except Exception,se:8 q! N, ^6 ^7 Y4 A' s( l# @0 F
  222.         print str(se);
    ( e& h6 j+ I# l. D* D& r* x

  223. 2 I# U  ]$ g/ G, O
  224.     if rt.alive:
    ; Z- ]; k2 d3 n% n
  225.         rt.stop();
    & T3 c: N- l- t0 V/ S$ ?
  226.     os.system("pause")% [1 e* u% s8 v\" ~; Y! n# |' H

  227. 2 H- m+ q& }) ?& _3 z
  228.     print '';, g3 u2 R* s, m. z8 F) s
  229.     print 'End OK .';/ i, t, s5 D% @\" t
  230.     del rt;
复制代码
" k  g8 v$ T7 S1 w( P
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-4-19 15:36 , Processed in 0.443456 second(s), 56 queries .

回顶部