QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1192

主题

4

听众

2946

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    . V! }) u  ?9 f
  2. 2 d. w; n  B' ~% {5 f
  3. 3 Q5 a7 [5 S$ z/ M! p: Y& _9 `
  4. import sys,threading,time;
    9 `$ j+ B3 w- I& c5 y: q
  5. import serial;3 _\" p, G8 c  l
  6. import binascii,encodings;! j- u9 z$ }5 I: a$ _- I
  7. import re;9 l  Q8 ?  m2 {  ^* J+ f  G. ~  f
  8. import os;
    0 l& h: p* d# M8 ^. o
  9. from socket import *4 b# w; ~# h$ D
  10. from struct import *;
    ' Q& q' A$ e8 u6 v% n& a7 K7 L' [
  11. #from myutil import *;
    8 X( g- ]( A* k* J6 K1 @\" a
  12. #name: myutil.py
    # w' }+ `2 H4 D/ u& Y
  13. . |$ v& W! K* U9 O' v, }6 S
  14. mylock = threading.RLock()
    5 C\" v, E7 ]: M7 o; y
  15. 4 }0 h, n* @1 V% x
  16. Server_IP = ''
    - ?5 m2 n% X, ]: ^) `! v
  17. Srever_Port = '', M2 A% I8 K) K. f& k2 r

  18. ' f+ C) [: i\" W$ s
  19. def print_hex1(s,prev='0x'):8 m\" l3 K# d: B
  20.     for c in s:
    / c\" `8 n* ?9 b( D3 |& a# C/ _
  21.         print '%s%02x' %(prev,ord(c)),* y! q% N1 S  l- m' y+ B
  22.     print! d* |- t5 g. O! ^% b5 m
  23. def print_hex(s):
    ) k( s( Y: i5 v: t* V. J
  24.     for c in s:
    ; x+ ?3 c1 ?/ Y2 G7 S. F: d
  25.       print '%02x' %(ord(c)),1 n$ C\" }$ n1 b- ]+ C- r
  26.     print6 }( Y\" K; E& B' S% }+ o
  27. : f5 _2 \9 ~/ A& i' a
  28. def hexto_str(s):5 y+ M& l3 R% M
  29.   r =''
    * ^6 I  ]! \\" ~' p
  30.   for c in s:8 I4 r# n: j1 L! X8 J( P, F
  31.     r += '%02x' %(ord(c))& Q/ I+ k( K0 z4 g
  32.   return r* S+ D. l+ i* ~- e) R1 D9 @
  33. def strto_hex(s):
    0 _' N; x1 I8 b- n  }
  34.   r = s.decode('hex')1 |\" s9 }1 I. ]8 N; I: }
  35.   return r9 j* Y7 Q% P5 q. e
  36. #''代表服务器为localhost
      {5 T: j5 c! k9 R
  37. * G\" p$ E) h8 q8 T( [+ v: B& X# n
  38. #在一个非保留端口号上进行监听
    1 e1 t& Z: B/ h* \' V

  39. 5 c+ z, z3 F- Z) i. ?

  40. % y4 h  R& b\" c\" F\" R* r
  41. class ComThread:
    # x8 V/ p% M  H# \$ Y0 y% S, T
  42.     def __init__(self, Port=0):8 M/ `) I# U' [2 [
  43.         self.l_serial = None;- E. `: x$ }4 ]
  44.         self.alive = False;
    4 f' w2 ~$ p5 l5 x! Z/ Z
  45.         self.waitEnd = None;
    * _( e& w, @% q/ T( o
  46.         self.port = Port;, O% ?2 A) D- Q/ m' J

  47. 5 e( R\" R& {1 M* h) e
  48.         #TCP部分
    9 W/ M\" d% r9 U
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    9 S0 H* j5 d. i& x\" x+ Z
  50.         self.connection = None
      K6 c8 `$ {! [2 w
  51.         #数据
    . ]- H\" J9 g. Y
  52.         self.snddata = ''# W9 U3 o: o3 k
  53.         self.rcvdata = ''
    : \; U7 ~0 y* k) C8 X2 K
  54. $ F3 {# T# {; j& k! W
  55.     def waiting(self):& f0 n3 @$ h- Q0 g5 R9 e9 r7 P
  56.         if not self.waitEnd is None:* f' B! {5 g+ z) T. [; u$ _8 W
  57.             self.waitEnd.wait();
    ( H& V9 ~  P! w' t; R

  58. : o2 B\" z% q' v7 u

  59. 6 j+ }4 A$ e- a: v* @
  60.     def SetStopEvent(self):2 T5 d, J) r- r& Y8 M8 Y7 f6 E5 J
  61.         if not self.waitEnd is None:
    / ~9 K7 ]# {5 P6 Z4 a. c4 Z+ x\" {5 o
  62.             self.waitEnd.set();( z0 E* q5 y/ a+ ]3 n
  63.         self.alive = False;
    + C: h: W7 d/ h8 l) x
  64.         self.stop();$ }; u5 C0 [, P8 O) _! i8 O0 a
  65. / p) ~7 K4 p8 |1 ]\" z& }
  66. 9 Q* K0 x: B7 S+ D7 U
  67.     def start(self):
    , |\" I. d* L' R  V! h' s& Q
  68.         self.l_serial = serial.Serial();2 {) t2 J7 \5 \8 `& [0 A& w2 ^/ {
  69.         self.l_serial.port = self.port;
    - s/ P+ x# c; R* M% x
  70.         self.l_serial.baudrate = 115200;
    / r+ e  Q% p\" R& `& P
  71.         self.l_serial.timeout = 2;  #秒, r9 }) E6 S* R! n+ B8 D
  72.         self.l_serial.open();\" `+ {% _* ]2 V# Z/ k! J6 ~
  73. 7 J, ^4 a. B4 Z* I% D
  74.         if self.l_serial.isOpen():
      L  h! C\" [* |
  75.             self.waitEnd = threading.Event();1 G8 ?) N( G  y\" N; Z
  76.             self.alive = True;
    3 E  s' S% l% |8 z- Z; m
  77.             print 'open serial port %d ok!\n' %(self.port+1)% }/ ~; ]& E. i& A
  78.             print 'baudrate:115200 \n'
    0 W$ v3 t# J7 j' R: w/ @
  79.             self.thread_read = None;
    # ^$ N! e) Q\" V! o# o
  80.             self.thread_read = threading.Thread(target=self.FirstReader);
    % G! m$ {7 `  o: l2 ^: Y/ |
  81.             self.thread_read.setDaemon(1);  N0 C. A! N% [) j2 L0 \4 E\" P
  82.             self.thread_read.start();  v1 U6 Q8 L+ y) G  }& v: I

  83. ( n0 C. e: }* W9 r. x3 j
  84.             self.thread_write = None;
    % d+ k- t& C\" g* W2 X! @
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);9 p. y8 b' I0 _2 w* `0 `
  86.             self.thread_write.setDaemon(1);
    \" D+ u! {9 h$ L% q' D: h% `& S
  87.             self.thread_write.start();
    ' W5 x0 a( T. n9 K: l

  88. $ b' D, V& Z. V( v& L\" {
  89.             #TCP部分5 P9 G0 a0 q; \/ R1 ]) s3 X2 u# \
  90.             self.thread_TcpClient = None;
    8 b$ W* O7 I: K- ~: N$ i
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);# u. z5 T9 n8 r9 t
  92.             self.thread_TcpClient.setDaemon(1);8 \  \' {\" y9 f+ J! [9 ~1 u
  93.             self.thread_TcpClient.start();
    % a# [. f: G2 h. v0 L

  94. / ]. t# E  G. ]
  95.             self.thread_TcpSend = None;
    8 ~. k& _6 }\" \# {8 w1 h
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);8 i% u\" n3 Y( b! f5 `
  97.             self.thread_TcpSend.setDaemon(1);2 C( o' y6 ?- D4 ~
  98.             self.thread_TcpSend.start();
    2 n\" N\" C* J: R3 @

  99. 8 v\" Q5 O: {/ c) M5 U8 q
  100.             return True;
    2 D) ^# k  w# X) D\" t5 H
  101.         else:4 r7 ]. R0 K2 I( {% `0 Z6 F
  102.             return False;. a3 m4 A6 _2 K# N$ T, U( Q
  103. : r0 e( }6 c2 M( Q# S
  104. + W5 ]) G1 T\" A* _5 Q* X
  105.     def FirstReader(self):
    ( ?8 i- {7 E$ O- J0 C# p
  106.         while self.alive:/ R' M# h9 b( H9 e! S* O\" c# o
  107.             # 接收间隔
    ' c+ |: X4 R- W9 Z7 t7 q. T
  108.             time.sleep(0.1);1 n1 b5 p4 v9 n  L, U+ T/ L
  109.             try:
    8 w. u\" s: |- Z6 o* f2 N
  110.                 data = '';
    8 Y# k7 ?% V' q( ~7 S+ \. z
  111.                 n = self.l_serial.inWaiting();
    ; l+ B6 t8 f+ T( L# \- P
  112.                 if n:
    ) U) d' v/ q- {' g
  113.                     data = data+self.l_serial.read(n);
    8 Q( V+ y6 s7 e, R' s6 [' [2 n) o
  114.                     #for l in xrange(len(data)):
    \" g( r. p  X* |, t. Q2 R
  115.                         #print '%02X' % ord(data[l]),
    5 ]1 W% |6 `* Q7 T
  116.                     # 发送数据, S' w7 p7 T5 n  ?
  117.                     print u'->请求:'  L7 A, J\" N. t( I6 k
  118.                     print data;- {6 N0 ^% ~) o
  119.                     mylock.acquire() , u' V. D( C% v8 L, A
  120.                     self.snddata = data! l' ]+ [- s! `
  121.                     mylock.release()
    , ^1 q6 I\" _( u* F
  122.                     #print_hex(data);
    ( f+ {, h8 H0 J  _
  123.                 % p. }5 y# B8 S\" W
  124.                     
    ( i( r0 I- @7 ]
  125.                 # 判断结束; V9 x( T% |) R9 x
  126.                2 G6 F' U& ?4 Y) z) v$ |0 t4 ^
  127.             except Exception, ex:
    2 ]) e5 }9 z; _* E1 ~\" G; J
  128.                 print str(ex);  Q- _$ W\" y* E
  129. * r) M. I! }* f3 G( ]
  130.         self.waitEnd.set();1 g: b\" ]% v$ y- C
  131.         self.alive = False;
    $ _2 P\" u, @& c( [0 X+ m; V! q
  132. $ R7 Y- |! Q( t# j: A5 X
  133.     def FirstWriter(self):
    - n7 M- @. \! k! B, U
  134.         while self.alive:; Y* h% u( u, Z/ d
  135.             # 接收间隔
    & l8 `8 O4 i) ]
  136.             time.sleep(0.1);
    6 J, F8 L* D3 \# l% p4 k
  137.             try:
    ) U' j0 I( J, t6 ?1 w, L  ]- n/ E
  138.                 #snddata = raw_input('\nenter data send:\n'), D- e; F; q8 \  k8 K6 i* k! A- Q
  139.                 if self.rcvdata!='':
    ' @5 g' K2 o0 P7 b
  140.                     self.l_serial.write(self.rcvdata);
    . C8 p2 l' O  _\" I
  141.                     print u'-<应答:'( Z! h3 J+ N  d$ f; w, H# J! w9 L
  142.                     print self.rcvdata;
    ; J$ T\" o0 H\" M
  143.                     mylock.acquire() 7 M$ ~0 j3 \1 O  i  ?3 p1 M! T
  144.                     self.rcvdata = '';& a' P, G; U' U8 J. H
  145.                     mylock.release()
    ) f) @) Q% X2 H( }3 ^9 Y  T
  146.                 #print_hex(snddata);
    8 o3 ?1 m\" l6 H: u4 g+ l* m# r
  147.                
    2 ?. v4 `8 v, H! Q: K/ B
  148.             except Exception, ex:3 F, L! J- s/ W2 s5 `) [# q
  149.                 print str(ex);
    6 a! t% e' ^9 G2 [# h* _
  150.         self.waitEnd.set();- g8 M- n/ A! o/ t\" ?( t! \
  151.         self.alive = False;
    $ {& Q6 w  u0 v9 Z9 n

  152. ) A) N! ]\" E: O
  153.     def TcpClient(self):$ }- ]: x7 U* I! `% g
  154.         while True:; R, H& U; i! ?' |, t8 t4 i6 B
  155.             # 接收间隔
    / R  _  n0 h/ X( [! k- @  ?9 `0 s
  156.             time.sleep(0.1);+ T% r4 Q! I. O: j
  157.             self.connection = socket(AF_INET, SOCK_STREAM);) Y- O+ F! ~, }- z
  158.             self.connection.connect((Server_IP, int(Server_Port)));) H- r% ^1 Q. A, i! S* y9 n: R
  159.             print 'Connect to Server OK!';
    \" d. T) R/ w- J3 X$ O
  160.             self.snddata = '': Y3 E6 j$ `$ c+ e
  161.             self.rcvdata = ''; g& v6 K& P3 B& m( j3 q
  162.             while True:& l; y- ]; U8 \$ I% s# H
  163.             #读取客户端套接字的下一行
    7 n& h0 i$ o4 T$ h) |\" J
  164.             data = self.connection.recv(1024)7 p) y# R% r) T' h, F
  165.             #如果没有数量的话,那么跳出循环$ g6 W; @0 L: k7 o$ Y& {9 t
  166.             if not data: break# v* e6 e! W9 T, a# W* k1 s
  167.             #发送一个回复至客户端
    1 g; Q: _' e7 |- C, C9 @2 ~4 L
  168.             mylock.acquire()
    ) G! D$ ^) y6 w* o- B1 }5 i3 i
  169.             self.snddata = ''1 _, f0 ?- T4 S
  170.             self.rcvdata = data
    2 o- z+ ^) U- W4 }: X  E& l
  171.             mylock.release()
    5 m  G  U- k: k  @\" V+ s  Q1 _
  172.             #connection.send('Echo=>' + data)
    4 Q) z) M3 o4 A% z' ~3 M* o+ s
  173.             self.connection.close(); w. G& j: j! |2 _+ u& R* H. d. S% R

  174. , {2 Y4 R- d  Q) a& L* z! j
  175.         self.waitEnd.set();, {. N5 J. T, p& ]8 L1 W
  176.         self.alive = False;: X: I/ c  T6 ~' `

  177. 9 B/ e- b+ h. B) m2 e: Q5 k- ~
  178.     def TcpSend(self):
    ) N1 ]/ Y* P0 f\" v. d& @% d
  179.         while True:4 {( E9 _! [  B9 M% s
  180.             # 接收间隔
    1 Z' u  u* A' w7 m$ {+ \
  181.             time.sleep(0.1);
    7 g# H8 g6 l& a+ n
  182.             while True:
    4 [& X+ H  o( @* Q' K: Z
  183.               time.sleep(0.1);
    ( I2 e6 a# F* ~9 G
  184.               try:
    7 U! ^% A9 {5 [: n) H4 c# p
  185.                 if not self.connection is None:7 K% ~2 O\" Z( h- [6 j* B
  186.                   if self.snddata != '':
    # X) T; e) s) U' r
  187.                     self.connection.send(self.snddata)
    ' b# R1 s4 Z: U\" F& C) t
  188.                     mylock.acquire() 3 q. J, M6 g1 C4 y5 d
  189.                     self.rcvdata = ''
    3 Y! G  y5 T9 ]/ o8 z
  190.                     self.snddata = ''
    1 X& C- t+ c4 V- d6 N3 `
  191.                     mylock.release()# U  N# Z- w; K( H* s; ~; S
  192.               except Exception, ex:( s: Q9 X$ f6 L: W
  193.             pass        . a2 V2 u6 Z' m/ k$ @3 i
  194.     def stop(self):! A  I/ z* t& `+ \- C; }; |
  195.         self.alive = False;* N1 V4 ]1 r8 J( k( j
  196.         self.thread_read.join();
    ! H0 @- h1 Z# _& z
  197.         if self.l_serial.isOpen():
    . Z( c' ]) P/ Z3 T; |
  198.             self.l_serial.close();# I7 _3 V\" @. _3 x

  199. 6 H1 ]4 E; w( \: U0 Q

  200. % G5 ^, v$ p' O/ R. U) W; G. b: B

  201. 0 ?: _) ]) l' \
  202. #测试用部分
    ! \& ^; U* R8 d) j7 c6 k( E
  203. if __name__ == '__main__':
    ( ?9 {, z$ {, H\" X' y
  204.     print 'Serial to Tcp Tool 1.00\n'
    9 {4 e; j' B8 S
  205.     print 'Author:yangyongzhen\n'
    4 P* q- Q% x$ h4 l3 B% w
  206.     print 'QQ:534117529\n'
    , y# N4 T7 c% X: v- Q7 C! P
  207.     print 'Copyright (c) **cap 2015-2016.\n'9 E* n\" n$ W- |+ S$ s/ @
  208. 3 ]; g1 P; J0 S7 q6 B# M
  209.     Server_IP = raw_input('please enter ServerIP:')
    $ ]9 ]: R' ?  |
  210.     print 'Server_IP: %s' %(Server_IP)4 s4 {' I# G$ l+ X) L' n8 l7 o; x6 s
  211.     Server_Port = raw_input('please enter ServerPort:')% a& _0 E6 u3 L  y# V* m
  212.     print 'Server_Port: %s' %(Server_Port)6 I2 C2 b+ o. `
  213.     com =raw_input('please enter com port(1-9):')
    1 u, n1 Y/ J; W& p
  214.     rt = ComThread(int(com)-1);  Z8 k+ d& O  M3 r9 z
  215.     try:
    * W/ ]. o  P! U4 K7 M- P. q
  216.         if rt.start():1 l: J9 g/ T$ T% C1 B
  217.             rt.waiting();( K\" c7 I) A\" l. S  v
  218.             rt.stop();0 h, Y5 q. E7 o+ r2 T
  219.         else:
    ( R# S1 X$ x8 u
  220.             pass;            * J, S$ F! X: Z% t! w, ]
  221.     except Exception,se:
    4 B5 v+ G+ g0 c
  222.         print str(se);1 y9 k$ P9 O% G\" Q2 E
  223. ( U% R\" n( \6 a0 ~
  224.     if rt.alive:
    1 b. g) K7 X\" c  e8 G& L3 {
  225.         rt.stop();1 }- \0 `8 h0 Q& }9 Y' X
  226.     os.system("pause")- B1 V' M, n2 J1 F

  227. : V/ r( D+ E* |
  228.     print '';
    & N. t& o* ~  s  E, s; B0 [& C
  229.     print 'End OK .';
    % U0 P% H% n' u# n( E' i$ v! h! \
  230.     del rt;
复制代码

) D% w$ g7 q9 w8 ?  C
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-9-1 11:48 , Processed in 0.317394 second(s), 50 queries .

回顶部