QQ登录

只需要一步,快速开始

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

串口转tcp工具

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

1171

主题

4

听众

2749

积分

该用户从未签到

跳转到指定楼层
1#
发表于 2024-3-31 17:19 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
  1. #coding=utf-8
    - h! p4 U3 s& S% N) f4 B
  2. \" |3 T7 ]. A* [+ c1 I# x

  3. 5 E' b/ m( r, S7 i( ]8 l4 Z5 X
  4. import sys,threading,time;; Y) ]2 L' ]' [2 u
  5. import serial;: }9 }' V* P- ]# }! ^6 @, N+ S
  6. import binascii,encodings;; l) H# x% Y: w; B) R; z; I* P  R
  7. import re;- O) c; J- t3 k
  8. import os;  q, A. M/ R/ \' k) [2 _! V
  9. from socket import *1 @5 q0 G8 _9 [' p
  10. from struct import *;
    3 S/ f! g8 r4 p( p6 N: ]* t+ K! ~
  11. #from myutil import *;
    + X. a1 z' G7 l4 a! r- i% L
  12. #name: myutil.py
    8 }$ y' G' g- g! z7 i* c
  13. 5 F8 H; Y8 `5 E) q! j. ^+ C
  14. mylock = threading.RLock()
    ' F+ m' r* [5 O3 c4 z

  15. 0 R& J; r) i4 K& B6 P; p6 O
  16. Server_IP = ''
    : @0 m% W7 E/ [$ V& a+ |
  17. Srever_Port = ''4 t- O5 e3 }+ ]
  18. # h  u( r2 g! I7 J# F. u
  19. def print_hex1(s,prev='0x'):+ q7 Y. `& ~! O; U. t: |
  20.     for c in s:4 V4 W$ {0 S; {2 L# g4 ^
  21.         print '%s%02x' %(prev,ord(c)),
    , S7 ~  ]) K* Q/ V- N8 c
  22.     print: v- \. T( I+ u\" v3 q4 @
  23. def print_hex(s):
    % k$ z1 n$ F# Y$ Z% B8 i
  24.     for c in s:# m' {4 `- S, z6 Y: X
  25.       print '%02x' %(ord(c)),9 x3 j- H3 E% K: s9 _
  26.     print
    : n2 d( x\" A0 J4 M
  27. ( C9 `) z% ]# w' v\" H
  28. def hexto_str(s):
    0 D% s: s8 s- M# g
  29.   r =''( }7 z\" L, `$ N, b3 S, s3 A, v- F
  30.   for c in s:  T% p2 v$ |: r' v0 }/ p. L, ?
  31.     r += '%02x' %(ord(c))/ C8 C\" _; g0 o' |& e' g, u
  32.   return r
    ' a* J, {9 F! k  H. T6 S# r
  33. def strto_hex(s):; ^; w, v5 N0 V6 Q9 w
  34.   r = s.decode('hex')
    + S  U( r! [! ?, t1 e- }
  35.   return r: g5 f, y6 n' f- p$ r
  36. #''代表服务器为localhost\" }0 ]1 I5 L# c) `2 q! Z

  37. ) P9 C0 e( u* P4 c$ A! L! Z2 r
  38. #在一个非保留端口号上进行监听' l2 X! k+ s+ X( q- X
  39. ( `' u0 }# ~7 c
  40. 0 u3 O  ~4 e' Y8 c) `0 ^
  41. class ComThread:1 `/ T( K+ l5 e9 W0 V+ x
  42.     def __init__(self, Port=0):9 g! L1 }+ e/ q( U
  43.         self.l_serial = None;0 q$ W& A\" d8 s
  44.         self.alive = False;
    , P/ N3 X9 i# C2 b- r\" d
  45.         self.waitEnd = None;
    6 G' M- d: [/ F/ \
  46.         self.port = Port;
    % Q6 V* n9 A# c, g* h

  47. # g. y- l\" s9 C$ i
  48.         #TCP部分7 g7 \7 M% b* S. I
  49.         #self.sockobj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    / s/ S! u- h; }: E) ^\" p4 N
  50.         self.connection = None4 F# T  g2 u% j6 \- B4 x
  51.         #数据7 e9 x8 u0 J\" y
  52.         self.snddata = ''( A+ o. I% z! G' C0 i
  53.         self.rcvdata = ''- x6 x9 o% Y+ U2 O. ]1 w6 z: a# ]
  54. 4 M5 v1 N. N0 x
  55.     def waiting(self):
    & T3 t$ s/ `/ f
  56.         if not self.waitEnd is None:
    / E+ s: k\" j6 Q/ N( `
  57.             self.waitEnd.wait();, L* ^1 q\" O) a  @8 e8 e
  58. / M/ O. B, }, a. G. q
  59. # _5 ^9 {- A9 \- w; K
  60.     def SetStopEvent(self):& g$ v$ K$ h) p( I) q6 B
  61.         if not self.waitEnd is None:: ^$ z- j( A4 N* L3 L+ {6 t
  62.             self.waitEnd.set();
    ) [9 }* r! i3 n0 z4 ]7 C
  63.         self.alive = False;+ D5 P) H  j' H& e2 _- P* z8 I
  64.         self.stop();/ W+ F3 I1 @, R* X4 d+ A/ }8 y

  65. 9 M; ?* ~* {$ \- F: Y! U

  66. : ^- q+ I1 A$ O9 N- f6 h! t2 [
  67.     def start(self):
    ; b1 k8 t\" _& ]. s
  68.         self.l_serial = serial.Serial();- |. k* [. I% N2 }* F\" H& T. H# P
  69.         self.l_serial.port = self.port;6 c* Y# O8 J5 n% D
  70.         self.l_serial.baudrate = 115200;+ y\" E& B0 Q8 T2 @* t
  71.         self.l_serial.timeout = 2;  #秒
    , Z% t3 s; O+ h& _
  72.         self.l_serial.open();
    \" m% X$ s8 [$ D/ J/ i# d2 R: J8 h

  73. ' T* }; Q9 N4 x
  74.         if self.l_serial.isOpen():
    2 T8 g% O. M; ]/ b& n  U) @
  75.             self.waitEnd = threading.Event();1 j: i6 V% p, T
  76.             self.alive = True;
    * B, S. y8 u& T/ q5 G3 L
  77.             print 'open serial port %d ok!\n' %(self.port+1)
    * f1 O& @- Z3 n$ s) f8 L7 y7 ~. B' w
  78.             print 'baudrate:115200 \n'2 x7 ]# L! v\" n! w1 `& L1 E4 s
  79.             self.thread_read = None;( r+ s2 e* U1 @& F\" r
  80.             self.thread_read = threading.Thread(target=self.FirstReader);! V0 ~6 D8 B! |
  81.             self.thread_read.setDaemon(1);
    & ^) P, a6 R& i- X5 L, p
  82.             self.thread_read.start();
    / y6 _1 s8 X, J

  83. 9 ]5 R/ |7 b0 ^  z- D( M
  84.             self.thread_write = None;; h9 M0 |/ x1 e
  85.             self.thread_write = threading.Thread(target=self.FirstWriter);5 J8 h. y3 L! Y) D0 H3 Z, R
  86.             self.thread_write.setDaemon(1);, e4 M3 `; G+ Q/ A
  87.             self.thread_write.start();
    3 V( A, e( o  U- T0 h: `8 {

  88. 4 t) E9 G6 Y0 s$ Y
  89.             #TCP部分
    & c% b. c$ X* v5 @
  90.             self.thread_TcpClient = None;
    5 z  i: S8 j/ b- _
  91.             self.thread_TcpClient = threading.Thread(target=self.TcpClient);
    6 L( b. p' i9 q; l0 _2 H: _
  92.             self.thread_TcpClient.setDaemon(1);
    + J; {0 K/ n  B$ e, C
  93.             self.thread_TcpClient.start();
    : h1 M1 \$ F, R; H
  94. . u. C/ d) [% @8 t5 ~: k0 E* [  |5 F$ G
  95.             self.thread_TcpSend = None;
    0 A3 x2 I5 P( C' ~. Z' Y/ Z! C) P
  96.             self.thread_TcpSend = threading.Thread(target=self.TcpSend);
    : c  X( |. v: O
  97.             self.thread_TcpSend.setDaemon(1);) Z8 |' }  c. o+ z
  98.             self.thread_TcpSend.start();
    $ j' ^1 |7 [4 y% d$ b

  99. 0 q2 B2 [0 E\" g: i- d
  100.             return True;9 `2 B! U# v5 d8 ?\" J! N
  101.         else:! `& c- l7 F8 F& r  n2 q8 Z$ e' z
  102.             return False;2 R0 S1 C, ?\" L0 \
  103. , Q  _  V3 [# j6 e8 J

  104. 4 l/ {# I- C# v/ s, Y6 o# q2 _
  105.     def FirstReader(self):% {; S% {% |1 o. j  d
  106.         while self.alive:
    \" t2 ]' K! B$ V
  107.             # 接收间隔
    9 N0 F7 u  p- F. r# b
  108.             time.sleep(0.1);
    ) k! s4 ]9 ?( y) X
  109.             try:
    ; y% S: d9 F& U6 G: V/ g
  110.                 data = '';1 d* P/ s0 H2 `* R3 M. ?* [
  111.                 n = self.l_serial.inWaiting();
    - S# |8 H. c. B, f3 [
  112.                 if n:
    # R- B4 f6 i( U
  113.                     data = data+self.l_serial.read(n);# u! K4 f0 A& O' x) U4 a# O  F8 ?) C' s
  114.                     #for l in xrange(len(data)):6 n& k- t, I+ {# L3 G6 }* i( u) f* q
  115.                         #print '%02X' % ord(data[l]),; L9 `' J( i0 [% H% m
  116.                     # 发送数据2 Y- [9 r' ^# F4 j& ]5 x, h6 M
  117.                     print u'->请求:', r( i5 D4 w$ k4 }  v$ \
  118.                     print data;; V- @% c, D; e
  119.                     mylock.acquire() 4 B3 F\" Y9 l- z4 O6 @2 a1 [  Q
  120.                     self.snddata = data* P, r& ?$ g( W! _
  121.                     mylock.release()
    / }7 W7 I2 t: k  [6 r' x( m) l
  122.                     #print_hex(data);6 H! W' G6 {7 H6 H
  123.                
    ( x( ~* d5 l- A! r  d
  124.                     \" M; Q* k( O\" s3 }0 Y
  125.                 # 判断结束% m- u: D8 t% u# E2 S* V) I; w
  126.                
      h' J. c\" B' g6 w& C, d- V$ s
  127.             except Exception, ex:8 m% H. ]$ b4 E& d7 O4 r
  128.                 print str(ex);\" D- L7 A7 U5 ]1 T; l% t2 ^
  129.   P- @! `\" X+ Q4 V! x! q2 n# |
  130.         self.waitEnd.set();  z* F7 [) b8 {4 j' J
  131.         self.alive = False;+ X5 r+ i6 ^) l+ _  o+ k

  132. 4 M) i( q8 D8 `* ~! u9 A\" ?6 S; C
  133.     def FirstWriter(self):
    7 F5 L0 S: P5 @9 w5 \# Q: }
  134.         while self.alive:
    \" L- |7 B$ p* p' y
  135.             # 接收间隔) O* m& Y6 W! l: y
  136.             time.sleep(0.1);
    ( W* P1 l& L# |- h
  137.             try:
    \" n: z: N+ l$ I\" k' O2 m) V
  138.                 #snddata = raw_input('\nenter data send:\n')
    * r\" j' e. }! k: _5 e+ ]: m9 ?1 r
  139.                 if self.rcvdata!='':
    ) `$ Y( v: A) d
  140.                     self.l_serial.write(self.rcvdata);
    9 t* \\" A* L: S3 r  B! W- V\" G
  141.                     print u'-<应答:'
    + z\" [1 r; d  [$ M7 h, s
  142.                     print self.rcvdata;) b. [8 {) }  C2 T8 D9 }) u: ]! Z
  143.                     mylock.acquire() 1 m9 E0 k0 X9 B
  144.                     self.rcvdata = '';0 j- ~0 m8 r8 V: r# o$ [
  145.                     mylock.release()
    % q\" l& q+ E3 O: Y\" H. n0 A
  146.                 #print_hex(snddata);
    7 g/ T1 B9 |5 t# D
  147.                
    ( \9 O7 Y3 x* y# ?
  148.             except Exception, ex:6 O, d0 A$ j- k  P  |9 H% Q0 e' i+ G
  149.                 print str(ex);
    . K5 g' x: q1 s% _\" A
  150.         self.waitEnd.set();$ b0 C2 ]1 [% f, j- ^$ ~% ^- l
  151.         self.alive = False;4 n# V: S. B7 q7 f- O! z$ J) F

  152.   ?( v' A$ k# n' \% l0 \- ]
  153.     def TcpClient(self):
    6 P6 m  n& H8 n5 g0 l# Z0 y
  154.         while True:
    . [1 u5 m: z  v8 g7 p
  155.             # 接收间隔! Z$ g; N* H9 b  {2 `
  156.             time.sleep(0.1);
    ' a/ B' r6 z8 b0 K- V3 a' w
  157.             self.connection = socket(AF_INET, SOCK_STREAM);- f; T. o# k2 R( u/ T
  158.             self.connection.connect((Server_IP, int(Server_Port)));; D# d7 G: f/ z9 R: s1 n% E
  159.             print 'Connect to Server OK!';5 |* i! e, q5 C
  160.             self.snddata = ''
    3 z) A; P6 X+ ]
  161.             self.rcvdata = ''
    + T, I7 t: p+ k7 T
  162.             while True:8 I9 a' m) I4 _3 B! f
  163.             #读取客户端套接字的下一行
    0 ^$ w2 ^& _8 L
  164.             data = self.connection.recv(1024)
    ( Q8 w+ h& d: ]
  165.             #如果没有数量的话,那么跳出循环# g4 k0 E& ?6 o) F7 v3 M3 U7 _
  166.             if not data: break+ ^* k% e8 `5 h
  167.             #发送一个回复至客户端; j$ ~1 c# \. c1 X; P8 s9 K
  168.             mylock.acquire() # K% F1 l' a0 }# Z) s0 p! l
  169.             self.snddata = ''
    6 T. p0 K' a( _
  170.             self.rcvdata = data2 A8 j) g+ h- E4 W4 `! H3 }- a
  171.             mylock.release()
    7 m8 ~9 P9 l\" r( `; Q+ _2 Z
  172.             #connection.send('Echo=>' + data)! j; \. G5 A. [+ P7 a- \9 Y, j
  173.             self.connection.close()' B7 U1 B7 P5 b+ s- T/ o5 W

  174. 9 E4 Y$ o' h% {\" D7 o\" d
  175.         self.waitEnd.set();
    2 w& x2 k1 u9 q! K
  176.         self.alive = False;
    1 r) f) Q. \1 j7 n5 h
  177. 9 C7 P\" Z; c! E3 C
  178.     def TcpSend(self):
    6 }- ]. M\" F$ V  S9 T; O3 R
  179.         while True:6 E4 l) k7 d5 Z6 |
  180.             # 接收间隔
    0 s: J/ `# y. D
  181.             time.sleep(0.1);
    6 \1 f& E# C5 C# x0 I
  182.             while True:\" k6 j0 {4 V8 f; e% H
  183.               time.sleep(0.1);7 u% p/ o: T6 h' r  p
  184.               try:
    5 }! S& i# v: z
  185.                 if not self.connection is None:
    , B6 f( T' c- r
  186.                   if self.snddata != '':
    # c% R$ e3 y/ J
  187.                     self.connection.send(self.snddata)$ u1 Z6 `+ |/ M. Q
  188.                     mylock.acquire()
    0 s0 J# P7 |- r4 f+ n) k; }
  189.                     self.rcvdata = ''. T9 R9 Z/ i  F5 U) J
  190.                     self.snddata = ''/ f0 M* z) J6 W$ m; b  g\" i
  191.                     mylock.release()! p9 U9 }- C0 T2 J0 c
  192.               except Exception, ex:7 l0 l/ j) f\" w
  193.             pass        
    & @7 c$ S\" O\" G7 F/ `$ r- r1 x
  194.     def stop(self):
    & m0 M3 Z6 A3 n
  195.         self.alive = False;7 N: l+ R7 b9 w- ]) K* ?
  196.         self.thread_read.join();
    3 O! D2 C9 l9 c  c( Q\" s5 h
  197.         if self.l_serial.isOpen():4 G5 q\" Q- M% l
  198.             self.l_serial.close();
    1 F) L7 O\" Q, E% n! y# @0 a

  199.   V* {8 j$ i+ c9 T# F
  200. & |! g# v# q\" D( p: k2 b
  201. \" |; S8 H# X4 E: p1 k
  202. #测试用部分
    + \( T, V) a4 |, b. b
  203. if __name__ == '__main__':
    ) }9 K+ o* V7 w, P, }( }3 _% e
  204.     print 'Serial to Tcp Tool 1.00\n' 4 c! o\" f\" h% W  a% s) v\" H
  205.     print 'Author:yangyongzhen\n'
    ) E  Y3 }: m- O( Z
  206.     print 'QQ:534117529\n'
    , ]& Q* c7 _2 F+ d. H/ e
  207.     print 'Copyright (c) **cap 2015-2016.\n'  t- k+ [; k: p- W! |1 a( |7 Y

  208. : k  K1 P# r- a$ v+ K! D
  209.     Server_IP = raw_input('please enter ServerIP:')
    ' G7 x/ I. j/ `2 \% I) ]; \
  210.     print 'Server_IP: %s' %(Server_IP)' F; Y; b  d3 }3 l8 N
  211.     Server_Port = raw_input('please enter ServerPort:')
    % l; {, L/ v9 J+ C\" C% k# C
  212.     print 'Server_Port: %s' %(Server_Port)( t! h! x+ Y; _6 j
  213.     com =raw_input('please enter com port(1-9):')
    \" j; o\" Q% W; W2 m4 m9 p/ V
  214.     rt = ComThread(int(com)-1);
    9 J7 m1 `* S$ S& s- h* d
  215.     try:
    \" E3 F8 H\" u4 ?
  216.         if rt.start():$ [: a- s1 V: Y
  217.             rt.waiting();& W8 V4 ]/ r( O# H4 [+ x
  218.             rt.stop();% F1 k0 L) B* e9 a
  219.         else:
    : @* `3 b2 Q, O5 P
  220.             pass;            / H$ z, v8 _3 `' n
  221.     except Exception,se:# `+ N6 s; V* g+ l' q
  222.         print str(se);
    0 v; f. H3 ~2 G3 D% p, E1 u

  223. ( g5 g. [9 ^' U) d
  224.     if rt.alive:
    0 E/ N+ p' o: G; z1 \, ~
  225.         rt.stop();) V2 k1 G/ n# y) v# I4 |) s, v
  226.     os.system("pause")
    9 ?1 z# q* `6 j
  227.   A) |& R: w3 E) @! v7 T. r5 q+ {4 Y5 l5 h
  228.     print '';/ z/ J; Z$ L# b/ C5 Q$ F
  229.     print 'End OK .';+ Q5 @2 t7 ?6 {\" g$ @: Y/ M
  230.     del rt;
复制代码

# C' [1 |8 j# b+ c  z" p2 o. n
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, 2025-5-12 10:54 , Processed in 0.304574 second(s), 50 queries .

回顶部