您的位置:首页 > 编程语言 > Python开发

使用python来调试串口

2016-06-15 15:10 453 查看
转自 : http://www.cnblogs.com/pied/p/4175641.html

串口模块的波特率比较特别,找了几个串口工具都不支持。。。所以,干脆用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

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:                        # at the begin of new cmd
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):        # go back befor this cmd end
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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: