一、串口说明
莓派3B+上UART串口位于GPIO的8脚和10脚,分别为GPIO8=Tx,GPIO10=Rx。在连接外部接口时,需要交换接口,即GPIO8连接到外设的Rx,GPIO10连接到外设的Tx。Rpi3的接口如下:
Rpi3B+的GPIO8和GPIO10该串口不能直接用,Rpi3B+包含两组串口,一组硬串口ttyAMA0和一组软串口ttyS0,硬串口就是GPIO8和GPIO10,系统默认分配给了蓝牙设备,查询设备外设智能看到ttyS0。因此,需要将硬串口释放出来。
二、ttyAMA0硬串口配置
查看串口配置情况: ls -l /dev
找到serial,看它映射的是哪个设备。有可能是显示的一个,有可能是两个。
1、关闭ttyAMA0服务
sudo systemctl stop serial-getty@ttyAMA0.servicesudo systemctl disable serial-getty@ttyAMA0.service
2、删除控制台串口输出
sudo vi /boot/cmdline.txt ,删除语句 console=serial0,115200,变成如下:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
3、切换蓝牙为软串口,释放硬件串口
sudo vi /boot/config.txt ,最后一行增加
dtoverlay=pi3-miniuart-bt
4、重启Rpi3
sudo reboot
5、查看设备信息
ls -l /dev
三、使用wiringPi库开发串口
安装wiringPi库后,可以在/usr/linclude找到wiringPi相关的头文件:
要查找wiringPi库的包含头文件在哪里,可以使用find命令查找:
sudo find / -name wiring*
主要是四个头文件:
- wiringPi.h 基本IO驱动和常用配置定义;
- wiringPiI2C.h I2C驱动的头文件;
- wiringPiSPI.h SPI驱动的头文件;
- wiringSerial.h Serial驱动的头文件;
串口驱动库主要提供以下接口:
- extern int serialOpen (const char *device, const int baud) ;//打开串口,输入设备描述符和串口波特率,返回串口的设备ID
- extern void serialClose (const int fd) ;//关闭串口,
- extern void serialFlush (const int fd) ;//清空缓存区
- extern void serialPutchar (const int fd, const unsigned char c) ;//输出一个字符
- extern void serialPuts (const int fd, const char *s) ;//输出字符串
- extern void serialPrintf (const int fd, const char *message, ...) ;//格式化输出
- extern int serialDataAvail (const int fd) ;//返回设备缓存区接收到的数据个数
- extern int serialGetchar (const int fd) ;//从设备ID读取一个字符
新建一个文件myuart.c,如下代码进行测试:
#include<wiringPi.h>
#include<wiringSerial.h>
#include<stdio.h>
#include<string.h>
#include<time.h>
void delay_ms(int ms);
int main()
{int filedevid;int recbytenum;int i;char buf[1024];memset(buf,0,1024);wiringPiSetup();if((filedevid=serialOpen("/dev/ttyAMA0",115200))<0){printf("/dev/ttyAMA0 Open Faild\r\n");return -1;}else{printf("/dev/ttyAMA0 Open with 115200, success\r\n");while(1){recbytenum = serialDataAvail(filedevid);if(recbytenum > 0){i=0;while(recbytenum--){buf[i++] = serialGetchar(filedevid);}printf("Rpi uart recv: %s\r\n",buf);serialPrintf(filedevid,"Rpi uart send: %s\r\n",buf);memset(buf,0,1024);}}}
}
四、编译和测试
编译命令:
gcc myuart.c -o runuart.o -l wiringPi
运行:
五、分析和讨论
上面的方法主要记录了Rpi3的Uart基本操作,但是存在以下问题:
1、串口无法修改奇偶校验、数据位数;
2、数据接收存在分包现象,主要是由于wiringPi库只提供了serialDataAvail函数,因此该串口驱动还需要进一步优化和改进。
可以参考下一篇博文:树莓派UART串口编程--使用wiringPi库-C开发【2-修改驱动】