QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    ! x3 V- K) S5 e. i& Z) e
  2. % o5 P6 M$ \; n$ T1 u

  3. ; |9 Y  c* ?2 {9 M
  4. import sys,threading,time;
    ( {$ K; e4 _( F! j* K! t
  5. import serial;- K' H& S3 v  y# E
  6. import binascii,encodings;
    + y! ?: q8 k2 X# W6 c
  7. import re;$ |\" D- A0 O8 c; Z
  8. import os;
    & B% q1 ?$ ]/ `/ s9 \: ^* h
  9. from socket import *
    + ~( P\" l* ~& p5 ^2 x2 w, h% {
  10. from struct import *;5 g& |. ]5 ^& M8 d; p
  11. #from myutil import *;
    9 o) x% ^! P8 s$ k! B
  12. #name: myutil.py
    7 o! O8 @* d) _  n2 |
  13. / F' U5 }+ L% y% q+ h0 h
  14. mylock = threading.RLock()
    + Y2 U4 v* o& o
  15. ' }. M/ P) z9 n3 e
  16. Server_IP = ''6 s: s2 ^9 t; z% d  A  k9 d
  17. Srever_Port = ''
    7 C; ^3 \) m9 `( `; v2 `, u5 X\" r+ A
  18. % q! t/ ~5 Q  N: y
  19. def print_hex1(s,prev='0x'):
    ; W6 I. f- U1 e' g* X5 F
  20.     for c in s:. U, P, m& C  m+ h- |; S4 ]& u! k
  21.         print '%s%02x' %(prev,ord(c)),0 E5 t; H5 Q' r: V4 t8 u6 p
  22.     print4 L, ~! ?. R, }
  23. def print_hex(s):' K# l) W4 M0 H' d* ~. Q! Y
  24.     for c in s:
    7 E: Q2 F% {* C( J; t. ]! Y. B' T! |) R
  25.       print '%02x' %(ord(c)),
    5 j; n6 ?$ M+ o* |! W7 H\" `, o9 O/ r( g
  26.     print
    * i\" M- V# L: m9 B0 u2 f( v

  27.   D8 O, S- p$ V( ~
  28. def hexto_str(s):
    + B( c5 c$ o9 {/ t5 A
  29.   r =''; T, M# K: P9 A  r# |: d\" i
  30.   for c in s:/ D; U& }! E) K\" Z; K6 n
  31.     r += '%02x' %(ord(c))
    $ O6 E, H* ~' \5 j; B; ?3 l  m
  32.   return r
    0 m% w/ u( T\" \8 F! v
  33. def strto_hex(s):
    1 I' w$ h4 f6 U) I) m2 ]
  34.   r = s.decode('hex')
    ( B0 \  z/ }8 v  U& I! O8 N
  35.   return r- B; Y6 d9 [$ A1 e% C& f
  36. #''代表服务器为localhost
    5 o) W0 A: S: i/ W, L- ?  f

  37. 6 H4 P% @+ U9 K/ m
  38. #在一个非保留端口号上进行监听
    \" X/ B- Q) N: c6 G. B
  39. % L, y/ O& b: f* a5 z$ V9 U& t

  40. . b  m* H( j( N( Q0 }
  41. class ComThread:
    2 C- U: u3 b5 C& k) C$ N
  42.     def __init__(self, Port=0):; j4 p, Q! G: f1 t; P
  43.         self.l_serial = None;
    ( m* P' d$ A( M- l& }0 q
  44.         self.alive = False;! k- y- p, r5 S4 A' [! i
  45.         self.waitEnd = None;* P7 S+ v5 g) ]9 b( s
  46.         self.port = Port;
    0 k% n\" G, ^+ a9 X; R- U! o
  47. 5 W& K, s) m* P  d3 G$ p
  48.         #TCP部分
    ! L* @8 h7 |3 q1 G0 b
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    : s- ]9 Q% A. _3 @
  50.         self.connection = None
    , |* S+ B' e9 M
  51.         #数据
    . ]% E1 E9 d5 K# F% c3 {
  52.         self.snddata = ''$ t; A3 M9 C7 i- d& i8 T& O
  53.         self.rcvdata = ''' K! Q  i/ {! J9 |2 J6 f' K

  54. : i1 ~( x5 N5 {8 Q5 ^  K\" C  h' |9 r
  55.     def waiting(self):
    # ]. x+ Y, V7 ?9 f8 Y. q
  56.         if not self.waitEnd is None:
    % D8 Y0 ?2 f: r& w: R& L\" d
  57.             self.waitEnd.wait();! ?# k# u\" M4 K0 U- l

  58. ) L! |( l# D  ], E* l! {

  59. 8 X0 M\" o( U\" L8 W$ h: Q
  60.     def SetStopEvent(self):
    3 k7 V: Q$ x% M# E% U
  61.         if not self.waitEnd is None:
    $ `6 X# J. x9 {; c. |* e& E
  62.             self.waitEnd.set();
    % x, c- ^( {- k) _% J8 R
  63.         self.alive = False;
    7 i8 F  _2 X! O5 a
  64.         self.stop();* i* V\" X* H* L4 r& g
  65. 7 U) k9 G. |% W9 K; n2 d# F6 P
  66.   M  w& z\" I& U1 F% J0 X, g6 v
  67.     def start(self):
    ' y* ^/ K% G  Q
  68.         self.l_serial = serial.Serial();9 E1 O1 ]7 i# V7 ]
  69.         self.l_serial.port = self.port;
    : }8 ^% u! M\" T  t& W; y
  70.         self.l_serial.baudrate = 115200;( b6 O5 _6 H0 v( \
  71.         self.l_serial.timeout = 2;  #秒
    9 k6 o# M+ P; _
  72.         self.l_serial.open();: K& |1 r  O9 S' D3 s- m: K

  73. ; l1 E: ^9 |% U8 I  W
  74.         if self.l_serial.isOpen():
    5 {& x- B% Y; F. u2 y. y+ k
  75.             self.waitEnd = threading.Event();, y, n; v5 R1 y
  76.             self.alive = True;
    3 ^* u9 n% P1 p\" C6 ?
  77.             print 'open serial port %d ok!\n' %(self.port+1)
    3 Q3 }& t0 G2 e
  78.             print 'baudrate:115200 \n'
    % n. R) U/ l. H1 O) R
  79.             self.thread_read = None;. g, S# W- V3 O+ ~1 r
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    ' h\" a* p4 {9 I  X6 @' R
  81.             self.thread_read.setDaemon(1);
    0 p) A$ [1 X. `% }& A
  82.             self.thread_read.start();# h6 l: A6 x# f/ r7 e& }

  83. 7 b: x2 q/ N+ |& \
  84.             self.thread_write = None;
      a# f$ H# u. E: K2 W
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);6 V1 N2 i; f# I; `( j
  86.             self.thread_write.setDaemon(1);
    2 W& s: T1 w9 i
  87.             self.thread_write.start();
    . E3 `- ?5 r/ x% j' W

  88. 8 |; ?' i4 ?% A% @
  89.             #TCP部分
    0 R. A) E' B  ^7 P# J- L
  90.             self.thread_TcpClient = None;0 w2 U5 c; ]( Q  g: l# G9 ^8 }
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);) o. M  K7 ?  r
  92.             self.thread_TcpClient.setDaemon(1);
    ; ?9 O& O% M4 T, W. {
  93.             self.thread_TcpClient.start();6 |; o# j4 O; C

  94. / k0 T2 U* x4 I6 f
  95.             self.thread_TcpSend = None;
    ) |) W/ u$ }- s5 `
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);6 M6 D' D6 E% L# m! c1 b- r) \3 T
  97.             self.thread_TcpSend.setDaemon(1);
    * q6 m' u( s6 D  h
  98.             self.thread_TcpSend.start();/ W: u* l7 A7 e+ r8 T
  99. 9 u$ U$ P- q. k6 a) k; s
  100.             return True;
    # c0 l; i+ X7 [' g
  101.         else:
    * m8 j0 ?2 b% e; @( ?$ V4 {0 R
  102.             return False;
    1 t& F9 B! o# t; |$ l8 t4 F- `
  103. 2 |0 _/ t# j3 X5 x( K\" W. a: u! Z

  104. . i' c* o  V* r+ D8 a8 k& j+ ^
  105.     def FirstReader(self):' t; X  Y\" X- T  \6 o4 U\" {' @  c
  106.         while self.alive:
    8 v& C0 r' k& l3 @
  107.             # 接收间隔
    5 k% j6 G( u; F5 K; _
  108.             time.sleep(0.1);
    $ O0 b) \+ @% I3 I% C
  109.             try:) ~3 r; T2 w( [4 T
  110.                 data = '';- a( C! D* k2 V
  111.                 n = self.l_serial.inWaiting();
    7 X  B\" R: q+ N! R5 J9 O
  112.                 if n:
    ' Y: q% S\" _3 m' R: |. ~0 ]: n7 x
  113.                     data = data+self.l_serial.read(n);5 }1 S. _; p  R! @, a1 J$ Y; A; K- |
  114.                     #for l in xrange(len(data)):
    4 L) P9 z- h6 l9 s
  115.                         #print '%02X' % ord(data[l]),  A\" d: y8 ^7 ~& U. I: n( S
  116.                     # 发送数据/ I; x; v# ]& d; b' m, l
  117.                     print u'->请求:'3 f; B* f# ?* W# |
  118.                     print data;1 I3 {2 t9 d% l3 L
  119.                     mylock.acquire() \" Q6 X- B4 I& ~4 k
  120.                     self.snddata = data  i0 z  L0 V4 {+ Y
  121.                     mylock.release()8 |) b+ B) c: Y5 N& F0 d
  122.                     #print_hex(data);
    7 B' O8 l/ N; b0 b. j' _0 ?! p4 e
  123.                
    ; P1 D' M, r  e, k- u/ @! l- a# V
  124.                     ; h0 _; t( a4 j  Z, k, \7 {: \# d7 [
  125.                 # 判断结束, e5 H6 D3 B4 K& {* a( r( p
  126.                : m* g/ n+ C' J- ?4 z\" C; F3 W9 K
  127.             except Exception, ex:
    3 j3 ~4 a9 Z$ [' e5 r2 @
  128.                 print str(ex);$ a8 R$ t. H3 Y+ u% l' Y\" I
  129. # o\" _' Y3 T. d
  130.         self.waitEnd.set();
    5 e- q( I' @$ P. l; {& |
  131.         self.alive = False;
    , p; e! R0 h0 p% e* ^3 e- \# m

  132. \" H6 _3 x3 q2 ]0 j
  133.     def FirstWriter(self):
    5 P+ ^\" Q; e4 J9 n& i
  134.         while self.alive:
    $ g2 Y- M6 N\" G* m+ m' b) g8 D8 O
  135.             # 接收间隔
    % N9 ?. F0 j& w
  136.             time.sleep(0.1);- U! b8 [( R4 ?* y2 _2 j
  137.             try:
    \" c7 a! Q# K8 {7 }
  138.                 #snddata = raw_input('\nenter data send:\n')  F' Q% o) i; y
  139.                 if self.rcvdata!='':$ D9 j) }% i! Y' a& P
  140.                     self.l_serial.write(self.rcvdata);
    ( [, ]6 }$ A: Y\" P3 `! `
  141.                     print u'-<应答:'
    ( e5 l  `7 J- g3 ^, i5 Z7 E# k
  142.                     print self.rcvdata;
    0 c, E8 s. ^& G
  143.                     mylock.acquire() 8 p' r. f6 X\" I6 m& e1 V
  144.                     self.rcvdata = '';
    : h: ?3 o* K' ?6 N0 W9 V( S1 c
  145.                     mylock.release()
    5 h' t. L6 Z9 }& X8 p0 _
  146.                 #print_hex(snddata);
    7 \/ ?) E% z4 X1 {3 N1 O
  147.                 + M/ f- N3 n5 H# |1 i' D' W) M6 ~- l
  148.             except Exception, ex:% V, ^% g: M: ^! |3 I4 V7 A
  149.                 print str(ex);
    # o& S( E4 W& s$ d& ?/ y
  150.         self.waitEnd.set();
    * Y& N1 J5 d' [
  151.         self.alive = False;1 U7 ]+ F  {9 v; s/ E, u0 a

  152. 1 b) B9 c1 l+ B7 s0 z. b
  153.     def TcpClient(self):
    ' L# a$ X2 o2 h* k0 p4 U& g
  154.         while True:3 d1 R- x& R5 p
  155.             # 接收间隔
    - M0 q% L7 W2 M6 R6 x
  156.             time.sleep(0.1);, U& |* |: f\" J  W; m* s
  157.             self.connection = socket(AF_INET, SOCK_STREAM);
    - ^' F1 K( r\" F\" ]
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    - ~& n2 W! y+ O8 F
  159.             print 'Connect to Server OK!';* Q% W9 Q7 ^# x% ?$ H* X) ]8 F
  160.             self.snddata = ''
    ( O, k: T8 ^1 P( m9 h8 o0 T
  161.             self.rcvdata = ''
    & B+ D( i. ?\" O8 ?( N; p  K+ l! T
  162.             while True:
    # S5 b  m  O! t- V2 F/ I: o0 {  ?
  163.             #读取客户端套接字的下一行
    & ~0 e6 }# }. q6 X$ h0 I! j5 S
  164.             data = self.connection.recv(1024)2 A1 i3 h; w; q, q
  165.             #如果没有数量的话,那么跳出循环: V2 o9 z1 j\" v
  166.             if not data: break! h* r, M# ~% `. A( k
  167.             #发送一个回复至客户端
    0 U. M- d' n1 K; g. J4 o7 g0 A
  168.             mylock.acquire() ; [; _2 N8 `4 ~* _9 Q0 W, D1 Q
  169.             self.snddata = ''' u- M9 X/ c2 [; m) m2 s
  170.             self.rcvdata = data
    # }. e  M* {2 i\" U/ A
  171.             mylock.release()
    : S/ J( M1 L% m; B  |+ Q8 v
  172.             #connection.send('Echo=>' + data)
    ( ?4 A5 P& m& p
  173.             self.connection.close()
    - h6 u$ N  l7 \; j\" o5 N

  174. / x* ~. f# k- z5 ?0 e
  175.         self.waitEnd.set();
    $ S2 ?. M4 ^$ |
  176.         self.alive = False;% v6 C. F; T8 [  y

  177. $ [, E+ l8 M) M; e2 _* {- i
  178.     def TcpSend(self):
    , [, G5 Z5 t  w* w4 S\" P
  179.         while True:5 _: E: x7 W: W5 _- J# k
  180.             # 接收间隔0 e% `5 F* A! y6 D
  181.             time.sleep(0.1);
    0 p4 ]' {* R5 p. G7 T: g
  182.             while True:
    # k( \: W; Y( I
  183.               time.sleep(0.1);
    / v+ I. ^' R; i. `
  184.               try:
    . k; f0 a# @1 ~8 V( X! ~
  185.                 if not self.connection is None:
    9 J. `3 j, H& O' Q
  186.                   if self.snddata != '':4 D8 L: B+ a! l- Q$ X$ M: ]
  187.                     self.connection.send(self.snddata)# ?: y# V$ d4 ?$ T. @8 B
  188.                     mylock.acquire()
    8 ~, o3 y% [! v
  189.                     self.rcvdata = ''/ ^% l: J% c8 [) \  A& x7 l
  190.                     self.snddata = ''0 a! h5 N: e9 h. J6 O$ Y* q5 L8 Y& |& J
  191.                     mylock.release(); O- K/ L& w, v$ O+ a, j
  192.               except Exception, ex:
    * T# X4 d; }% v1 q2 C: I: l' o
  193.             pass        
    : H: [2 K4 o) R! Q% X
  194.     def stop(self):
    # x$ O# n8 s# L: A1 Q
  195.         self.alive = False;8 \# K3 b; L+ \2 B# g
  196.         self.thread_read.join();
      i  j# o+ u) y& r
  197.         if self.l_serial.isOpen():7 R7 ~& t2 Q0 ?\" d: V3 B
  198.             self.l_serial.close();; Y4 |0 M\" ?, w! @% Q! a0 c

  199. * _3 r0 s' r- O- @9 v( s
  200. 8 {! M: u+ g3 y7 z
  201. / x0 M, c: {$ p
  202. #测试用部分2 x0 D5 f7 k\" v' }* Q
  203. if __name__ == '__main__':
    ) \; k8 c9 H9 [\" m- m
  204.     print 'Serial to Tcp Tool 1.00\n' 1 \7 ]9 s( i+ t, H) q
  205.     print 'Author:yangyongzhen\n'
    1 B2 y1 U; B5 P9 }
  206.     print 'QQ:534117529\n'8 H/ s9 P: S0 V3 A+ V
  207.     print 'Copyright (c) **cap 2015-2016.\n'
    - Z5 U9 \6 h$ ]6 w  U1 D, r
  208. / m5 E2 W. Z/ G) k
  209.     Server_IP = raw_input('please enter ServerIP:')8 [: q; h\" h0 V# t
  210.     print 'Server_IP: %s' %(Server_IP)' \' A: S* e& C) x. U# Z
  211.     Server_Port = raw_input('please enter ServerPort:')3 J+ p\" W2 F, Z( N% A
  212.     print 'Server_Port: %s' %(Server_Port)0 j! z  r& \  `2 \$ x) T( _
  213.     com =raw_input('please enter com port(1-9):')
    4 m5 |$ s- y8 Z\" K8 ], G
  214.     rt = ComThread(int(com)-1);4 `6 H4 k# }. j
  215.     try:
    / r/ @) ^1 E& b+ ^: y* E* @! M
  216.         if rt.start():# B1 w\" O) w4 R7 E: u( b4 @7 c6 I
  217.             rt.waiting();# n7 I6 H5 U: w4 v4 N; w
  218.             rt.stop();) X2 [. v/ A5 P7 ^7 f9 K
  219.         else:
    1 a\" x% @+ ^1 V) _: d  k3 B$ O- {
  220.             pass;            
    ( j. J/ j3 i- d4 K3 C
  221.     except Exception,se:2 W8 ^2 O# @. ]- |9 c2 {1 Y- V
  222.         print str(se);/ }1 U+ B' I\" A: E

  223. 3 a& _. }- m5 R# Q  H; ?  k7 R
  224.     if rt.alive:
    ( ]: b; [( y0 y4 K- P
  225.         rt.stop();
    ( Y2 `5 h' ]2 j( n1 T\" x; w5 d% ^
  226.     os.system("pause")
    $ @1 K; A. }& z. K( C: L

  227. 8 Q4 f0 e/ X+ ?+ N8 ]: \
  228.     print '';& R; b- _, W# }. A/ [+ u# r
  229.     print 'End OK .';
    \" p& J4 \  m3 _: T9 @9 J! w
  230.     del rt;
复制代码

0 ^2 |# ]- g) ]
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 14:43 , Processed in 0.424057 second(s), 51 queries .

回顶部