文档章节

使用python下的pyserial进行串口测试和设备调用

openthings
 openthings
发布于 2016/02/17 09:57
字数 1640
阅读 5238
收藏 2
点赞 1
评论 0

硬件开发不可避免要与串口打交道,使用python下的pyserial可以使串口测试和设备调用的工作自动化。这里介绍pyserial的一些基础知识。

1、安装pyserial

linux上直接安装:

#python2
sudo pip install pyserial
#或者python3
sudo pip3 install pyserial

2、Bytes与string的转换

很多串口使用的数据是byte格式,需要进行转换。

使用str.decode()将ASCII转为String的Unicode。

使用bytes.encode(str,"ASCII")将Unicode转为ASCII的byte格式。

使用string.strip()去除后面的回车、换行等无效字符。

声明:s为字符串,rm为要删除的字符序列
s.strip(rm)        删除s字符串中开头、结尾处,位于 rm删除序列的字符
s.lstrip(rm)       删除s字符串中开头处,位于 rm删除序列的字符
s.rstrip(rm)      删除s字符串中结尾处,位于 rm删除序列的字符
注意:
1. 当rm为空时,默认删除空白符(包括'\n', '\r',  '\t',  ' ')

3、十六进制显示

十六进制显示的实质是把接收到的字符诸葛转换成其对应的ASCII码,然后将ASCII码值再转换成十六进制数显示出来,这样就可以显示特殊字符了。

在这里定义了一个函数,如hexShow(argv),代码如下:

import serial  
  
def hexShow(argv):  
    result = ''  
    hLen = len(argv)  
    for i in xrange(hLen):  
        hvol = ord(argv[i])  
        hhex = '%02x'%hvol  
        result += hhex+' '  
    print 'hexShow:',result  
  
t = serial.Serial('com12',9600)  
print t.portstr  
strInput = raw_input('enter some words:')  
n = t.write(strInput)  
print n  
str = t.read(n)  
print str  
hexShow(str)


4、十六进制发送

十六进制发送实质是发送十六进制格式的字符串,如'\xaa','\x0b'。重点在于怎么样把一个字符串转换成十六进制的格式,有两个误区:

1)'\x'+'aa'是不可以,涉及到转义符反斜杠。

2)'\\x'+'aa'和r'\x'+'aa'也不可以,这样的打印结果虽然是\xaa,但赋给变量的值却是'\\xaa'。

这里用到decode函数:

list='aabbccddee'  
hexer=list.decode("hex")  
print  hexer

需要注意一点,如果字符串list的长度为奇数,则decode会报错,可以按照实际情况,用字符串的切片操作,在字符串的开头或结尾加一个'0'。

假如在串口助手以十六进制发送字符串"abc",那么你在python中则这样操作“self.l_serial.write(”\x61\x62\x63") ”。

当然,还有另外一个方法:

strSerial = "abc"  
strHex = binascii.b2a_hex(strSerial)  
#print strHex  
strhex = strHex.decode("hex")  
#print strhex  
self.l_serial.write(strhex);

同样可以达到相同目的。


Overview

This module encapsulates the access for the serial port. It provides backends for Python running on Windows, Linux, BSD (possibly any POSIX compliant system), Jython and IronPython (.NET and Mono). The module named "serial" automatically selects the appropriate backend. 

It is released under a free software license, see LICENSE.txt for more details. 
(C) 2001-2008 Chris Liechti cliechti@gmx.net 

The project page on SourceForge and here is the SVN repository and the Download Page
The homepage is on http://pyserial.sf.net/ 

Features

same class based interface on all supported platforms
access to the port settings through Python 2.2+ properties
port numbering starts at zero, no need to know the port name in the user program
port string (device name) can be specified if access through numbering is inappropriate
support for different bytesizes, stopbits, parity and flow control with RTS/CTS and/or Xon/Xoff
working with or without receive timeout
file like API with "read" and "write" ("readline" etc. also supported)
The files in this package are 100% pure Python. They depend on non standard but common packages on Windows (pywin32) and Jython (JavaComm). POSIX (Linux, BSD) uses only modules from the standard Python distribution)
The port is set up for binary transmission. No NULL byte stripping, CR-LF translation etc. (which are many times enabled for POSIX.) This makes this module universally useful.

Requirements

Python 2.2 or newer
pywin32 extensions on Windows
"Java Communications" (JavaComm) or compatible extension for Java/Jython

Installation

from source

Extract files from the archive, open a shell/console in that directory and let Distutils do the rest: 
python setup.py install
The files get installed in the "Lib/site-packages" directory. 

easy_install

An EGG is available from the Python Package Index: http://pypi.python.org/pypi/pyserial 
easy_install pyserial 

windows installer

There is also a Windows installer for end users. It is located in the Download Page 
Developers may be interested to get the source archive, because it contains examples and the readme. 

Short introduction

Open port 0 at "9600,8,N,1", no timeout 

>>> import serial
>>> ser = serial.Serial(0)  # open first serial port
>>> print ser.portstr       # check which port was really used
>>> ser.write("hello")      # write a string
>>> ser.close()             # close port

Open named port at "19200,8,N,1", 1s timeout 

>>> 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()

Open second port at "38400,8,E,1", non blocking HW handshaking 

>>> ser = serial.Serial(1, 38400, timeout=0,
...                     parity=serial.PARITY_EVEN, rtscts=1)
>>> s = ser.read(100)       # read up to one hundred bytes
...                         # or as much is in the buffer

Get a Serial instance and configure/open it later 

>>> 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

Be carefully when using "readline". Do specify a timeout when opening the serial port otherwise it could block forever if no newline character is received. Also note that "readlines" only works with a timeout. "readlines" depends on having a timeout and interprets that as EOF (end of file). It raises an exception if the port is not opened correctly. 

Do also have a look at the example files in the examples directory in the source distribution or online.


Examples

Please look in the SVN Repository. There is an example directory where you can find a simple terminal and more. 
http://pyserial.svn.sourceforge.net/viewvc/pyserial/trunk/pyserial/examples/ 

Parameters for the Serial class

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
)

The port is immediately opened on object creation, if a port is given. It is not opened if port is None. 
Options for read timeout: 

timeout=None            # wait forever
timeout=0               # non-blocking mode (return immediately on read)
timeout=x               # set timeout to x seconds (float allowed)


Methods of Serial instances

open()                  # open port
close()                 # close port immediately
setBaudrate(baudrate)   # change baud rate on an open port
inWaiting()             # return the number of chars in the receive buffer
read(size=1)            # read "size" characters
write(s)                # write the string s to the port
flushInput()            # flush input buffer, discarding all it's contents
flushOutput()           # flush output buffer, abort output
sendBreak()             # send break condition
setRTS(level=1)         # set RTS line to specified logic level
setDTR(level=1)         # set DTR line to specified logic level
getCTS()                # return the state of the CTS line
getDSR()                # return the state of the DSR line
getRI()                 # return the state of the RI line
getCD()                 # return the state of the CD line


Attributes of Serial instances

Read Only: 

portstr                 # device name
BAUDRATES               # list of valid baudrates
BYTESIZES               # list of valid byte sizes
PARITIES                # list of valid parities
STOPBITS                # list of valid stop bit widths

New values can be assigned to the following attributes, the port will be reconfigured, even if it's opened at that time: 

port                    # port name/number as set by the user
baudrate                # current baud rate setting
bytesize                # byte size in bits
parity                  # parity setting
stopbits                # stop bit with (1,2)
timeout                 # timeout setting
xonxoff                 # if Xon/Xoff flow control is enabled
rtscts                  # if hardware flow control is enabled


Exceptions

serial.SerialException


Constants

parity: 

    serial.PARITY_NONE
serial.PARITY_EVEN
serial.PARITY_ODD

stopbits: 

    serial.STOPBITS_ONE
serial.STOPBITS_TWO

bytesize: 

    serial.FIVEBITS
serial.SIXBITS
serial.SEVENBITS
serial.EIGHTBITS


© 著作权归作者所有

共有 人打赏支持
openthings
粉丝 241
博文 877
码字总数 459280
作品 1
东城
架构师
基于pyserial和tkinter的自动上电程序的上位机

主要功能有:扫描并列出串口名,设置上下电时间,保存及自动保存log文件等。 应用于自己做的一个上下电设备,下位机是arduino控制的大功率mos管。用于设备上下电老化测试。 代码是根据别人的...

weixin_42331248 ⋅ 05/28 ⋅ 0

jakey.chen/Serial Tool

Serial Tool 用python2.7、Tkinter、pyserial(使用版本3.3测试OK)模块开发的串口调试工具 已将串口工具和USB整合在一起 SlaveDebugTool 安装使用 需要安装的模块: 在Windows下: 默认是有安装...

jakey.chen ⋅ 2017/06/27 ⋅ 0

温度传感器+I2C+串口+PC上位机(pyserial)例子

温度传感器+I2C+串口+PC上位机(pyserial)例子 例子写的有点乱,主要是学习: 温度传感器DS18b20,E2PROM,I2C, 串口读写,PC上位机(pyserial)数据显示 SerialPort.py PC串口上位机程序,...

小熊宝宝 ⋅ 2014/07/26 ⋅ 4

使用FirmATA操作硬件

在Arduino使用FirmATA(http://firmata.org/)通用固件,然后在PC上使用Python通过串口通讯可以直接操作硬件(http://playground.arduino.cc/Interfacing/Python)。尤其是与"树莓派+Linux"...

openthings ⋅ 2016/02/15 ⋅ 0

用pyserial来达到串口软件同样的效果,但是无法接收到数据

背景:大傻串口软件的使用,可以通过给物理设备(如温湿度传感器)发送指令010300000002C40B,然后设备会返回类似01 03 04 02 36 01 05 DA 16,其中包含温度和湿度的数据。 问题:我想用pys...

fzyz_sb ⋅ 2013/06/18 ⋅ 1

Mac OS X下的USB设备连接与访问

由于COM协议的广泛使用,很多设备虽然接口改为了USB,但内部数据通讯协议仍然使用的是COM(即传统的RS232串口协议,新的使用TTL)。很多设备使用了PL2302/CH340/FTDI等芯片来通过USB模拟出串口...

openthings ⋅ 2015/03/10 ⋅ 0

【Python入门】 使用 pip 安装 pySerial 串口通讯模块

pySerial封装了对串口的访问。 特性 在支持的平台上有统一的接口。 通过python属性访问串口设置。 支持不同的字节大小、停止位、校验位和流控设置。 可以有或者没有接收超时。 类似文件的API...

微wx笑 ⋅ 2016/11/15 ⋅ 0

raspberry pi init

1:wifi 2:sudo apt-get update 3:sudo apt-get install fcitx fcitx-googlepinyin fcitx-module-cloudpinyin fcitx-sunpinyin 5:sudo raspi-config进行中文设置 ->Localisation Options ->T......

乌鸦FB ⋅ 2015/08/26 ⋅ 0

你真的了解Python吗?这篇文章让你了解90%

  【IT168 评论】人们为什么使用Python?   之所以选择Python的主要因素有以下几个方面:   软件质量:在很大程度上,Python更注重可读性、一致性和软件质量,从而与脚本语言世界中的其...

博客园 ⋅ 05/21 ⋅ 0

21.python通过pyserial读写串口--2013-06-02

因为有个需要用有源RFID搞资产管理的项目,需要用python读取读卡器的串口内容。于是装了pyserial模块,用了下很方便,整理下常用功能 一、 为了使用python操作串口,首先需要下载相关模块: 1...

quanpower ⋅ 2013/06/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Hive函数

1.函数explode (一转多) create table hive_wc(sentence string); load data local inpath '/home/hadoop/data/hive-wc.txt' into table hive_wc; 结果: hive > select * from hive_wc; ......

GordonNemo ⋅ 17分钟前 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 34分钟前 ⋅ 0

使用Java connector消费ABAP系统的函数

Java Connector(JCO)环境的搭建:Step by step to download and configure JCO in your laptop 我的ABAP系统有个函数名叫ZDIS_GET_UPSELL_MATERIALS,输入一个customer ID和product ID,会输......

JerryWang_SAP ⋅ 39分钟前 ⋅ 0

IDEA提示编码速度

焦点移动 将焦点冲代码编辑窗口移动到菜单栏:Alt+菜单栏带下划线字母 将焦点从工具窗口移动到代码编辑窗口 Esc或Shift+Esc 将焦点从代码编辑移动到最近使用的工具窗口 F12 模板提示 Ctrl+J...

bithup ⋅ 51分钟前 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

python3.6 安装pyhook_3

我的是在win下的,忙了半天老是安装不了, pip install 也不行。 那么可以看出自己的版本是32bit 一脸懵逼 没办法 只好下载32版本的来安装 我一直以为 是 对应32 位的 。 下面是 小例子 http...

之渊 ⋅ 今天 ⋅ 0

004、location正则表达式

1、location的作用 location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。 2、location的语法 = 开头表示精确匹配 ^~...

北岩 ⋅ 今天 ⋅ 0

CentOS7 静默安装 Oracle 12c

环境 CentOS7.5 最小安装 数据库软件 linuxx64_12201_database.zip 操作系统配置 关闭 SELinux sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config 关闭防火墙 systemctl disable ......

Colben ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部