目录
一、串口配置
树莓派CPU内部有两个串口,一个是硬件串口(官方称为PL011 UART),一个是迷你串口(官方成为mini-uart)。在树莓派2B/B+这些老版树莓派上,官方设计时都是将“硬件串口”分配给GPIO中的UART(GPIO14&GPIO15),因此可以独立调整串口的速率和模式。而树莓派3的设计上,官方在设计时将硬件串口分配给了新增的蓝牙模块上,而将一个没有时钟源,必须由内核提供时钟参考源的“迷你串口”分配给了GPIO的串口,这样以来由于内核的频率本身是变化的,就会导致“迷你串口”的速率不稳定,这样就出现了无法正常使用的情况。
目前解决方法就是,关闭蓝牙对硬件串口的使用,将硬件串口重新恢复给GPIO的串口使用,也就意味着树莓派3的板载蓝牙和串口,只能二选一使用。
下图是树莓派3的接口图:
1、接线
按照R-T,T-R,USB转TTL模块连接引脚15和引脚16
2、修改文件:
命令行输入
sudo vi /boot/cmdline.txt
删除console=serial0,115200这段程序
3、重新启动树莓派
sudo reboot
二、相关功能函数:
1、打开并初始串口
int serialOpen (char *device, int baud)
device:串口的地址,在Linux中就是设备所在的目录。
默认一般是"/dev/ttyAMA0",我的是这样的。
baud:波特率
返回:正常返回文件描述符,否则返回-1失败
2、发送一个字符串到串口
void serialPuts (int fd, char *s)
fd:文件描述符
s:发送的字符串,字符串要以’\0’结尾
3、获取串口缓存中可用的字节数
int serialDataAvail (int fd)
fd:文件描述符
返回:串口缓存中已经接收的,可读取的字节数,-1代表错误
4、从串口读取一个字节数据返回
int serialGetchar (int fd)
fd:文件描述符
返回:读取到的字符
三、程序实现
1、发送数据到主机
#include <wiringPi.h>
#include <wiringSerial.h>
int main()
{
int fd;
wiringPiSetup();
fd=serialOpen("/dev/ttyAMA0",9600);
while(1){
serialPuts(fd,"hen shuai\r\n");
delayMicroseconds(1000000);
}
return 0;
}
串口助手波特率要与程序相对于,本文为9600
运行效果:串口助手不断收到数据
2、串口数据通信
#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>
int main()
{
int fd;
int cmd;
wiringPiSetup();
fd=serialOpen("/dev/ttyAMA0",9600);
while(1){
while(serialDataAvail(fd) != -1){
cmd=serialGetchar(fd);
printf("get data:cmd=%d\n",cmd);
}
}
return 0;
}
运行效果:串口助手发送数据,树莓派端可显示出接收到的数据