串口设置
将树莓派的硬件串口与mini串口默认映射对换
因为:硬件串口由硬件实现,有单独波特率时钟源,性能高,可靠,而mini串口要依附CPU内核提供时钟。因此我们要用硬件串口,但是树莓派3b的硬件串口默认连接的是蓝牙,所以我们要改一下,把蓝牙映射到mini串口上,而释放硬件串口。
- 查看相关文件:
cd /boot/overlays
,找到pi3-miniuart-bt.dtb或pis-miniuart-bt-overlay.dtb,这两个是同一个文件。如果没有的话需要进行下载。 - READ文件说明了此文件的功能时将树莓派3的蓝牙切换到mini串口(ttyS0),并且恢复硬件串口(ttyAMA0)到GPIO14和15引脚中。
- 以上就保证了蓝牙串口和硬件串口同时可用。
查看串口映射关系
- 查看:
ls -l /dev
- 可以看到默认的串口的映射关系
serial0 -> ttyS0
,serial1 -> ttyAMA0
。
修改串口映射关系
sudo vi /boot/config.txt
- 添加
dtoverlay=pi3-miniuart-bt
- 重启并查看,就会发现默认的串口映射调换了。
serial1 -> ttyS0
,serial0 -> ttyAMA0
。
禁用串口的控制台功能
交换串口的映射后树莓派还不能与电脑进行通信,因为树莓派的IO口默认是用来做控制台使用的,而不是通信。
禁用默认设置:
sudo systemctl stop serial-getty@ttyAMA0.service
,sudo systemctl disable serial-getty@ttyAMA0.service
修改配置:
sudo vi /boot/cmdline.txt
- 删除
console=serial0,115200
,保存重启。
安装minicom调试助手
- 安装:
sudo apt-get install minicom
- 打开:
sudo minicom -D /dev/ttyAMA0 -b115200
。-D
后接串口位置和名称,-b
设置波特率,波特率一致才可以进行收发。 - 进入调试界面后,
ctrl + a -> e
后进行输入显示切换。 - 退出
ctrl + a -> q
第一个串口C语言函数
#include <wiringSerial.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
int main(int argc, int *argv[]) //int serialOpen (const char *device, const int baud)
{
int fd;
if((fd = serialOpen("/dev/ttyAMA0", 115200)) < 0)
{
fprintf(stderr,"Unable to open serial device: %s\n", strerror(errno));
return 1;
}
serialPuts(fd, "Usart send Test,Just by launcher!");
for(;;)
{
if(serialDataAvail(fd) > 0)
{
putchar(serialGetchar(fd));
}
}
return 0;
}
注意
Pi3的蓝牙和GPIO口的UART不可兼得
树莓派3上用户目前无法正常是使用GPIO中的UART串口(GPIO14&GPIO15),原因是树莓派CPU内部有两个串口,一个是硬件串口(官方称为PL011 UART),一个是迷你串口(官方成为mini-uart)。在树莓派2B/B+这些老版树莓派上,官方设计时都是将“硬件串口”分配给GPIO中的UART(GPIO14&GPIO15),因此可以独立调整串口的速率和模式。而树莓派3的设计上,官方在设计时将硬件串口分配给了新增的蓝牙模块上,而将一个没有时钟源,必须由内核提供时钟参考源的“迷你串口”分配给了GPIO的串口,这样以来由于内核的频率本身是变化的,就会导致“迷你串口”的速率不稳定,这样就出现了无法正常使用的情况。目前解决方法就是,关闭蓝牙对硬件串口的使用,将硬件串口重新恢复给GPIO的串口使用,也就意味着树莓派3的板载蓝牙和串口,现在成了鱼和熊掌,两者无法兼得。
- 使用固定CPU时钟频率 *
使用固定CPU时钟频率,以便mini UART
能以准确的波特率进行通信.
修改/boot/config.txt
,上面的修改变成:
core_freq=250
dtoverlay=pi3-miniuart-bt
修改后重启。此后的UART通信,就可以通过/dev/ttyS0
进行。