QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1189

主题

4

听众

2934

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
      V, ^$ B4 H6 E: s
  2. 6 z\" U7 \; z$ h7 W  f' ~! ^
  3. 9 M! D! A/ h8 {3 g( f& e
  4. import sys,threading,time;* P! u2 D/ N* z  s0 g
  5. import serial;
    7 i. J% ?3 o& w1 q, f
  6. import binascii,encodings;: Q: |9 [; y: q5 ]) k\" c
  7. import re;
    2 d* n0 v, U6 q4 d; x6 \
  8. import os;
    1 A. f2 i& C% ^$ H1 M! H
  9. from socket import *% V\" l6 O0 Z0 v3 `8 v8 W
  10. from struct import *;3 d; t( J6 Z+ U; [  u
  11. #from myutil import *;$ c* @' ?/ |* I: _
  12. #name: myutil.py6 q) s' `& ?+ w) M5 }4 `
  13. & `9 ]7 R, ^' [
  14. mylock = threading.RLock()
    & ?, m; m' D& l4 o

  15. # I. @; d5 H9 }
  16. Server_IP = ''6 a( ?) P6 g/ d0 V$ R
  17. Srever_Port = ''
    7 @4 U1 i  ^4 w, o% b
  18. \" ^- ^/ H3 u3 T8 F! X. v# e
  19. def print_hex1(s,prev='0x'):; }8 ^\" {( k6 r( P1 {$ L: [
  20.     for c in s:
    $ y6 Q/ x) J  @1 q) g. D+ z
  21.         print '%s%02x' %(prev,ord(c)),
    ; V3 P9 Y  A- e* T8 I/ D5 D1 R
  22.     print
    % k+ s  k1 k\" J$ j6 `- q3 x
  23. def print_hex(s):- O2 ^5 Z- K  k; F
  24.     for c in s:
    ! q( V) a8 D\" A9 `
  25.       print '%02x' %(ord(c)),( i2 `2 |\" D8 W1 D7 i* j\" R, B
  26.     print
    ) F+ Z1 ^1 U: O5 L  Q) ]
  27. * N6 N/ b% M\" Y
  28. def hexto_str(s):
    : Y0 H% W1 D% ?9 j$ G% w
  29.   r =''
    2 T; N1 B6 a3 a\" T
  30.   for c in s:
    3 J\" P5 _; i: `4 Q
  31.     r += '%02x' %(ord(c))
    ; q\" f# t0 S5 ~4 N
  32.   return r
    \" ^! C: x8 B, r6 h( X  s, ?
  33. def strto_hex(s):
    5 T% D9 c) k5 O, p
  34.   r = s.decode('hex')9 A0 ^  k4 d7 n\" K$ ]1 `! w\" Q3 ~
  35.   return r; [0 V' o1 }4 V- x8 ^
  36. #''代表服务器为localhost
    : F$ t7 n\" l$ [2 q

  37. . i6 T\" L: ]; R3 t) W* r; X
  38. #在一个非保留端口号上进行监听
    & @! t& Q5 Q! o: L  R' l

  39. # x+ `& c8 S9 r- P8 c6 o( L6 m

  40. 0 x+ n. m9 k5 |) x1 {6 u
  41. class ComThread:
    5 W0 c- l* [* _$ X' K0 ^* _+ s1 U. a
  42.     def __init__(self, Port=0):
    ! ~  q2 o9 @, o1 V+ t6 \0 \
  43.         self.l_serial = None;
    2 J0 Z* R* `9 E( O* m. `
  44.         self.alive = False;/ ~) j/ W1 P9 Y& A7 f
  45.         self.waitEnd = None;
      k) g6 [, h. A& c& ]1 T7 \4 K\" \
  46.         self.port = Port;* _( b) ]4 b2 ]+ I

  47. 6 e( i! k) S) ]
  48.         #TCP部分
    8 t6 o9 ?7 j% X. N& d
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)' j: W\" f# N% }3 b, j* x
  50.         self.connection = None
    6 J' J, L( v2 U6 P3 w7 F
  51.         #数据. v\" g9 o4 r6 k7 i; Z: v
  52.         self.snddata = ''
    9 f6 f$ c0 R# p+ P6 `; P  u
  53.         self.rcvdata = ''- G& y% @8 W. [# D

  54. ! w- [6 {9 z. o$ J. I
  55.     def waiting(self):
    , ~  a: C0 I' W% P0 D1 ?, i/ k
  56.         if not self.waitEnd is None:
    ( @. H# N6 \, o/ u
  57.             self.waitEnd.wait();3 i3 B4 u0 d* h) a  W

  58. ! R# R0 t  `* F6 u5 p% x
  59. ! _0 X, t) Z8 U, o& ~6 p
  60.     def SetStopEvent(self):
    + A  @- |3 O) z8 G\" V' v
  61.         if not self.waitEnd is None:
    0 [0 c  b6 J$ I9 h. o& U2 c# c+ h4 ?
  62.             self.waitEnd.set();
    $ k) D# X% H$ _* v5 c
  63.         self.alive = False;
    2 D& \4 ^4 G$ b  G
  64.         self.stop();
    9 C6 w' G  j2 u  ~* c4 W

  65. ( k' {/ U/ y- J& J3 w
  66. + r! ]1 d; q8 [
  67.     def start(self):0 u( f) L( S. X/ I5 ?6 }' D+ P; |
  68.         self.l_serial = serial.Serial();
    5 x/ C5 g- s# P
  69.         self.l_serial.port = self.port;6 c) H, v* j* }
  70.         self.l_serial.baudrate = 115200;+ K3 }8 n% W4 T
  71.         self.l_serial.timeout = 2;  #秒* q3 M/ G$ R8 q: ^
  72.         self.l_serial.open();7 H+ P& P8 t* t& b1 u6 W7 G3 T
  73.   l  _& W1 [: x7 b3 s* N9 m! p
  74.         if self.l_serial.isOpen():/ G% z# y! s\" j2 N6 h. M) L
  75.             self.waitEnd = threading.Event();
    + v; S) o\" r0 V+ O; o9 `8 M5 l
  76.             self.alive = True;\" t' S( L% r+ v6 E\" O! V$ F
  77.             print 'open serial port %d ok!\n' %(self.port+1), n* U7 W0 I\" ]5 o& l4 s
  78.             print 'baudrate:115200 \n'
    . k0 J. ^' ?5 N! q5 r( Z
  79.             self.thread_read = None;
    ; ]\" G% K. V3 |\" |7 ^
  80.             self.thread_read = threading.Thread(target=self.FirstReader);$ z) q/ b$ m2 r; z
  81.             self.thread_read.setDaemon(1);
    1 l  I' n( M\" [& y) {7 @
  82.             self.thread_read.start();2 p' N7 U& s  w\" c6 S# B& J
  83. 7 U& f: ]: F4 g* v
  84.             self.thread_write = None;) ]7 C# _6 W* u* J% V
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);+ h8 q4 I  c6 n9 }' c& H7 m1 d
  86.             self.thread_write.setDaemon(1);* j( g$ F5 Z1 _. j; k9 G
  87.             self.thread_write.start();3 I- g; Q4 ~0 P; ?5 ^/ U
  88. 3 b4 d1 B4 F- a. r1 m+ Y0 [6 `! u
  89.             #TCP部分
    9 y/ {! a+ x& D; ]1 M
  90.             self.thread_TcpClient = None;) s* Q: v& A7 E% M
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);0 I# M1 x8 @0 Z+ \6 M
  92.             self.thread_TcpClient.setDaemon(1);1 {% s, w2 J% x+ p0 u
  93.             self.thread_TcpClient.start();& ]  N1 J5 N  L5 f! S$ ?4 b$ ]- H

  94. 2 [\" A4 H: O1 ~2 w
  95.             self.thread_TcpSend = None;
    5 I' X' J- E3 d, L, Q
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);\" {. Y, N+ M\" s\" [5 p9 L
  97.             self.thread_TcpSend.setDaemon(1);
    2 v/ H* t: k/ l5 ~8 Q. e  `
  98.             self.thread_TcpSend.start();
      Y; F* d* O- h0 F( C! ?

  99. % k8 C  X9 c0 n6 T( h
  100.             return True;
    ) j1 O3 w. v3 K/ Q
  101.         else:+ Y4 C& F# I% V( f
  102.             return False;' p/ w% O( v/ _: G) G7 I/ M

  103. 6 n( a: X. K& E8 P\" V1 y, e9 ]
  104. 0 ?! i# f5 S6 `  ?1 W
  105.     def FirstReader(self):, z1 H$ r* F\" g* p& G0 }2 [
  106.         while self.alive:
    # [\" S, p# u  t9 H2 F# F# w
  107.             # 接收间隔
    / \# S! l3 B1 H# @6 U
  108.             time.sleep(0.1);
    ' A0 L% T( \* O) }1 p$ ]
  109.             try:% ?1 b% i; B8 A1 i2 I3 I! |
  110.                 data = '';9 _; r% `  P' r$ I6 M# j- D
  111.                 n = self.l_serial.inWaiting();: B( V' g6 f8 [+ {) I; D4 Q
  112.                 if n:+ g( j& _! y% m: b; V3 e; i2 W# [
  113.                     data = data+self.l_serial.read(n);# R+ \, k4 |, s. ^. |1 g- ^+ @1 D
  114.                     #for l in xrange(len(data)):
    $ e0 W1 I& U, a0 J. P
  115.                         #print '%02X' % ord(data[l]),
    ) I' {) d8 O! e6 O
  116.                     # 发送数据
    # Y5 N0 Y1 X$ y
  117.                     print u'->请求:'5 X* [  H) W9 \, \8 C7 N
  118.                     print data;
    8 e7 I5 _% }4 z, q2 q( I, f
  119.                     mylock.acquire()
    . V, J/ y. ]# U
  120.                     self.snddata = data
    . }2 Y1 V# C8 k0 x. C  P
  121.                     mylock.release()7 K9 O- Y! F5 f7 P( J
  122.                     #print_hex(data);3 x6 A$ i+ [\" M% F
  123.                
    ' G& A+ w5 T& S/ _) J% x  L
  124.                     ! s, q\" W. t+ {- d# M; p6 v) }8 u
  125.                 # 判断结束! O7 L. `9 z4 R7 j
  126.                ' E% i0 q; V4 q
  127.             except Exception, ex:
    0 W) i+ S, j  j/ C\" Y# P+ U1 }. K
  128.                 print str(ex);
    3 j# X( m- {! c) P0 f9 V+ e
  129. 3 F% ?- N: F3 u3 M
  130.         self.waitEnd.set();
    . ^5 L2 N/ _: r% ]1 {& O; C
  131.         self.alive = False;: S) @: Z. p2 G: l8 L

  132. # T# m5 A( e) |, E. p5 z* a
  133.     def FirstWriter(self):
    + M9 v% }: P* a  y* C: r9 S
  134.         while self.alive:
    & E! a. Q8 U- s9 U2 r2 {
  135.             # 接收间隔3 n- Q+ J4 M* n' D
  136.             time.sleep(0.1);& k4 c& {6 J% E* F: h, ]4 m$ k
  137.             try:7 u( G- f- N( p. Z7 B
  138.                 #snddata = raw_input('\nenter data send:\n')
    % ?3 r* |: Y9 f+ v0 n, B
  139.                 if self.rcvdata!='':
    2 Q$ d# C& f6 ?# j! o. Z8 d% k- W
  140.                     self.l_serial.write(self.rcvdata);
    & e' K, `: E0 f! [' N! ]
  141.                     print u'-<应答:'% y3 w* X  m' v\" S
  142.                     print self.rcvdata;6 j6 o7 K& l% _3 H7 _
  143.                     mylock.acquire() 9 u& A0 k- j* e5 [) v! d* x
  144.                     self.rcvdata = '';
    5 d' O+ Z9 Q0 Z5 [2 ?1 p, w5 P
  145.                     mylock.release()
    1 R0 X3 v% I/ a- n$ k% S
  146.                 #print_hex(snddata);
    . f- X6 F9 f2 ]5 X( s/ G
  147.                
    , J8 U, b, b, B6 ?' N/ u
  148.             except Exception, ex:9 r6 V0 I# P& v- D5 N' {/ O
  149.                 print str(ex);) V0 L, h) ?; x$ n
  150.         self.waitEnd.set();
    * E9 }2 g; a% g% H# h  S
  151.         self.alive = False;9 @2 R- ]! X0 `
  152. \" ]6 W; @8 N+ x3 K
  153.     def TcpClient(self):
      I, F# Z# W4 l- s
  154.         while True:4 `- b( Z) w  l
  155.             # 接收间隔
    9 Q' j2 a  @' L/ H5 L
  156.             time.sleep(0.1);, }+ r4 i: e- A\" t
  157.             self.connection = socket(AF_INET, SOCK_STREAM);0 {2 F# N7 a6 H; [8 Z9 Y! S
  158.             self.connection.connect((Server_IP, int(Server_Port)));) j9 P2 r/ r& n$ t% p) A
  159.             print 'Connect to Server OK!';
    \" U$ G% F* u6 C0 |$ D' ~! T
  160.             self.snddata = ''
    9 I  {( G& C# Y; ]  S
  161.             self.rcvdata = ''
    & f4 E9 o1 @\" D% Q& V
  162.             while True:# G# Y8 V) X! w
  163.             #读取客户端套接字的下一行, ]& C; w; O/ z9 N/ q
  164.             data = self.connection.recv(1024)
    6 A$ d, b1 h# r0 A+ ~' X& C
  165.             #如果没有数量的话,那么跳出循环
    & g2 ]  T& g: [$ {9 G! U\" u
  166.             if not data: break
    / Z+ n5 Z0 R( z0 e9 o0 x) Q. d! J
  167.             #发送一个回复至客户端
    1 J5 D\" [8 R. M% K1 t( y8 e
  168.             mylock.acquire() 5 w- U6 |- K7 i. O2 f& |* o2 u* T
  169.             self.snddata = ''5 ?/ C% G7 r- S( I( ]' A; V5 b
  170.             self.rcvdata = data
    # x3 Z& W; A) [! e0 I
  171.             mylock.release()0 v( P2 R/ u. ~) U3 Q
  172.             #connection.send('Echo=>' + data)( r9 s2 s$ m. `9 W1 b
  173.             self.connection.close()
    2 ]3 c% @4 [4 F6 E5 P2 ]& @- f0 y% b

  174. 0 q, l% e0 X6 F3 V2 O1 M
  175.         self.waitEnd.set();
    2 Q$ l! C* a$ H; v  H$ ]6 B* Y1 Q
  176.         self.alive = False;+ r6 b' i3 L# I' R$ A; t4 f  {
  177. \" v0 \6 _6 u1 K5 z( r
  178.     def TcpSend(self):) \& Z& n6 p: v2 q8 z
  179.         while True:& r2 R$ ^# G( o4 |% [+ o$ R' `
  180.             # 接收间隔
      r* {% V0 @/ m: q- B
  181.             time.sleep(0.1);- g0 n% e( M+ ~7 z& n1 {
  182.             while True:/ ?! A- [\" z) F0 v# T) j
  183.               time.sleep(0.1);( ^$ u! ]* m3 A7 `8 k
  184.               try:
    . R- z\" D0 R) n9 D0 L
  185.                 if not self.connection is None:$ [* a, q3 }; e\" B
  186.                   if self.snddata != '':
    1 ^! N0 \+ K! c! \/ S# ^& u$ p6 B+ J\" _
  187.                     self.connection.send(self.snddata)8 V  l0 B: N  b; Q* F% L1 Y1 Z
  188.                     mylock.acquire()
    1 d& f! L( D1 L; P# V* L
  189.                     self.rcvdata = ''
    ! n2 g7 g7 m9 X, Q# q
  190.                     self.snddata = ''4 s1 T) r7 s( t9 Z4 y+ d
  191.                     mylock.release()& q# S5 V& k5 [3 d6 w; c- ]
  192.               except Exception, ex:+ e, U# k' {( @0 G  |
  193.             pass        5 Q' |! l% k2 o
  194.     def stop(self):# M2 e0 U* [8 G2 b8 S
  195.         self.alive = False;# a4 k7 ?8 G' G3 {4 w! T1 P  \
  196.         self.thread_read.join();
    . y  z2 I6 b: t4 P! D0 n
  197.         if self.l_serial.isOpen():
    % m* x' o9 u' x1 w# Z\" x) [
  198.             self.l_serial.close();/ I7 T- x6 [$ w1 y\" a$ J2 \& o+ N

  199. : t4 j8 a# V3 O* ?0 `0 B  u

  200. 0 _3 r# R( s\" [3 @) f' j% Y

  201. , t) F0 u/ h# m6 T6 r$ R/ n  g
  202. #测试用部分, \3 N$ K* }8 F# G% x/ z
  203. if __name__ == '__main__':
    . L9 F# D. O; I
  204.     print 'Serial to Tcp Tool 1.00\n' 7 q: W. U' c* s9 O\" _/ q  ^
  205.     print 'Author:yangyongzhen\n'/ M( y. P4 B% w' F( Q
  206.     print 'QQ:534117529\n'
    3 e% v% w, P# i5 Z, V: K0 {
  207.     print 'Copyright (c) **cap 2015-2016.\n'9 X/ x5 B5 p; F3 z6 T9 u/ `' o

  208. 2 y7 q5 j8 h  F$ q# v
  209.     Server_IP = raw_input('please enter ServerIP:')
    3 w\" E% C( Z, j# ~6 K8 V
  210.     print 'Server_IP: %s' %(Server_IP)
    ) h9 ^& _! N$ S9 r9 f
  211.     Server_Port = raw_input('please enter ServerPort:')1 Q6 Q* ?- _; r  n# ]% ^6 u
  212.     print 'Server_Port: %s' %(Server_Port)
    + m0 J, u* R$ `6 T
  213.     com =raw_input('please enter com port(1-9):')* X3 B, n' b$ N2 Y/ V
  214.     rt = ComThread(int(com)-1);) `) `) ]8 ~( a0 V8 p
  215.     try:
    6 c5 ^3 y, e% D5 G4 N+ T3 W& O
  216.         if rt.start():6 i# n5 `- q6 u9 D: _
  217.             rt.waiting();
    5 R' j: W5 J9 X/ \& X& I; D- e
  218.             rt.stop();
    * ^1 o1 _+ u$ E2 Y$ p3 U: t
  219.         else:
    - h& Z4 ^5 @) b  R+ z' O' s( v
  220.             pass;            
    + s1 e- Z6 I9 }' b/ l
  221.     except Exception,se:+ @( K2 H6 m* f$ s9 W
  222.         print str(se);
    $ q8 U\" j# @* l. S+ ~. T2 Q

  223. # N( M0 I! `; E  q
  224.     if rt.alive:9 F/ b+ f- |. S) [* s% R, B) e$ T
  225.         rt.stop();
    ) {1 H\" h: g) w: t6 H
  226.     os.system("pause")
    # [* Z3 }0 o2 ]$ j$ r
  227. 6 j* e) A% d. O
  228.     print '';% f\" c  A\" Y# c5 S9 F+ h3 V3 D
  229.     print 'End OK .';
    * J0 M: ^4 L$ _
  230.     del rt;
复制代码
1 r) `0 ^2 l! h9 J6 ], b
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 02:13 , Processed in 0.455151 second(s), 51 queries .

回顶部