pyserial串口debug工具

关于Python和pip在Windows环境下的安装方法,可以参考http://www.tuicool.com/articles/eiM3Er3

运行cmd:输入pip install pyserial,安装pyserial模块。这里已经安装过该模块,如下:

实现的功能:开1M波特率打印串口接收到的信息。运行脚本之前,将USB转串口工具插入PC USB口;打开设备管理器,查看需要设置哪个COM口;脚本中增加脚本参数解析,运行脚本时指定串口号,波特率默认1M,也可以参数指定波特率,按Ctr+C退出脚本运行。

下面是serial test.py脚本:

  1 #!/usr/bin/python
  2 #encoding: utf-8
  3 import serial, time, argparse
  4 import ctypes, sys, os
  5 from sys import exit
  6 
  7 #///// 脚本命令行参数指定 ///// 
  8 #运行脚本时,需要指定参数,例如1、 python serial_test.py --port COM8 --baudrate 9600
  9 #                         2、 python serial_test.py --port COM8 
 10 # create parser
 11 parser = argparse.ArgumentParser(description="My serial")
 12 # add expected arguments
 13 parser.add_argument('--port', dest='port', required=True)
 14 parser.add_argument('--baudrate', dest='baudrate', required=False)
 15 # parse args
 16 args = parser.parse_args()
 17 #PORT = '/dev/tty.usbserial-A7006Yqh'
 18 PORT = args.port
 19 BAUDRATE = 1000000 #default baudrate:1M
 20 if args.baudrate:
 21     BAUDRATE = args.baudrate
 22   
 23   
 24   
 25 #///// font color concerned /////    
 26 STD_INPUT_HANDLE = -10
 27 STD_OUTPUT_HANDLE = -11
 28 STD_ERROR_HANDLE = -12
 29  
 30 # 字体颜色定义 ,关键在于颜色编码,由2位十六进制组成,分别取0~f,前一位指的是背景色,后一位指的是字体色
 31 #由于该函数的限制,应该是只有这16种,可以前景色与背景色组合。也可以几种颜色通过或运算组合,组合后还是在这16种颜色中
 32  
 33 # Windows CMD命令行 字体颜色定义 text colors
 34 FOREGROUND_BLACK = 0x00 # black.
 35 FOREGROUND_DARKBLUE = 0x01 # dark blue.
 36 FOREGROUND_DARKGREEN = 0x02 # dark green.
 37 FOREGROUND_DARKSKYBLUE = 0x03 # dark skyblue.
 38 FOREGROUND_DARKRED = 0x04 # dark red.
 39 FOREGROUND_DARKPINK = 0x05 # dark pink.
 40 FOREGROUND_DARKYELLOW = 0x06 # dark yellow.
 41 FOREGROUND_DARKWHITE = 0x07 # dark white.
 42 FOREGROUND_DARKGRAY = 0x08 # dark gray.
 43 FOREGROUND_BLUE = 0x09 # blue.
 44 FOREGROUND_GREEN = 0x0a # green.
 45 FOREGROUND_SKYBLUE = 0x0b # skyblue.
 46 FOREGROUND_RED = 0x0c # red.
 47 FOREGROUND_PINK = 0x0d # pink.
 48 FOREGROUND_YELLOW = 0x0e # yellow.
 49 FOREGROUND_WHITE = 0x0f # white.
 50 FOREGROUND_INTENSITY = 0x08 # 加亮
 51 
 52 # Windows CMD命令行 背景颜色定义 background colors
 53 BACKGROUND_BLUE = 0x10 # dark blue.
 54 BACKGROUND_GREEN = 0x20 # dark green.
 55 BACKGROUND_DARKSKYBLUE = 0x30 # dark skyblue.
 56 BACKGROUND_DARKRED = 0x40 # dark red.
 57 BACKGROUND_DARKPINK = 0x50 # dark pink.
 58 BACKGROUND_DARKYELLOW = 0x60 # dark yellow.
 59 BACKGROUND_DARKWHITE = 0x70 # dark white.
 60 BACKGROUND_DARKGRAY = 0x80 # dark gray.
 61 BACKGROUND_BLUE = 0x90 # blue.
 62 BACKGROUND_GREEN = 0xa0 # green.
 63 BACKGROUND_SKYBLUE = 0xb0 # skyblue.
 64 BACKGROUND_RED = 0xc0 # red.
 65 BACKGROUND_PINK = 0xd0 # pink.
 66 BACKGROUND_YELLOW = 0xe0 # yellow.
 67 BACKGROUND_WHITE = 0xf0 # white.
 68 BACKGROUND_INTENSITY = 0x80 # 加亮
 69 
 70 class Color:
 71     ''' See http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winprog/winprog/windows_api_reference.asp
 72     for information on Windows APIs. - www.bitsCN.com'''
 73     std_out_handle = ctypes.windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)
 74     def set_cmd_color(self, color, handle=std_out_handle):
 75         """(color) -> bit
 76         Example: set_cmd_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY)
 77         """
 78         bool = ctypes.windll.kernel32.SetConsoleTextAttribute(handle, color)
 79         return bool
 80     def reset_color(self):
 81         self.set_cmd_color(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE)
 82     def print_red_text(self, print_text):
 83         self.set_cmd_color(FOREGROUND_RED | FOREGROUND_INTENSITY)
 84         print(print_text)
 85         self.reset_color()
 86     def print_green_text(self, print_text):
 87         self.set_cmd_color(FOREGROUND_GREEN | FOREGROUND_INTENSITY)
 88         print(print_text)
 89         self.reset_color()
 90     def print_blue_text(self, print_text):
 91         self.set_cmd_color(FOREGROUND_BLUE | FOREGROUND_INTENSITY)
 92         print(print_text)
 93         self.reset_color()
 94     def print_yellow_text(self, print_text):
 95         self.set_cmd_color(FOREGROUND_YELLOW | FOREGROUND_INTENSITY)
 96         print(print_text)
 97         self.reset_color()
 98     def print_red_text_with_blue_bg(self, print_text):
 99         self.set_cmd_color(FOREGROUND_RED | FOREGROUND_INTENSITY| BACKGROUND_BLUE | BACKGROUND_INTENSITY)
100         print(print_text)
101         self.reset_color()   
102 
103 
104 #///// Serial concerned /////          
105 #initialization and open the port
106 #possible timeout values:
107 #    1. None: wait forever, block call
108 #    2. 0: non-blocking mode, return immediately
109 #    3. x, x is bigger than 0, float allowed, timeout block call
110 ser = serial.Serial()
111 ser.port =  PORT      
112 ser.baudrate = BAUDRATE
113 ser.bytesize = serial.EIGHTBITS    #number of bits per bytes
114 ser.parity = serial.PARITY_NONE    #set parity check: no parity
115 ser.stopbits = serial.STOPBITS_ONE #number of stop bits
116 ser.timeout = 1          #non-block read      
117 #ser.timeout = None      #block read       
118 #ser.timeout = 2         #timeout block read
119 ser.xonxoff = False      #disable software flow control
120 ser.rtscts = False        #enable hardware (RTS/CTS) flow control
121 ser.dsrdtr = False       #disable hardware (DSR/DTR) flow control
122 ser.writeTimeout = 2     #timeout for write
123 
124 
125 
126 try: 
127     ser.open()
128 except Exception as  e:
129     print("error open serial port: " + str(e))
130     exit()
131 
132 if ser.isOpen():
133     try:
134         ser.flushInput() #flush input buffer, discarding all its contents
135         ser.flushOutput()#flush output buffer, aborting current output 
136                          #and discard all that is in buffer
137 
138         #write data
139         #ser.write("AT+CSQ".encode())
140         
141         clr = Color()
142         
143         clr.print_green_text("[%s, %dbps, %d%s%d, %s]" %(ser.port, ser.baudrate, ser.bytesize, 
144                             ser.parity, ser.stopbits, "RTS/CTS" if ser.rtscts else ("XON/XOFF" if 
145                             ser.xonxoff else ("DSR/DTR" if ser.dsrdtr else "None"))))
146         
147         clr.print_green_text("Termite is initialized and ready.")
148          
149         #give the serial port sometime to receive the data
150         time.sleep(0.5)  
151         
152         try:        
153             while(True):
154                 response = ser.readline()
155                 if(len(response) > 0):
156                     response = response.decode("utf-8", "replace")# "ignore")
157                     clr.print_red_text((response).strip())
158             
159         except KeyboardInterrupt:
160             print("Exist")
161             pass
162            
163     except Exception as e1:
164         print("error communicating...: " + str(e1))
165 
166 else:
167     print("cannot open serial port ")
168 #////////////////////////////////////////////////////////////////////////////////////////////////

运行脚本前,切换到脚本所在的目录,Windows环境下,运行cmd, 输入cd /D E:\Python Scripts[回车],输入python serial_test.py --port COM8 [可选 --baudrate 1000000][回车]:

这样就可以方便的打印串口调试log信息,这里的波特率、串口号都可以通过脚本命令行参数指定。

 

posted @ 2017-07-10 22:55  twxbtx  阅读(1234)  评论(0编辑  收藏  举报