树莓派3B+
树莓派3B+内置了一个称之为硬件串口(/dev/ttyAMA0),一个称之为mini串口(/dev/ttyS0)。在树莓派3代中,由于板载蓝牙模块,硬件串口被默认分配给与蓝牙模块通信了,而把那个mini串口默认分配给了排针引出的GPIO(14,15)。
树莓派的串口默认为串口终端调试使用,如要正常使用串口则需要修改树莓派设置。关闭串口终端调试功能后则不能再通过串口登陆访问树莓派,只能通过ssh或者远程桌面连接树莓派后进行控制。
默认值
serial0是GPIO引脚对应的串口,serial1是蓝牙对应的串口。serial0(GPIO串口)默认使用的是ttyS0(mini串口),serial1(蓝牙)使用的是ttyAMA0(硬件串口)。
通过命令行来关闭串口访问,让串口只用来通信:
sudo nano /boot/cmdline.txt
删除console=serial0,115200,也就是关闭console,其余保持不变.
然后重启~sudo reboot
。
重启之后查看映射:
可以发现,GPIO连接了ttyAMA0硬件串口,蓝牙连接了ttys0 mini串口。
硬件连接
usb-ttl与树莓派连接,利用串口模拟软件实现树莓派与串口的通信。
测试demo:
#include <stdio.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdlib.h>
#include <sys/time.h>
#include <string.h>
#include <unistd.h>
int main()
{
int fd;
int nread;
char buf[128]={'\0'};
char *str="hello";
if(wiringPiSetup()==-1){
printf("wiringPi init failed\n");
exit(-1);
}
fd=serialOpen("/dev/ttyAMA0",9600);
if(fd==-1){
printf("open failde\n");
}
while(1){
serialPrintf(fd,str);
nread=serialDataAvail(fd);
if(nread>0){
read(fd,buf,nread);
printf("read from uart:%s\n",buf);
}
memset(buf,'\0',128);
delay(1000);
}
return 0;
}
用到的函数都是wiringPi库中有关串口通信的函数,读和写也可以创建子进程分开去做。
运行结果: