QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8! y. o0 L\" s2 s& p

  2. 1 Y2 A: P9 {8 k% c2 d

  3. & b# j+ `, Q% c& _- X
  4. import sys,threading,time;
    7 m' |1 E1 L+ Z
  5. import serial;
    8 c8 U0 p7 O% f0 F3 ~
  6. import binascii,encodings;
    ' p1 R8 X( O) v# G! P0 x3 P, G; S
  7. import re;9 d1 Q3 c' }$ S) x7 M+ i' L2 l
  8. import os;& v$ Y! n$ _# v7 y
  9. from socket import *
    * ]  p: ^4 E; x8 u
  10. from struct import *;* |) B. D) o) a% x% l% G* B
  11. #from myutil import *;3 p7 [1 ]6 `8 S
  12. #name: myutil.py( Y! W. E' Q' q3 p) M+ J# L
  13. ' h0 s2 K. w8 k: ?3 @9 S7 w
  14. mylock = threading.RLock()
    1 S/ H+ w9 S5 r+ y

  15. . w, g( Y, H$ \7 J: c
  16. Server_IP = ''/ h) U: F( m6 H- I' \0 {1 d& W0 `
  17. Srever_Port = ''* a4 z9 u# K1 t6 T
  18. 5 ], m\" ^+ a4 c5 O5 Y7 p9 i/ D
  19. def print_hex1(s,prev='0x'):5 w0 S3 b6 r0 T1 w- p4 J; h
  20.     for c in s:8 I: e7 ~+ R: Z2 B! i1 F
  21.         print '%s%02x' %(prev,ord(c)),6 H5 z# q9 l. ^\" I/ ^; w
  22.     print
    ; A3 N6 }% i\" x* Y; L( y# h
  23. def print_hex(s):5 ~% m1 A8 q( u% i. N1 m- k) w
  24.     for c in s:
    7 Q' {% G9 o' n: z
  25.       print '%02x' %(ord(c)),
    . u  j9 y9 g9 r* h9 D% M
  26.     print2 P( S# O5 Q0 L
  27. 7 ~& o' z5 u5 w% P9 i
  28. def hexto_str(s):! ?9 c& c1 V8 G9 C0 W7 ?9 ?* v
  29.   r =''
    \" [4 z+ ]. u# |9 y
  30.   for c in s:
    ; P6 z( X0 k7 w& @
  31.     r += '%02x' %(ord(c))- \* |9 u; I  V& p0 R8 q, Y
  32.   return r
    : q- ]5 b1 S+ h, w' C
  33. def strto_hex(s):- D: e1 \8 x- k1 I6 G, g; N/ J3 f/ w
  34.   r = s.decode('hex')
    \" c; C! C5 `. U  k\" g
  35.   return r* d$ s$ `  m6 x: `0 n; t. k
  36. #''代表服务器为localhost
    7 ?, J, y. b  h0 y8 U7 U
  37. + B# M. \7 q- K
  38. #在一个非保留端口号上进行监听
    7 |  s3 J1 W+ a. p/ b) h* w

  39. ( [; C  U$ s+ u2 h5 V+ }* \' j

  40. - }% t4 U6 @( g) N2 O  U
  41. class ComThread:; }9 v! ~- x7 u: `
  42.     def __init__(self, Port=0):  K# z) w/ \3 g2 [; p4 d; m/ e+ z
  43.         self.l_serial = None;$ I4 e! ?/ q\" u
  44.         self.alive = False;
    \" |1 w  D* L2 u9 H3 t
  45.         self.waitEnd = None;  E5 H# }: {: D1 N0 H/ X& j2 E
  46.         self.port = Port;
    8 I0 [: n5 |4 l: [' |9 Y

  47. ' D, p, g4 R8 o, X# J5 Y
  48.         #TCP部分  `0 q& J# q, v  i! l  b4 g
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    - Y; G8 J) Q7 ^% N7 p
  50.         self.connection = None
    # ~0 o1 t7 d+ ^8 w7 O5 |
  51.         #数据
    0 y6 K  j& e9 o3 P
  52.         self.snddata = ''
    2 B8 |0 d* \& B- U, J+ x$ C
  53.         self.rcvdata = ''
    7 p/ o6 i  T' e( S. W: u5 ~+ g
  54. \" M$ D4 J: Z- m7 F/ ]4 g
  55.     def waiting(self):
    - s6 v1 p: ]1 w, X  \8 A- B1 u  A
  56.         if not self.waitEnd is None:
    % l7 J! T1 c5 l9 C  C
  57.             self.waitEnd.wait();9 x0 N/ `% x+ u3 F/ ~4 A
  58. 6 Y1 \' }7 I  }- q+ |6 X
  59. 9 ]9 E6 ~& @/ P
  60.     def SetStopEvent(self):7 v8 ~) V% M9 C$ x! l6 L
  61.         if not self.waitEnd is None:
    1 g1 T9 t6 ~8 R3 f+ j) `6 q8 F
  62.             self.waitEnd.set();
    ( p# M$ S- y9 W* s0 a7 y
  63.         self.alive = False;
    * ~) W0 Q$ q1 D7 Y' s& |
  64.         self.stop();8 y& B8 w8 B2 `; B

  65. 9 |/ v  K# O\" ^$ L; ?

  66. + o' E) @  x% S& u5 ]
  67.     def start(self):. I8 B% U5 d! F( r4 h: }
  68.         self.l_serial = serial.Serial();( j. K5 y( _; [; [/ S( d
  69.         self.l_serial.port = self.port;, G: E/ G$ E8 e% N
  70.         self.l_serial.baudrate = 115200;
    4 x- a$ U( y0 _  n1 R
  71.         self.l_serial.timeout = 2;  #秒
    0 I) J# N# G\" j+ }! `
  72.         self.l_serial.open();
    5 F' y3 y$ j* i2 Z

  73. ; I  d4 U6 O5 W* l1 y
  74.         if self.l_serial.isOpen():
    - i, V1 }8 Z' n6 a  T& V3 K
  75.             self.waitEnd = threading.Event();
    + r( B  T: a: P9 Z5 b
  76.             self.alive = True;8 `; B; O+ U; F: u$ Y8 ~4 J' e
  77.             print 'open serial port %d ok!\n' %(self.port+1). y. }) f; w# s; P: n( \
  78.             print 'baudrate:115200 \n'
    8 D& z* k\" k7 @+ X  T) D\" V( k! z
  79.             self.thread_read = None;3 _1 x! i1 V( c( }  G* D$ I
  80.             self.thread_read = threading.Thread(target=self.FirstReader);8 l6 e1 |, M\" @9 C( J, H: B# S8 Y
  81.             self.thread_read.setDaemon(1);# ]: f9 H) \2 c/ P# o  x5 W* v; {- B# c
  82.             self.thread_read.start();
    ' x( o( V1 s& B
  83. 9 q5 ?) o) V, S
  84.             self.thread_write = None;
    1 R% I; R' B* J4 w5 U3 n8 Z
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    4 v5 U6 {$ Y& Q0 G' P
  86.             self.thread_write.setDaemon(1);
    & F2 @7 @) E6 [9 @8 G- l7 e
  87.             self.thread_write.start();
    , O# m9 D- F) s4 S

  88. 6 E, n. O; \% f/ L) l; D- J\" y
  89.             #TCP部分* ]) ?( X0 O1 J: k7 W; Y' V
  90.             self.thread_TcpClient = None;+ N7 Z) o  D\" \( M
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);
    \" ?0 g2 n2 U: s- M
  92.             self.thread_TcpClient.setDaemon(1);
    . d/ F3 r& c4 y  ]9 l# h$ Q0 C: q: t
  93.             self.thread_TcpClient.start();: a% [7 b) y5 ], G: x

  94. . N( y) M\" Y$ B: H  p- V* k
  95.             self.thread_TcpSend = None;
    * ?  z4 e, Y2 ]0 c
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);
    1 C\" ]$ }1 m& p& n
  97.             self.thread_TcpSend.setDaemon(1);6 D: x6 ]2 v1 O  k' C
  98.             self.thread_TcpSend.start();
    7 O% w) z8 n' l! t* u# q

  99. 2 X: u5 S8 \' ~
  100.             return True;- b% v; F# `; J
  101.         else:
    & o! o5 Z$ B2 z
  102.             return False;
    ( [& a\" C) Q; G8 l4 g# L3 y  D

  103. , Z  M. J1 ]* g; H: c\" q# Z, H

  104. 3 X9 i9 u% W$ w- J8 e9 `
  105.     def FirstReader(self):
    4 p  e6 C' c- m- i/ K
  106.         while self.alive:( k& F) ~) X  K
  107.             # 接收间隔( t& a8 w2 V% `' S6 K7 _
  108.             time.sleep(0.1);  f' l; G# h8 I1 y( I7 L$ S
  109.             try:, a5 Y! n\" p1 z\" I: c* x
  110.                 data = '';! K' Z+ Q; v- S5 E
  111.                 n = self.l_serial.inWaiting();
    ; @1 m8 I9 R& I, l8 Z
  112.                 if n:
    ) |) K9 H; ?% m7 s: K
  113.                     data = data+self.l_serial.read(n);
    $ J3 a1 d( ?7 q( P& c- U
  114.                     #for l in xrange(len(data)):
    * G' `' r- J* P  G$ c& G
  115.                         #print '%02X' % ord(data[l]),
    / z. v* M# S! M) d7 c
  116.                     # 发送数据
    : N4 W: u7 u3 }, c8 a: u! S- W, r\" M
  117.                     print u'->请求:'8 m- h: ~+ O$ i. Q$ q+ K
  118.                     print data;/ e3 @0 C* c/ J& W- s- X- Z) J
  119.                     mylock.acquire() 3 h1 x* M9 k9 o3 W' Z
  120.                     self.snddata = data- _! p' c* @# g
  121.                     mylock.release()% ~' ?( T- y. B! @3 T. i# H
  122.                     #print_hex(data);# H\" r$ r$ t  y6 k: @
  123.                
    / D. `+ O3 m0 p5 G( E
  124.                     
    4 e3 N1 }) _( [1 x- E
  125.                 # 判断结束( k) Y, l0 h5 C' F5 ~' u. e! [8 z\" z& E
  126.                
    + L6 V9 e! g, b% C, a5 s1 h
  127.             except Exception, ex:; c# M- D\" d9 _! f
  128.                 print str(ex);
    7 ]5 D1 [. @) F4 p8 z$ O

  129. 9 H7 i3 x: v( a) N  j
  130.         self.waitEnd.set();
    ! l* f5 Y9 O, a
  131.         self.alive = False;+ d* W1 a5 m  L# |/ P

  132. 3 R& ?- y+ B' d- B8 J5 |. e
  133.     def FirstWriter(self):
    4 B8 c. Q1 ]& \9 L, P, g+ L
  134.         while self.alive:
    ( M, i! n/ X4 T' m
  135.             # 接收间隔+ k( S1 }) \- q4 u! Y& [$ i* s. Y# L
  136.             time.sleep(0.1);5 T0 x% r) l6 S8 }; v
  137.             try:
    ' z  t5 |( {( V$ z4 N9 a6 T$ u
  138.                 #snddata = raw_input('\nenter data send:\n')
    ! v1 H5 D\" b0 {) T* H$ [
  139.                 if self.rcvdata!='':
    , A  ]% p( j\" H0 u1 n; q9 y! @
  140.                     self.l_serial.write(self.rcvdata); - @( B# Y4 Z2 @6 }( g1 u2 I7 }6 F
  141.                     print u'-<应答:'
    ; l& c) w% ^) @
  142.                     print self.rcvdata;
    : u7 Z# E  ]1 k* m
  143.                     mylock.acquire()
    : u' n- ^! N. Y3 z2 g\" ^& q; o
  144.                     self.rcvdata = '';
    4 B9 L0 h- q8 G1 U' b6 E; B
  145.                     mylock.release()# U7 c; b- d\" ~
  146.                 #print_hex(snddata);3 L4 X# h7 p1 ?' T0 Z- _' i+ p6 D
  147.                 7 t4 \: ]$ y. w5 E! |; Y( q& L
  148.             except Exception, ex:  @7 j! k4 e0 Q9 W8 \% x; Q) x
  149.                 print str(ex);
    5 e\" j3 R& n$ ^& L' I9 G; H9 h6 ?, H( o0 A
  150.         self.waitEnd.set();# F6 b0 f% h& }, F0 j
  151.         self.alive = False;
    5 B2 A3 r5 S, P$ H/ ?2 Q7 c

  152. ! i3 a( e9 x: `5 k4 U6 Y
  153.     def TcpClient(self):
    ; J0 N7 Q5 b; H. J+ L0 p
  154.         while True:8 U' I9 g% Y( i% b. K
  155.             # 接收间隔\" ?$ H# V1 f7 }* I
  156.             time.sleep(0.1);2 F8 O4 A' J$ \7 H! a
  157.             self.connection = socket(AF_INET, SOCK_STREAM);
    8 E1 f# |' }* U
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    2 n% }3 Z  Y- ]( q8 V
  159.             print 'Connect to Server OK!';7 p2 p5 s7 p% o7 v/ j
  160.             self.snddata = ''3 P5 _' ^9 w4 Z; S& L8 G
  161.             self.rcvdata = ''
      F5 k, h) g+ ~4 D) X
  162.             while True:, K  d) a; t& P: @0 [# {
  163.             #读取客户端套接字的下一行
    , E9 o! e# }1 q\" ]9 M% P, b
  164.             data = self.connection.recv(1024)& [+ G. c6 `* K; `/ Y! N
  165.             #如果没有数量的话,那么跳出循环
    . [# X& }$ I# z7 t; d( T9 i& ^
  166.             if not data: break
    / j\" L1 Q7 E. v
  167.             #发送一个回复至客户端; ?0 p9 n7 J3 s. r* d# ~, s; C
  168.             mylock.acquire()
    % v2 L+ N( }, N\" V
  169.             self.snddata = ''
    $ ~! g8 Z( c! ~) g* `\" n
  170.             self.rcvdata = data2 K% m. y8 s+ w& y9 S3 m7 ?# w
  171.             mylock.release()
    # A& u1 A# ]' h. ]2 v, i& N
  172.             #connection.send('Echo=>' + data)
    4 ~8 @( t/ U9 ~8 P
  173.             self.connection.close()
    ! b5 Y) Q' b9 Y! a
  174. ( Y2 e- P\" p. G4 d2 y
  175.         self.waitEnd.set();4 G% [( {4 L& `4 i+ g# B  @
  176.         self.alive = False;, k+ Y) ?6 r& F7 C) P

  177. + p4 y/ `& q2 y9 I/ ?8 B, p
  178.     def TcpSend(self):
    6 o8 [9 }9 C9 v% h3 Q
  179.         while True:
    0 [+ [+ ^9 ^# f: X# G
  180.             # 接收间隔
    * P, T8 C, b! U: ^. C3 ^& z
  181.             time.sleep(0.1);
      {0 }/ H, {+ A4 e- b
  182.             while True:
    & w) k$ o2 S+ I& \
  183.               time.sleep(0.1);4 J! z5 T& F; Y/ C
  184.               try:
    % Z  f9 x& r7 ]. L
  185.                 if not self.connection is None:\" u( Y$ G6 X7 Z: ~
  186.                   if self.snddata != '':
    # J# Y\" e' G2 X/ P; M
  187.                     self.connection.send(self.snddata)
    2 H! m  \& y5 \+ O
  188.                     mylock.acquire() \" M7 |5 W; [! M
  189.                     self.rcvdata = ''
    - d4 q) L& C\" h- s
  190.                     self.snddata = ''6 k9 f; G2 @6 r& P% X1 A6 u\" ^
  191.                     mylock.release()
    ! R+ b& T2 z9 z
  192.               except Exception, ex:
    ' }/ z! }/ `\" r; D- r3 y- r
  193.             pass        
    : ]\" A) _; l4 ?0 B2 ^, L% d  b
  194.     def stop(self):7 F, E) M5 ^\" p8 ^9 u
  195.         self.alive = False;0 h' x1 [* L3 a$ J. Z9 {
  196.         self.thread_read.join();
    0 F4 \7 ~# F6 ~( _) M% m
  197.         if self.l_serial.isOpen():) I* |: d8 d\" C! l
  198.             self.l_serial.close();8 i+ ]& z+ L\" f

  199. / K8 I* s' ^4 b
  200. # K. @: }; v! o( m

  201. % c) W5 l( Q: G
  202. #测试用部分
    * |# i) q* K, O: x! n
  203. if __name__ == '__main__':/ i: v6 T- t. v+ Z1 C! o3 C\" |
  204.     print 'Serial to Tcp Tool 1.00\n' 9 G5 @5 ~, e( n8 Z6 M  [$ q2 p
  205.     print 'Author:yangyongzhen\n'* r2 W6 {# l3 T1 ]: f8 J
  206.     print 'QQ:534117529\n'
    . u7 I. l: |# V
  207.     print 'Copyright (c) **cap 2015-2016.\n'
    2 K; q0 y* G) s: _8 x1 |: t\" N

  208. 5 U- E0 R* e9 r  Z  J4 j6 ]' X, U
  209.     Server_IP = raw_input('please enter ServerIP:')# K4 c4 Z9 \  ~/ h% C; p$ }0 F# a& d
  210.     print 'Server_IP: %s' %(Server_IP)7 k+ j% j, W. y1 f
  211.     Server_Port = raw_input('please enter ServerPort:')
    4 B/ C: w3 C, M4 L( K9 U
  212.     print 'Server_Port: %s' %(Server_Port)0 K) E7 N- g2 J4 x9 n
  213.     com =raw_input('please enter com port(1-9):')
    - S& m7 p' Z% q
  214.     rt = ComThread(int(com)-1);
    4 @, \\" j* b5 s+ E( Q3 g
  215.     try:
    : t& C7 Z  X/ L7 L) w
  216.         if rt.start():- @  x% G' V/ f
  217.             rt.waiting();4 d& P/ K, p) ]$ P0 F  U# [' m
  218.             rt.stop();! ?4 z  Q2 R& d1 L
  219.         else:
    ) d) r8 ^4 D! J6 a' X  C\" l% b
  220.             pass;            * @$ b/ Q% V0 @( Y3 g
  221.     except Exception,se:# n\" \& ?0 Y, t( o3 n: F
  222.         print str(se);
    8 s* K1 V* ?* v2 O, [6 q

  223. 6 J4 v7 z( A, h) @
  224.     if rt.alive:
    * q- U7 l7 Z/ s3 ^) _
  225.         rt.stop();
    3 e- `! V7 L0 h- i! ~0 x. J( I
  226.     os.system("pause")
      w$ C' E( C, z& b- o7 U; W

  227. , F) S( {0 X\" K
  228.     print '';
    ' I5 d% b5 S* n* X9 V1 |\" i
  229.     print 'End OK .';
    7 ^\" t7 D4 @+ f/ n# w5 A% [
  230.     del rt;
复制代码
5 G% v. A3 t9 k2 U! i" }
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-6-3 01:52 , Processed in 0.367160 second(s), 51 queries .

回顶部