• 使用python来调试串口


    串口模块的波特率比较特别,找了几个串口工具都不支持。。。所以,干脆用python自己来写了,其实已经好奇好久了,别人的工具各种不顺手。

    需要pyserial的支持,兼容各种平台,不需要新编译二进制文件。

    先贴一个定时发送的代码:

    import serial
    import time
    
    ser = serial.Serial('/dev/ttyUSB0', 250000, timeout=1)
    print ser.isOpen()
    words="gggggggggggggggg"
    
    while (1):
            print "send 256x""+words+"" to remotes"
            startTime = time.time()
            times = 256
            while (times):
                    times -= 1
                    s = ser.write(words)
    
            endTime = time.time()
            print "use time: "+str(endTime-startTime)
            print ""
            time.sleep(5)
    ser.close()

    然后是一些其它的方法:

    1. 使用序号打开串口:ser = serial.Serial(0) 。but,怎么确定串口的序号???

    2. 查看串口的名称,啊哈,用1的方法打开串口后,你可以产看串口的名字:print ser.portstr  

    3. 先例化一个实体,再打开:

    >>> ser = serial.Serial()
    >>> ser.baudrate = 19200
    >>> ser.port = 0
    >>> ser
    Serial<id=0xa81c10, open=False>(port='COM1', baudrate=19200, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=0, rtscts=0)
    >>> ser.open()
    >>> ser.isOpen()
    True
    >>> ser.close()
    >>> ser.isOpen()
    False

    好多人问 windows 下面提示设备不存在!亲,windows 下面的串口设备名不一样的啊,上面的代码里面 COM1 就是 windows 下面的设备。

    4. 读取数据的几种方式

    >>> ser = serial.Serial('/dev/ttyS1', 19200, timeout=1)
    >>> x = ser.read()          # read one byte
    >>> s = ser.read(10)        # read up to ten bytes (timeout)
    >>> line = ser.readline()   # read a '/n' terminated line
    >>> ser.close()

    其中,如果只是串口调试,直接ser.read(1000),这样会把读到的值直接打印到屏幕上。

    5.所有参数

    ser = serial.Serial(
    port=None,              # number of device, numbering starts at
    # zero. if everything fails, the user
    # can specify a device string, note
    # that this isn't portable anymore
    # if no port is specified an unconfigured
    # an closed serial port object is created
    baudrate=9600,          # baud rate
    bytesize=EIGHTBITS,     # number of databits
    parity=PARITY_NONE,     # enable parity checking
    stopbits=STOPBITS_ONE,  # number of stopbits
    timeout=None,           # set a timeout value, None for waiting forever
    xonxoff=0,              # enable software flow control
    rtscts=0,               # enable RTS/CTS flow control
    interCharTimeout=None   # Inter-character timeout, None to disable
    )

    6. exception:serial.SerialException

    另一个完整收发的例子,单片机数据以TLV(Type,Length,Value)格式发上来

    #!/usr/bin/env python
    # it's a program of luo, piedgogo@sina.com
    import serial import array import os import signal from time import sleep flag_stop = False def onsignal_int(a,b): print "sigint!" global flag_stop flag_stop = True signal.signal(signal.SIGINT, onsignal_int)
    signal.signal(signal.SIGTERM, onsignal_int) ser
    = serial.Serial('/dev/ttyUSB0', 9600, timeout = 0.001) print "serial.isOpen() =",ser.isOpen() cmd_send = "7b02000129cc00c80378290400640000cc7d0d0a" cmd_send = cmd_send.decode("hex") stop = "7b04047d0d0a" stop = stop.decode("hex") cmd_back = "" cmd_length = 0x00 cmd_count = 0x00 s = ser.write(cmd_send) while True: sleep(0.1) if flag_stop: # read data until Ctrl+c ser.write(stop) # send cmd stop before exit print "reset cmd has been sent!" sleep(0.05) break text = ser.read(1) # read one, with timout if text: # check if not timeout n = ser.inWaiting() # look if there is more to read if n: text = text + ser.read(n) #get it cmd_back = cmd_back + text text = "" if len(cmd_back) < 2: # go back if no enough data recvd continue if cmd_length == 0x00: # new loop cmd_length = ord(cmd_back[1]) # Type(1 byte),Length of Value(1 byte),Value print "new cmd length,",cmd_length if (cmd_length + 0x02) > len(cmd_back): # do nothing until all bytes is recvd continue # so far, we have got a full cmd
    hex_list = [hex(ord(i)) for i in cmd_back] # more readable than data.encode("hex") print "In buffer:",hex_list
    cmd_back
    = cmd_back[cmd_length+2:] # remove this cmd(TLV) from buffer cmd_length = 0 cmd_count += 1
    print "==> %d cmds recvd."%(cmd_count) print "-------------" ser.close()

    可用的串口列表,可以用下面的方法获取:

    python -c "import serial.tools.list_ports;print [port for port in serial.tools.list_ports.comports() if port[2] != 'n/a']"

    因为获取的列表里可能有“假冒”的,所以,上面的代码还检查了设备的 hwid。comports() 返回的是一个 list,元素是一个对象,查看其 type() 结果如下 :

    type(port)

    class 'serial.tools.list_ports_linux.SysFS'

    查看文档 pydoc serial.tools.list_ports_linux.SysFS,上面的 port[2] 是这个 port 的 hwid,另外还有 port[0] 是串口名称,port[1]是 description 。

  • 相关阅读:
    UML类图几种关系的总结
    date long 互相转换
    tortoise更新后eclipse项目挂掉,报错找不到类
    eclipse快捷键
    ECLIPSE 环境变量配置,MAVEN本地仓库
    Android _关于fragment切换重新加载的解决分享给大家
    Java_反射机制详解
    Java_try,catch,finally return之间的执行顺序
    Java_单例模式
    Android_设置全屏的方法
  • 原文地址:https://www.cnblogs.com/pied/p/4175641.html
Copyright © 2020-2023  润新知