QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1186

主题

4

听众

2923

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    , t2 u% `' s! Q1 D/ l! G8 G
  2. & `3 h/ V/ i( t/ A8 b0 i1 k$ E

  3. ; c, L) H; r) P( T\" G; H* p% I
  4. import sys,threading,time;
    $ Z# L3 X& i1 R6 i% t
  5. import serial;: l, ~+ c* B0 J$ p0 G+ |
  6. import binascii,encodings;+ i5 M* e( P) m- {' q
  7. import re;1 ^, \. E6 B4 i; A5 d% W\" i* Q
  8. import os;
    : y$ I4 n1 x7 K* h\" ], y2 y
  9. from socket import */ _3 t1 _$ m# y% e6 _5 L6 c
  10. from struct import *;: {& R$ f* E1 i4 {( f' \
  11. #from myutil import *;
    7 k* c+ i8 L2 M- \
  12. #name: myutil.py
    0 a5 l% \) K( k
  13. ( m  H\" @1 X* g' m, `
  14. mylock = threading.RLock()
    ! c8 ?% v. I! k7 w& i% a; g
  15. * n4 |8 q: R0 i* Y0 j' V, c/ i
  16. Server_IP = ''\" B9 ^\" G& |- H7 W0 [, p
  17. Srever_Port = ''8 M6 Y' I. d0 ]1 Y0 y4 |: @
  18. 1 j2 D3 L8 M3 M1 p) s: i3 }
  19. def print_hex1(s,prev='0x'):: E8 ?: T. |+ }8 y
  20.     for c in s:
    5 [8 S* U3 z! r\" d
  21.         print '%s%02x' %(prev,ord(c)),
    6 e\" i% @2 |6 U
  22.     print4 f& }6 b5 O9 u; n5 u  i
  23. def print_hex(s):
    ; y3 y& Q2 w1 L: m2 v/ L2 d% k
  24.     for c in s:2 s2 [2 ]6 Q\" W  N\" {  u7 U
  25.       print '%02x' %(ord(c)),
    $ {; e5 `* T- c* B
  26.     print
    5 e/ H( Y. p& g& ~/ E% Z( y\" X

  27. ! L6 [7 ~7 O, v* Z2 ^2 p
  28. def hexto_str(s):
    / ]2 H& n3 D9 e1 K; x3 X
  29.   r =''
    ! q/ t) Y3 B( t+ U* i
  30.   for c in s:. h5 a1 L  g8 L( e5 w3 {4 {; e4 a
  31.     r += '%02x' %(ord(c))2 ?$ u\" Q5 k4 }
  32.   return r. D/ O' N* ]. T+ }
  33. def strto_hex(s):
    4 m- E7 h/ s\" S
  34.   r = s.decode('hex')
    # k2 r( d+ ^; ^2 k: Q1 M! s
  35.   return r: Y, g2 ]6 p1 J) j
  36. #''代表服务器为localhost
      m7 F( E5 u: M& F( h+ ^* c7 {
  37. + Y( m$ K  n0 [9 ~$ l
  38. #在一个非保留端口号上进行监听1 R8 X' x6 n( Y7 Z. q

  39. \" G; D4 C$ R\" k- I4 z4 b4 N
  40. 7 C5 k- s* d0 A
  41. class ComThread:) Y) i% h% g, E3 @4 f. \+ E
  42.     def __init__(self, Port=0):
    ' N1 o+ g% ]+ {, O, D) V& f
  43.         self.l_serial = None;/ T\" ]1 Y2 |5 v' r
  44.         self.alive = False;  ]7 _  j) _5 T# F* }& `* w* }2 R3 ^+ Q
  45.         self.waitEnd = None;
    ; r: y& [6 k$ [9 `7 S5 @) I* Q
  46.         self.port = Port;7 |\" n* l' P) O8 t* J

  47. 3 M$ L& g! a* ^0 O% a\" G! z+ ]/ c
  48.         #TCP部分
    3 Q5 F* d( S2 G6 {4 ]- S
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)7 V# o% M3 x% I, Y/ m, n
  50.         self.connection = None
      L# U\" _, y; a1 {# I/ W
  51.         #数据9 w; l6 j5 U2 @+ a
  52.         self.snddata = ''
    ) N- n. Q6 A3 Q\" v  `$ K
  53.         self.rcvdata = ''
    # ~9 ^8 x/ f& ~; ^( d. G

  54. & W) j( T( \9 S7 O\" H
  55.     def waiting(self):
    0 E! J# E- L4 I0 \& p% O, j
  56.         if not self.waitEnd is None:) p) w\" O' X, ?* ?
  57.             self.waitEnd.wait();' P3 `/ M7 g* `5 y' v! {, m$ I

  58. : U9 \+ N4 E5 b

  59. & }- Y3 `0 H5 t# |! g$ H+ d
  60.     def SetStopEvent(self):
    9 G' c0 ]2 Q4 `) u/ a9 ], I/ X
  61.         if not self.waitEnd is None:# W: }6 ~& f0 l) w: N1 o: y- N
  62.             self.waitEnd.set();
    * E! J, I0 ?5 c& I\" ?- s
  63.         self.alive = False;
    . J6 ^' ]3 x# ]( l+ j) c
  64.         self.stop();
    / L4 F2 R2 b9 p; @6 A/ k
  65. % L8 Q\" Y* z8 A* t# R' p8 }

  66. ' ]1 x8 Y/ B4 Z, n. {! T9 W\" o
  67.     def start(self):% O# a\" s0 G# d( A( ]- g5 d
  68.         self.l_serial = serial.Serial();
    ; _! s6 _* w2 y) u
  69.         self.l_serial.port = self.port;
    4 Z4 C2 e1 `  ^
  70.         self.l_serial.baudrate = 115200;3 V0 U+ d\" U# Z
  71.         self.l_serial.timeout = 2;  #秒; T0 s4 g4 B+ H6 W/ R0 }9 n+ D
  72.         self.l_serial.open();- @% g5 L5 U: b! c% W
  73. ( H: X9 P: ~* ^' c7 [
  74.         if self.l_serial.isOpen():
    % w) s8 o$ \- M' l/ p* @: q; h
  75.             self.waitEnd = threading.Event();3 s3 d5 E) [# n. e2 ]
  76.             self.alive = True;
    ( `# ?\" z% v5 {
  77.             print 'open serial port %d ok!\n' %(self.port+1)
      D6 j( h2 L9 m& D3 [- W' q6 e
  78.             print 'baudrate:115200 \n'
    2 l- z2 d* s- Y  i& R
  79.             self.thread_read = None;
    ( ^9 n  {0 [! X
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    - B  L  a2 E; s4 k0 e
  81.             self.thread_read.setDaemon(1);
    2 t3 G1 J. U, f) h9 @
  82.             self.thread_read.start();
    ; K( ?, x% k2 x. T

  83. 1 g# S\" L: @+ o' P) f
  84.             self.thread_write = None;
    ( T: j9 G9 j+ [
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);% h8 M* F& p/ v3 h' B
  86.             self.thread_write.setDaemon(1);, _0 s$ M3 g6 p
  87.             self.thread_write.start();
    ' H7 k% k* O' G( h. G

  88. % m8 Y/ \. Q, A; W4 n
  89.             #TCP部分+ E/ e% _4 D. P) F& s\" `
  90.             self.thread_TcpClient = None;
    8 x- S1 f4 E0 B+ m( z/ o2 e8 J% F
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);. [  @9 H5 ~\" c
  92.             self.thread_TcpClient.setDaemon(1);
    3 ?8 o  X% W/ {# }! U- r
  93.             self.thread_TcpClient.start();# ?) P- r0 P$ H
  94. 4 L# X\" C- N! F1 _$ o1 O( r- b9 @$ n
  95.             self.thread_TcpSend = None;
    # o: Y2 N) @$ a& y9 i' Q( T- [+ |
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);5 m: f& }* p/ l4 Z/ \1 S7 v/ F
  97.             self.thread_TcpSend.setDaemon(1);
      X9 \\" G3 U/ m# @$ O
  98.             self.thread_TcpSend.start();
    $ D' L8 W. ^0 o2 ]
  99. + v' N9 [7 i+ L* P3 c1 K
  100.             return True;
    1 b+ u5 q, x/ X: ]; P- p) s, W. i+ A
  101.         else:
    : ~7 C& [2 L0 x5 x! [! b
  102.             return False;
    * ~9 }: U' F& @  P+ S/ B1 D

  103. : f0 e- q. g8 b6 }& d& a7 M
  104. , {* g* g, B6 N6 ~1 o
  105.     def FirstReader(self):
    6 n; }: U- a: E9 ~& @- Y. q9 j% Q5 j
  106.         while self.alive:
    7 i  Q! \* G# l! D$ V
  107.             # 接收间隔3 ]- I7 \/ x) S% f  ^
  108.             time.sleep(0.1);
    0 l6 k/ K2 B5 O/ W0 w8 |) U5 C
  109.             try:
    ( R# R  p; P! ^$ g& u9 g9 J( M
  110.                 data = '';$ J- k; P9 c/ C6 _
  111.                 n = self.l_serial.inWaiting();
    7 ^! U. I  t' P! f- b8 s2 D+ b9 B( F
  112.                 if n:+ x: |5 e; z8 g2 C  w/ J# n! s5 X& ?
  113.                     data = data+self.l_serial.read(n);1 d; ~# E7 y  C% M# I
  114.                     #for l in xrange(len(data)):! [- N7 L& q8 |: c+ f
  115.                         #print '%02X' % ord(data[l]),) X# Z! j1 t& b\" E7 N( e  |
  116.                     # 发送数据
    # X+ H9 v\" G7 ~4 |3 H- W
  117.                     print u'->请求:'
    - |\" c2 M) D. t  N
  118.                     print data;
    * i1 `\" A4 a2 m8 \; i
  119.                     mylock.acquire()
    % M% c5 ?1 b\" _2 x0 ~- t1 i
  120.                     self.snddata = data
    + c4 o' D. W\" P# q, y
  121.                     mylock.release()1 N# S/ P& F' z$ T3 I; o
  122.                     #print_hex(data);! Z# }0 `. u\" a/ M2 G% |. f4 E* o
  123.                
    # b: I0 \) v! G\" H( G, V8 j  [
  124.                     * ^: I/ V* N  L: a( O( i
  125.                 # 判断结束% W7 d5 r& T9 m% a: O0 c
  126.                0 R) t! L% b. R- r\" @
  127.             except Exception, ex:( s& C; F% X: G/ t9 p4 a8 ^5 m; |3 T& j
  128.                 print str(ex);* m9 X! d6 ?, U' i& p2 X

  129.   v% ~% n8 E4 {' `! ~/ h
  130.         self.waitEnd.set();
    # [) W5 x& s2 x' s' E
  131.         self.alive = False;
    \" ]  P; X! K. D

  132. # Q7 W1 v1 N2 N9 j
  133.     def FirstWriter(self):6 U1 E  D  t2 z1 i3 P
  134.         while self.alive:7 X  z1 q, b- d: ]7 H- j( E8 B  s
  135.             # 接收间隔\" ]( a% \- Y, a* K
  136.             time.sleep(0.1);$ p  Y' a7 C- A$ {
  137.             try:
    0 N, s$ @* M% J9 c# P1 x+ x6 d
  138.                 #snddata = raw_input('\nenter data send:\n')# }  ^% l+ R  [+ y) c( Z
  139.                 if self.rcvdata!='':* D- b2 T( u\" \\" g) _+ a: m
  140.                     self.l_serial.write(self.rcvdata);
    0 H# U/ v1 p# G) k
  141.                     print u'-<应答:'! Y& [+ y- W' }. s2 W
  142.                     print self.rcvdata;
    : ?% w9 G\" m' V1 c
  143.                     mylock.acquire() % H5 ~\" ~  c1 ?3 V& I
  144.                     self.rcvdata = '';! M\" G4 F( E4 }$ O3 k! L
  145.                     mylock.release()
    \" p' e8 k' A# K! E, L+ e
  146.                 #print_hex(snddata);) Y- R1 e3 ~3 S0 L
  147.                
      z7 S\" o' c3 z9 p$ _* U
  148.             except Exception, ex:0 q6 D7 f5 L8 S  D  V8 g7 r* S: f
  149.                 print str(ex);
    7 k! H1 n4 ?2 F9 W9 {
  150.         self.waitEnd.set();
    8 Q5 ^\" e6 y8 R
  151.         self.alive = False;  a\" g% G+ Q) m4 Z  R5 r$ c

  152. $ L\" O6 U# Y$ L* i, ]
  153.     def TcpClient(self):
    & }/ a& U% ~- l2 x1 s/ a2 Q5 `  d. r
  154.         while True:
    ; v% [1 U0 p6 M. S+ E5 ]* g+ {
  155.             # 接收间隔4 R- ~8 s6 D) p
  156.             time.sleep(0.1);
    0 A! r6 c$ h\" C+ L& y- S  t# a
  157.             self.connection = socket(AF_INET, SOCK_STREAM);
    5 G& V4 n+ W. b- }4 y
  158.             self.connection.connect((Server_IP, int(Server_Port)));1 x% ~6 I2 t) P/ m
  159.             print 'Connect to Server OK!';
    8 E3 O# C& J8 b5 H! Y
  160.             self.snddata = '') P7 ~& e( J9 A: _2 s4 `9 l2 L
  161.             self.rcvdata = ''
    6 |4 Y; x3 I( Z9 b1 @7 G
  162.             while True:+ R3 k6 x0 m( w2 J5 Z. S
  163.             #读取客户端套接字的下一行
    2 b& T+ s2 e# l; P
  164.             data = self.connection.recv(1024)2 g* E- r) \2 y
  165.             #如果没有数量的话,那么跳出循环
    * p( R& E, j\" B  a0 d
  166.             if not data: break
    8 z/ M$ M4 F- ^! w* w, F* m5 d8 L
  167.             #发送一个回复至客户端! ]: R+ ]  _7 I' B: ]
  168.             mylock.acquire()
    5 o. H' `& q\" M+ q( i
  169.             self.snddata = ''
    ' g* @& S9 g0 q3 y
  170.             self.rcvdata = data3 D5 b3 t7 {: T) i/ s6 Q$ R
  171.             mylock.release()
    ) d' p8 U9 p6 s6 h6 r
  172.             #connection.send('Echo=>' + data): _0 H) M0 W4 w# \- |
  173.             self.connection.close()
    \" `- h+ T3 {' G/ e, P! X, B  J
  174. 9 x4 V' |6 _8 F7 n) A
  175.         self.waitEnd.set();
    ) T! y: S- ?% R; x6 K0 _% r$ X
  176.         self.alive = False;' z4 B% g( Q# l1 h\" h3 t* h

  177. 7 Z8 G- Q% ~% @; P/ R
  178.     def TcpSend(self):
    ; S\" d7 M8 [* A; j: F$ Z
  179.         while True:
    1 G# d9 n  \7 G. X
  180.             # 接收间隔
    1 Z% c0 O. c9 L9 ]. e2 {$ X
  181.             time.sleep(0.1);- K, d) K0 v( o+ K/ g
  182.             while True:' i/ D& k; n\" i$ n7 H6 T4 \
  183.               time.sleep(0.1);, f) F' Y  _0 k% V  c
  184.               try:
    9 J: `/ s& e/ i  \+ q, S& t1 I4 x
  185.                 if not self.connection is None:  P/ O8 @. S! l5 z6 {% G
  186.                   if self.snddata != '':5 M$ r' K/ B\" Y# S: f1 o; v/ r+ w
  187.                     self.connection.send(self.snddata)& b' v& v2 v2 w  D  Q
  188.                     mylock.acquire() 7 T1 i: {8 |1 ^+ r! f
  189.                     self.rcvdata = ''
    7 ~( D2 R\" f! D% W# f- Y
  190.                     self.snddata = ''  W* v: c\" v9 ~* \/ }; A* f' D
  191.                     mylock.release()
      I2 _6 S\" a! e  a
  192.               except Exception, ex:8 d8 @2 w5 B8 ^  t! f; A: B- t\" L+ V
  193.             pass        # O8 F3 V& s' [; T4 O, B
  194.     def stop(self):
    ( b4 }8 w- \8 Q  v8 N2 I# R$ Z
  195.         self.alive = False;
    9 t- v: C4 u/ V* x2 e
  196.         self.thread_read.join();
    2 d  n% p5 N* T+ O) i3 q
  197.         if self.l_serial.isOpen():
    - {' C) M# z  e: ?0 t# c, D( ^
  198.             self.l_serial.close();
    . q+ s9 L* N, T  ]0 [  a- n

  199. : G) v5 \1 O! L
  200. / d2 v+ A6 K8 w; |, `2 l. m1 v

  201. 3 _: F4 M% g, k. D. P7 p
  202. #测试用部分
    % W* ~$ J; H4 L\" \
  203. if __name__ == '__main__':
    ; q/ S: k% u  E# L/ u
  204.     print 'Serial to Tcp Tool 1.00\n' + O% F2 l, E7 v- M
  205.     print 'Author:yangyongzhen\n'8 f( O3 s! h( r6 n# E
  206.     print 'QQ:534117529\n'
    / V6 T: ]6 N. v# S
  207.     print 'Copyright (c) **cap 2015-2016.\n'
    3 F' R. h, E' G

  208. ' T+ B7 |5 Y* E) G! S/ x& M) O$ k
  209.     Server_IP = raw_input('please enter ServerIP:')
    2 K9 V1 n. H1 i# i
  210.     print 'Server_IP: %s' %(Server_IP)
    4 h0 D( K; F) t* c4 D; s
  211.     Server_Port = raw_input('please enter ServerPort:')
    7 J7 Z2 ]: s' @- o$ d
  212.     print 'Server_Port: %s' %(Server_Port): k4 m8 S$ t( L, s; P3 R* \
  213.     com =raw_input('please enter com port(1-9):')$ U0 j! ?7 j2 |: I1 f3 M
  214.     rt = ComThread(int(com)-1);2 Y! r& h8 M! M9 @( }
  215.     try:
    # [7 r9 e7 j0 G$ @6 k8 Z! d
  216.         if rt.start():- l* q, r, S% k\" p
  217.             rt.waiting();
    # L; e- R2 g5 l& R1 [* y2 t
  218.             rt.stop();& Q% j  s- d4 [
  219.         else:) w7 k5 z/ _# \) J
  220.             pass;            
    % S5 C* j0 N* B* F$ a& [
  221.     except Exception,se:
    % m* G+ f% Q; j6 o1 d) O
  222.         print str(se);& x; O! c0 }; r  x# _+ }& K/ D; b

  223. ' M0 O3 ?9 g+ _; ^
  224.     if rt.alive:
    2 h7 o% F  I1 W  n
  225.         rt.stop();9 m! [3 B# @, }& w
  226.     os.system("pause")
    9 ~  x* E* N+ Q1 |2 l* v
  227. * d4 a; ?% S' _5 W8 {5 F, U! z
  228.     print '';4 ^0 v9 Y( u2 d% }; {
  229.     print 'End OK .';$ H/ {7 A. ^0 }! j* H* K
  230.     del rt;
复制代码

) A( g6 q- c1 y& E
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-18 16:16 , Processed in 0.430329 second(s), 51 queries .

回顶部