QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-82 @3 \# _: }0 U1 v
  2. * Q( ^; c. [; P

  3. 3 p; b; A9 u. s+ y5 ^1 A' o. j
  4. import sys,threading,time;; w$ I/ q8 U6 h( R
  5. import serial;+ G# h! d8 ?# U0 D. _  ]
  6. import binascii,encodings;
    * `2 {2 I' w) \* o* g3 V) }
  7. import re;
    3 S) ]! h% g$ s* _; D
  8. import os;; a( e\" T) [4 y/ x9 |( o2 ?: d
  9. from socket import *0 G$ U\" |1 a0 b% B+ o
  10. from struct import *;6 l. p: ~* D) h, R; R3 i# d& P+ F
  11. #from myutil import *;) D: G; e2 w; ?0 M, {0 a' V1 d
  12. #name: myutil.py. Y- d$ a- ^. J: O3 [% h

  13. # ^' i! Q4 s9 ]3 h/ a
  14. mylock = threading.RLock() ( {/ ~1 m% E! E+ M2 q) f. R

  15. ! b6 s. H- \* u: ]( j
  16. Server_IP = ''
    / w1 C- ?8 u2 p1 A
  17. Srever_Port = ''
    ; p; k! t  E# x4 v- W
  18. 8 B0 @) y7 I: O; K  ~5 {
  19. def print_hex1(s,prev='0x'):
    ( m5 x) q& f& T0 e) X! G
  20.     for c in s:
    . R! M! z\" R6 B+ ]
  21.         print '%s%02x' %(prev,ord(c)),7 l9 y\" @# J$ H# I3 X
  22.     print! z. `) w3 v& p) e  t
  23. def print_hex(s):* l0 `& u2 |9 z  {; L6 B% z; |; @
  24.     for c in s:
    - p$ x  x% H5 x  h9 ?  L5 G
  25.       print '%02x' %(ord(c)),3 j$ d  `3 `5 d1 x  {0 g4 E
  26.     print
    : R, h( x\" w( W: S0 V
  27. - t3 V; G* n) u/ z% J6 E9 m! b
  28. def hexto_str(s):
    3 b7 ~8 Z7 q/ z# e9 @; \' `+ N\" [
  29.   r =''
    5 G1 i  s4 G4 x0 o, A8 l
  30.   for c in s:
    ! T; G5 V; |9 m6 P# ?2 Z. ]+ ^
  31.     r += '%02x' %(ord(c))
    8 y' }3 I3 C7 z/ q- K
  32.   return r* `3 i) L! z2 y& s3 t: H8 e
  33. def strto_hex(s):
    & v5 H; v% K: j) v
  34.   r = s.decode('hex')
    , R8 Y# k- |0 M7 @
  35.   return r\" ]& q% {9 u5 h
  36. #''代表服务器为localhost
    . R) X! g5 w3 H2 P* w* K; K
  37.   B2 E3 t9 M2 J5 m  F* P9 W\" u
  38. #在一个非保留端口号上进行监听! e* u3 O, @+ G, B
  39. 8 C5 J  X6 h! J9 n6 Z6 C. y+ i

  40. ) T* W3 q1 b3 g. f% Z; ]
  41. class ComThread:
    ' t% H! f/ y1 H9 b- s+ Q( C
  42.     def __init__(self, Port=0):\" F+ I+ Q* b# p! W: v. I
  43.         self.l_serial = None;
    5 T, \  f+ v: u5 A6 E% p+ B
  44.         self.alive = False;
    - w* w: X- N! Z
  45.         self.waitEnd = None;3 {: p- r1 x6 S
  46.         self.port = Port;' s) b% U& @+ x
  47. 1 J2 }  o1 ]7 L, j
  48.         #TCP部分  S+ I+ i( I. [
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)* t/ z8 D2 ]: h
  50.         self.connection = None* m, V$ g3 u5 b
  51.         #数据6 P; W+ V, h# |$ p1 }4 s) q
  52.         self.snddata = ''
    & j% [' t. G3 t
  53.         self.rcvdata = ''\" q( |8 C6 r/ Y
  54.   s* U0 X! c3 t- D\" e
  55.     def waiting(self):& |2 A8 K  [% ^/ o6 s1 o: V9 E$ T! I$ a
  56.         if not self.waitEnd is None:
    : j+ O9 @6 W1 e7 d! E
  57.             self.waitEnd.wait();
    \" g# S$ x7 C& |* y\" @) i
  58. ) D\" Y0 c\" E& f0 [, t
  59. * P, ^  U2 B6 S& b
  60.     def SetStopEvent(self):
    ( ~) P5 v  D) I# J6 r8 ]$ y$ I
  61.         if not self.waitEnd is None:
    . B  M% q  {- ?, {' z
  62.             self.waitEnd.set();. n, B/ |7 p7 g/ G2 F& B; k
  63.         self.alive = False;0 c4 i9 _' f0 I% Z% V
  64.         self.stop();9 \5 a' K3 ]3 ^& d# w! u
  65. 9 ]* q7 O  _6 V' A& h
  66. * R) @5 M% b) s  a
  67.     def start(self):
    * R- @4 J9 A3 \! O
  68.         self.l_serial = serial.Serial();, d1 S\" S3 F1 [: X$ O
  69.         self.l_serial.port = self.port;
    8 M\" f$ s! L; D$ @# ]
  70.         self.l_serial.baudrate = 115200;; _( K2 w9 g\" m* K* N
  71.         self.l_serial.timeout = 2;  #秒$ F  o# S6 k  Z; W- i
  72.         self.l_serial.open();
    7 H5 x0 e% @6 K6 }  q) m

  73. $ o* a7 U5 L, o' n\" f0 A5 v
  74.         if self.l_serial.isOpen():: a' m$ U+ Y& T- I8 ?3 Q
  75.             self.waitEnd = threading.Event();
    + A+ J6 n- w: s5 v  I1 k
  76.             self.alive = True;6 v& }% l; ?, t* a- o8 S
  77.             print 'open serial port %d ok!\n' %(self.port+1)
    6 i, v8 }! X\" K/ D
  78.             print 'baudrate:115200 \n'\" d\" W: c0 m: y1 g. N
  79.             self.thread_read = None;
    ! c/ \( {5 v( X\" C! s
  80.             self.thread_read = threading.Thread(target=self.FirstReader);8 K2 m- p5 p' @& ?* T9 H
  81.             self.thread_read.setDaemon(1);4 ?5 v& R/ ^+ a. q
  82.             self.thread_read.start();# {\" U9 S% G9 h- o' s7 X0 n3 z# u
  83. 9 F  d2 Y4 S( w9 ?\" L' {
  84.             self.thread_write = None;0 v/ D, N. ~. K3 F6 _2 B4 ?/ h
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);
    # e$ x8 G& `9 R\" P. N
  86.             self.thread_write.setDaemon(1);; f! a+ C9 D2 r) g4 j: t& I: U
  87.             self.thread_write.start();
    4 {; J- d8 e* ?+ ]( d

  88. 5 B- R' [# p, @; f9 v( c* k
  89.             #TCP部分0 b5 ?* P; r9 T
  90.             self.thread_TcpClient = None;
    / t4 A# `3 \8 M1 Q8 n
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);5 Z* P+ v1 {! `\" O
  92.             self.thread_TcpClient.setDaemon(1);5 A\" w$ d( N7 K7 o+ Z0 _
  93.             self.thread_TcpClient.start();
    ) Q$ ^. v) Z9 O  O! I; g1 W

  94. 9 J5 o$ i1 j, O) b3 a. n! c
  95.             self.thread_TcpSend = None;4 B' s) F3 }9 j0 q2 }# K- |% M
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);. W) s( x4 u* J; |7 E8 r# N) v
  97.             self.thread_TcpSend.setDaemon(1);\" s/ r3 w: C4 C4 A7 ^
  98.             self.thread_TcpSend.start();
    9 m+ e4 R& A6 z. s8 n- w! R9 p

  99. ' q3 p  s1 M1 N4 o* N
  100.             return True;0 [% G. @5 |- \, Z, R
  101.         else:& u( [5 P8 B8 v: \0 A' E
  102.             return False;
    & C9 I* d: y+ s' e% |, d1 E

  103. 4 {: a\" r9 r; Q4 j5 Z2 n

  104. - f- Q8 X6 d; Y
  105.     def FirstReader(self):) Q  t3 C# I. c% J, V0 P3 Q; r
  106.         while self.alive:
    ; R' L6 X* ?7 D1 |2 A- a1 m0 w
  107.             # 接收间隔6 V5 h. j: c! U1 o0 J8 N# K( m
  108.             time.sleep(0.1);% e6 q) M0 X3 d) p1 F\" x5 H' G
  109.             try:
    0 f( L# Q. J0 X% K. G: C7 Q4 K2 B5 V% d
  110.                 data = '';
    ; Q8 G2 m7 ~) i6 C
  111.                 n = self.l_serial.inWaiting();2 f/ R6 d8 i  o! b; `; ?
  112.                 if n:! M; T& a5 \4 i0 o, Z
  113.                     data = data+self.l_serial.read(n);
    - }) j7 s. g5 d% `9 N: l8 E& k) R
  114.                     #for l in xrange(len(data)):- {$ l: x# y! n% l) ~: J
  115.                         #print '%02X' % ord(data[l]),
    5 s, V8 {6 j0 \0 T; l
  116.                     # 发送数据. ^2 x$ ~+ R# A
  117.                     print u'->请求:'
    6 A* G  Z+ J/ s2 e7 N9 j7 A& a
  118.                     print data;/ W* ~5 C' T1 P
  119.                     mylock.acquire()
    / p- x  i; E6 y* C3 l) p0 S2 \5 H
  120.                     self.snddata = data
    : ?& S' P  b) w- ~. v  M5 }
  121.                     mylock.release()
    \" V! n( C8 W' l+ Y6 {4 S, r
  122.                     #print_hex(data);. Z9 G$ t8 Z$ g& P$ F5 {( d. a
  123.                
    3 l7 I\" v' q5 v5 u
  124.                     
    ! Y2 T6 H# M% E$ y$ ^\" H
  125.                 # 判断结束
    5 E5 x- K$ L' T& m
  126.                
    0 @0 l+ W4 |  T8 S; A2 T7 U
  127.             except Exception, ex:
    + ~4 F. [+ n  n; N\" Z
  128.                 print str(ex);% u/ M- n) K$ L) B1 ^* H
  129. 2 D: `1 Y9 m\" k' e- H
  130.         self.waitEnd.set();3 g: `2 O$ f2 z6 W* V$ T
  131.         self.alive = False;! G& k  D% A! ?- m9 H4 @

  132. ; q8 ~9 s: F) B( q% H
  133.     def FirstWriter(self):
    4 Y, C* b& M( X  q& ~
  134.         while self.alive:1 M! t0 y% X# |3 a' J
  135.             # 接收间隔/ @) g' W0 k$ h8 b% c2 \
  136.             time.sleep(0.1);. o7 w$ }! q2 C7 d. B; B
  137.             try:; d2 H  m1 E1 Q3 }+ }
  138.                 #snddata = raw_input('\nenter data send:\n')( q: r. q' u- J+ _7 Z
  139.                 if self.rcvdata!='':
    9 e2 S0 Q# P! _) B( t& d4 [\" b
  140.                     self.l_serial.write(self.rcvdata);
    $ q+ Q! F7 D, {# p
  141.                     print u'-<应答:'
    5 K! E( s) c! C4 D8 [7 P$ ]& i
  142.                     print self.rcvdata;8 t, E1 |# ]. T, |1 [% d5 w
  143.                     mylock.acquire() + `8 j$ o) o0 t9 _
  144.                     self.rcvdata = '';: H1 f- W5 N: E3 Y& q  Z
  145.                     mylock.release()\" t3 s# F8 f3 F! c2 O% J
  146.                 #print_hex(snddata);
    / w4 S0 X( ^2 Z
  147.                 ! d7 S; t; j( }$ a$ |% ^0 i
  148.             except Exception, ex:1 t+ F6 \7 M) |! Z# o& W
  149.                 print str(ex);
    0 p7 N, [8 E' ~3 C
  150.         self.waitEnd.set();! T0 }$ B\" ~* J( f' Q( G  y8 g
  151.         self.alive = False;8 u+ S. O, j( R( ^4 q) {% {

  152. % Q1 n+ `+ R6 {& \
  153.     def TcpClient(self):4 ?! `( C$ w1 t& p1 b3 v9 }  s
  154.         while True:
    + R1 I' L1 {' {) z' x. v
  155.             # 接收间隔
    / i/ B+ l7 a\" U% i% I  e/ M0 C3 n
  156.             time.sleep(0.1);
    9 Z8 N, Z  c- s
  157.             self.connection = socket(AF_INET, SOCK_STREAM);
    % x  z7 a$ t5 D; u
  158.             self.connection.connect((Server_IP, int(Server_Port)));
    ' i! U( i0 L' u6 `; G. `
  159.             print 'Connect to Server OK!';
    ! E9 c  x7 s% Q6 n+ ]! q, ?
  160.             self.snddata = '', p+ m  \) `4 N5 |
  161.             self.rcvdata = ''! e# }$ g  C  C8 m' s\" Y
  162.             while True:; e4 ?. f  _# B1 `
  163.             #读取客户端套接字的下一行4 b8 ^3 z  {7 r2 P. d
  164.             data = self.connection.recv(1024)' m1 }' V' Y  a0 \\" b\" {: S3 s
  165.             #如果没有数量的话,那么跳出循环
    % `* p* t. f3 G9 ?
  166.             if not data: break2 ~' |( Y: X3 u( n
  167.             #发送一个回复至客户端
    6 J; Z7 ^- B4 W/ C7 N
  168.             mylock.acquire()
    & @8 P: n6 A& u# _* x2 a) G
  169.             self.snddata = ''
    ' \1 w( F+ E! ?
  170.             self.rcvdata = data, x' z1 |* u2 ^1 S1 v\" s) }! i
  171.             mylock.release()2 s: o7 z2 T4 T; l  i
  172.             #connection.send('Echo=>' + data)
    % |7 o, ^9 W, A
  173.             self.connection.close()
    9 Y9 U! K' X4 ~, y

  174. 4 L6 T3 E! h  s2 F
  175.         self.waitEnd.set();, b  L7 m\" C2 K; |, f) Z
  176.         self.alive = False;* D3 ?. B: n( M6 X6 o/ o) ?7 U* d

  177. 3 A( C; x+ d1 K/ I
  178.     def TcpSend(self):$ `6 [; u/ C+ X+ J- C1 j$ w
  179.         while True:; J; y  @/ F& S; w
  180.             # 接收间隔
    6 @  B% F, U2 k( O
  181.             time.sleep(0.1);
    : R9 L! ]  F$ b6 R8 i6 a1 ^
  182.             while True:
      S, l' a9 p& U5 O$ h7 H  o
  183.               time.sleep(0.1);1 E; h9 r7 g' C\" f
  184.               try:/ J) A3 U7 R1 d) Q
  185.                 if not self.connection is None:, r- l/ B# N: S( ^  \. [\" F3 }
  186.                   if self.snddata != '':# x6 w7 _1 _0 F2 T0 h/ G+ _
  187.                     self.connection.send(self.snddata)* J: I  m0 a* R2 S+ A3 i/ D7 ^  ~
  188.                     mylock.acquire()
    ( k  d\" I( B  K0 X/ _6 p5 _% B, C
  189.                     self.rcvdata = ''
    \" @* A' k- k, I# M# p
  190.                     self.snddata = ''* g+ i: }; S: {: e, y8 u
  191.                     mylock.release()! q% n% f* c8 o$ ?' w+ v$ T
  192.               except Exception, ex:! R9 ?& j. p1 N# i! H
  193.             pass        5 F1 e1 @% B7 Z
  194.     def stop(self):
    9 }( g\" W6 ~6 A& z& I3 w
  195.         self.alive = False;
    ) v% C5 H% `3 ]
  196.         self.thread_read.join();
    0 J& P6 d. }7 @/ M
  197.         if self.l_serial.isOpen():
    - _( {1 C\" E5 [
  198.             self.l_serial.close();
    ! g' C2 z$ P  Z- H; K: b

  199. 9 m( p; e5 e  R. ?- ?: b0 p
  200. 6 o+ S. h7 `$ @  e  C
  201. % u! J: d8 v+ Z3 U+ n1 J( [# f
  202. #测试用部分4 |; f% T9 Y  P' V- O5 R
  203. if __name__ == '__main__':
    9 o0 R( K) V$ N- O% `. P: u* d\" b
  204.     print 'Serial to Tcp Tool 1.00\n' - l# T\" P4 e: u$ p! w* G6 Y: n
  205.     print 'Author:yangyongzhen\n'
    ) l. q3 N4 K! L. u\" V9 o
  206.     print 'QQ:534117529\n'/ m2 @\" M- E' B
  207.     print 'Copyright (c) **cap 2015-2016.\n'
    7 ]/ X) y- [( s2 |- Y

  208. + q1 H0 E4 b6 E5 L. u( _
  209.     Server_IP = raw_input('please enter ServerIP:')( F) [, Z9 K  r( ]: v# I\" k  }
  210.     print 'Server_IP: %s' %(Server_IP)
    , {% F2 ~! o4 M8 i2 [
  211.     Server_Port = raw_input('please enter ServerPort:')3 u- [% q2 a7 F2 y( @) m
  212.     print 'Server_Port: %s' %(Server_Port)5 S) L& c' G7 h* e6 y4 K
  213.     com =raw_input('please enter com port(1-9):')
    ( B& U0 O( |- |: v$ E5 G* ?
  214.     rt = ComThread(int(com)-1);
    , o8 F  @+ n0 p5 c  w
  215.     try:5 E. r! Z9 D' S. n5 \$ W
  216.         if rt.start():
    1 A  Z\" a9 E! k: N8 o9 r8 v
  217.             rt.waiting();\" {, |: B\" X+ ]1 ^0 x
  218.             rt.stop();
    / _6 ~/ {; y, w6 u4 O* U4 |5 {+ K
  219.         else:
    # e\" L7 ^; e8 o) K\" Z, r
  220.             pass;            
    \" w; H. [$ V% ?1 e- m( w
  221.     except Exception,se:
    * s* O6 N! M% z: R1 B
  222.         print str(se);
    5 x# T( A: O9 q/ h' J$ l

  223. ; V( {7 H, c3 i/ ~6 |) L! c1 w1 t
  224.     if rt.alive:% o0 _' E* R. m
  225.         rt.stop();8 W6 ^! ~, k; q; H& f7 t; r6 G1 \
  226.     os.system("pause")
    ( M' W$ m: b$ ?4 }2 w* r' D& J

  227. 5 h9 d* [+ J# U# g# Q0 d3 P
  228.     print '';
    $ B9 N$ q! t3 F$ l
  229.     print 'End OK .';
    ; }8 L: }2 `6 L
  230.     del rt;
复制代码
+ i( p: a- {( Q. y0 _
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-7-18 05:03 , Processed in 0.376387 second(s), 50 queries .

回顶部