zoukankan      html  css  js  c++  java
  • 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信息,这里的波特率、串口号都可以通过脚本命令行参数指定。

  • 相关阅读:
    建议博客园搭个威客平台,可行的发展方向和盈利方向
    SQLServer DBA 三十问(第11~20题)
    sqlserver2000中nvarchar保存韩文乱码问题解决
    beginning Linux programming读书笔记(2)之shell编程
    IBM打狗问题
    Perl入门笔记2之第二章 标量数据
    linux面试大全
    结构体对齐详解
    Linux下静态链接库与动态链接库的区别
    Perl入门 笔记1之第一章简介
  • 原文地址:https://www.cnblogs.com/twxbtx/p/7148094.html
Copyright © 2011-2022 走看看