如何实现树莓派和arduino之间的串口通信?
一、 树莓派环境安装
1、 安装GPIO模块
wget https://sourceforge.net/projects/raspberry-gpio-python/files/RPi.GPIO-0.6.2.tar.gz #下载GPIO库
tar xvzf RPi.GPIO-0.6.2.tar.gz #tar解压
cd RPi.GPIO-0.6.2 #进入解压后的文件夹
sudo python setup.py install #安装GPIO库文件
2、 安装serial,用于串口通信及USB通信:
sudo apt-get install python-serial
3、 检验前三步环境安装是否正确
用nano编辑器编辑一个test文件
sudo nano test.py
在test.py文件中写入下面两行代码
import serial
import RPi.GPIO
运行python test.py
语句,如果没有报错说明树莓派开发环境搭建正确。
二、 使用硬件串口
由于现在的硬件串口给了自带的蓝牙。所以需要修改串口的映射关系,serial0是GPIO引脚对应的串口,serial1是蓝牙对应的串口,可以使用 ls -l /dev/serial*
查看当前的映射关系
1、禁用login shell,启动serial port hardware
输入
sudo raspi-config
Interfacing Options -> P6 Serial, 第一个选项(would you like a login shell to be accessible over serial?)选择NO,第二个选项(would you like the serial port hardware to be enabled?)选择 YES
然后我们可以通过使用ls -l /dev/serial*
查看串口映射关系:
serial0(GPIO串口)默认使用的是ttyS0(mini串口),serial1(蓝牙)使用的是ttyAMA0(硬件串口)
如果想使用稳定可靠的硬件串口,就要将树莓派3的硬件串口与mini串口默认映射对换。
2、修改映射关系
sudo nano /boot/config.txt
在文件最后面添加一行:
dtoverlay=pi3-miniuart-bt
保存退出后重启系统sudo reboot
重启后使用ls -l /dev/serial*
查看映射:
如上图所示,serial0(GPIO串口)使用的是ttyAMA0(硬件串口),而serial1(蓝牙)使用的是ttys0(mini串口)
3、禁用串口的控制台功能
树莓派IO引出的串口默认是用来做控制台使用的,它的初衷是为了在没有网络接口时,通过串口对树莓派进行相关的配置。因此需要禁用这个默认功能,使得串口为我们自由使用。
在树莓派命令窗口中分别通过如下两个命令停止和禁用串口的控制台功能
sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service
然后执行语句:
sudo nano /boot/cmdline.txt
把 console=ttyAMA0,115200 kgdboc=ttyAMA0,115200 删除(如果没有的话就不要删)
sudo reboot #重启系统
三、 arduino中设置串口通信
使用arduino UNO,pin1和pin2口为串口,直接与树莓派的串口相连
四、 测试
使用树莓派向arduino发送字符‘s’,arduino接收到后返回"Hello Raspberry,I am Arduino."
Arduino代码:
void setup()
{
serial.begin(9600); // 9600 bps
}
void loop()
{
if ( serial.available())
{
if('s' == serial.read())
serial.println("Hello Raspberry,I am Arduino.");
}
}
树莓派代码:
import serial #import serial module
ser = serial.Serial('/dev/ttyAMA0', 9600,timeout=1); #open named port at 9600,1s timeot
#try and exceptstructure are exception handler
try:
while 1:
ser.write('s'.encode());#writ a string to port
response = ser.readall();#read a string from port
print(response);
except:
ser.close();
保存为test.py文件后在命令行输入sudo python test.py
运行结果如下: