一、安装
1.下载软件包pyserial-2.7.tar.gz 网址:https://pypi.python.org/pypi/pyserial
2.8uftp上传至/usr/local/src/目录下
3.cd /usr/local/src/
4.解压tar -zxvf pyserial-2.7.tar.gz
5.cd pyserial-2.7/ //在该解压后的文件里发现setup.py文件,而没有configrue文件,所以,
//下一步用sudo python setup.py install,而不是./configrue --prefix=/usr.....
6.安装sudo python setup.py install
注:网上还有如下方法编译安装pyserial
cd /usr/local/src/
wget http://pypi.python.org/packages/source/p....... //用wget直接下载到当地当前目录下
tar -zxvf pyserial-2.4.tar.gz
cd pyserial-2.4
python2.6 setup.py install
二、使用
import serial导入模块
然后就可以用了
ser = serial.Serial(0) 是打开第一个串口
print ser.portstr 能看到第一个串口的标识,windows下是COM1
ser.write(“hello") 就是往串口里面写数据
ser.close() 就是关闭ser表示的串口
ser.open() 会打开这个串口
ser = serial.Serial('COM1', 115200) 来设置波特率,当然还有专门的函数
data = ser.read()可以读一个字符
data = ser.read(20) 是读20个字符
data = ser.readline() 是读一行,以/n结束,要是没有/n就一直读,阻塞。
data = ser.readlines()和ser.xreadlines()都需要设置超时时间
ser.baudrate = 9600 设置波特率
ser 来查看当前串口的状态
ser.isOpen() 看看这个串口是否已经被打开
三、树莓派串口UART(转载,原文:http://blog.csdn.net/xukai871105/article/details/22713925)
0.前言
本文将详细介绍树莓派的串口(UART)配置和使用,并结合一个modbus RTU从机的例子说明树莓派串口的应用。
在开始前说明以下几点
【1】树莓派UART端口的位置
TXD位于HEAD-8
RXD位于HEAD-10
GND位于HEAD-6(可选其他GND)
【2】树莓派的TXD应接USB转串口设备的RXD,当然如果测试失败请交换RXD和TXD的顺序
【3】经过很多次的测试(N>25),当波特率为115200时打开树莓派的UART时,树莓派会莫名其妙的发送一字节0xF8,该问题始终无法解决。不过波特率为9600时并没有此问题,猜测是树莓派硬件或内核驱动问题。
【4】树莓派的串口默认为SSH调试使用(参考:http://www.cnblogs.com/ma6174/archive/2013/04/23/3038626.html),若要使用串口需要修改两处文件。
图1 树莓派 UART位置
1.修改两处文件
【1】/boot/cmdline.txt
【输入以下指令】
sudo nano /boot/cmdline.txt
【删除红色部分】//移除内核启动信息输出和内核调试信息输出
dwc_otg.lpm_enable=0
console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
【最终变为】
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
【2】/etc/inittab
【输入以下指令】
sudo nano /etc/inittab
【注释最后一行内容】//禁止掉从串口登录的功能
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
2.使用minicom
配置完之后便可测试一下树莓派的UART是否正常工作,而minicom便是一个简单好用的工具。minicom是linux平台串口调试工具,相当于windows上的串口调试助手。
【1】minicom安装
sudo apt-get install minicom
【2】minicom启动
minicom -b 9600 -o -D /dev/ttyAMA0
-b代表波特率,-D代表端口,/dev/ttyAMA0 类似于windows中的COM1,-o功能暂时未知。
图2 minicon界面
【3】minicom发送内容
直接在控制台中输入内容即可,如果minicom打开了回显可在控制台中观察到输出内容,如果回显关闭则控制台中没人任何反应,千万不要以为minicom没有正常工作。
【4】minicom回显控制
先Ctrl+A,再E。可翻转回显状态(原来回显打开则此事回显关闭)
【5】minicom回显关闭
先Ctrl+A,再Q。
3.使用pyserial
minicom仅满足调试用途,如果需要编程解决问题那么python的serial扩展库——pyserial则是一个不错的选择。pyserial模块非常好用,后面的文章还会分析如何使用pyserial控制GPRS模块。
【pyserial安装】
安装pyserial扩展库有很多种方法,可使用pip或者easy_install安装,也可以直接选择apt-get工具安装。
若使用apt-get工具安装,可输入以下指令
sudo apt-get install python-serial
【串口回显程序】
非常简单的一个串口程序,树莓派通过串口返回接收的内容。
-
- import serial
- import time
- ser = serial.Serial("/dev/ttyAMA0", 9600)
- def main():
- while True:
-
- count = ser.inWaiting()
- if count != 0:
-
- recv = ser.read(count)
- ser.write(recv)
-
- ser.flushInput()
-
- time.sleep(0.1)
-
- if __name__ == '__main__':
- try:
- main()
- except KeyboardInterrupt:
- if ser != None:
- ser.close()
4.总结
由于可借助python标准库使得树莓派的串口格外好用。是不是可以拿树莓派做一个Modbus RTU从机,的确可以请期待后面的博文吧。
5.参考资料
四、raspi串口通信控制51单片机点亮LED(装载) 原文地址:http://www.360doc.com/content/13/0314/00/3810344_271368104.shtml
raspberry pi 串口控制51单片机
制作小车都用raspberry pi上的口有些麻烦,所以把一些基础控制给51单片机解决,raspberry pi控制高层应用。所以测试一下raspberry pi串口连接调试51单片机。
第一步: //我自己第一步:sudo apt-get install pyserial(python的串口模块)
sudo apt-get install python-serial
sudo easy_install pyserial
第二部接线部分图 //我自己这一排依次接:单片机的+5v、悬空、单片机的地、单片机的RXD、单片机的TXD。
raspberry pi板子串口接线图
raspberry 串口接线图1
杜邦线连接
raspberry 串口接线图3
代码部分
raspberry pi python串口控制代码://以下标黄色这句,运行错误,提示类型不正确,可能是python解释器版本的问题,在python3.x以上版本
//函数的参数不是整形或字符串,而是序列,所以在黄色语句前加入语句tstlist=[i],将参数转为序列,如下:
//#tstlist=[22,8,8,3,3,3]
//tstlist=[i]
//ser.write(tstlist[:])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
import
serial
import
time
i
=
0
ser
=
serial.Serial(
'/dev/ttyAMA0'
,
9600
, timeout
=
0.5
)
for
j
in
range
(
10
):
if
ser.isOpen()
=
=
False
:
ser.
open
()
if
i
=
=
0
:
i
=
1
else
:
i
=
0
ser.write( chr (i))
try
:
re
=
ser.readlines()
except
:
pass
print
re
time.sleep(
2
)
|
注:以上标黄色这句,运行错误,提示类型不正确,可能是python解释器版本的问题,在python3.x以上版本,函数的参数不是整形或字符串,而是序列,所以在黄色语句前加入语句tstlist=[i],将参数转为序列,如下:
#tstlist=[22,8,8,3,3,3]
tstlist=[i]
ser.write(tstlist[:])。更重要的是解决问题的思路:当运行错误的时候,会提示在库函数里面具体哪个函数出错了,是to_bytes(data)函数,仔细解读这个函数发现它是将所给参数(是序列)转换为字符,在程序的注释部分也有说明,于是想到先把参数转化为序列再给ser.write(...
)函数,解决问题。思路:去库函数具体出错的函数处分析原因。
/************其他人的解决办法***************/
ser=serial.Serial(6,115200)#这里没有问题
at='at'+chr(13)
ser.write(at)
让后马上就报错了.
File "C:\Python33\lib\site-packages\serial\serialutil.py", line 76, in to_bytes
b.append(item) # this one handles int and str for our emulation and ints for Python 3.x
TypeError: an integer is required
某人回复:3的字符串都是unicode,发送前是不是要encoding成别的编码?
楼主修改:at='AT' at=at+chr(13) at.encode('ascii')
/***************************************/
51单片机代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#include <reg52.h>
#include <intrins.h>
typedef
unsigned
char
uint8;
typedef
unsigned
int
uint16;
uint8 num;
sbit D0 = P0^0;
void
init()
{
SCON = 0x50;
TMOD = 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
ES = 1;
EA = 1;
}
void
interrupt_uart() interrupt 4
{
if
(TI)
{
TI = 0;
REN = 1;
}
if
(RI)
{
RI = 0;
num = SBUF;
if
(num == 1)
{
D0 = 0;
SBUF = 0;
}
else
{
D0 = 1;
SBUF =1;
}
REN = 0;
}
}
main()
{
init();
while
(1);
}
|
源码下载
raspberrypito51
五、pyserial解析:
1.serial.Serial的参数有哪些:
>>> import serial
>>> ser=serial.Serial("/dev/ttyAMA0",9600)
>>> ser
Serial<id=0xb6afc6b0, open=True>(port='/dev/ttyAMA0', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=False, rtscts=False, dsrdtr=False)
2.pyserial官网文档地址:pyserial.sourceforge.net
- timeout = None: wait forever
- timeout = 0: non-blocking mode (return immediately on read)
- timeout = x: set timeout to x seconds (float allowed)