串口通信通常用在多机通信中。
串口通信是全双工的,那什么是全双工呢?
打个比方,一男一女在电话争吵,双方都能同时说话,对方也都能听到。
串口通信有两根数据线:Rx Tx
比如树莓派要和51单片机通信,将树莓派的R接到51的T,树莓派的T接到51的R(当然还要供电,就不啰嗦了)。就可以实现树莓派和单片机的交互了,双方都可以收发数据。当然你也可以只接一根,就变成单工了,只允许数据单向流动。
串口通信的双方必须要遵循特定的串口通信协议才能实现双方数据收发,就像两个人对话一样,语言相通,语速一致,才能实现对话。
在串口通信中,语言可以理解为数据格式(数据位、停止位、奇偶校验位),语速可以理解为波特率。
以上在串口通信的面试中已经足够了
这一步是很重要的,因为树莓派3b的串口默认是被蓝牙占用的,也就会默认是用于蓝牙的。
但在前面的学习中,我们对树莓派的串口进行过一次设置或者说配置,就是解除了串口的蓝牙占用,用于串口登录,通过串口打印一些系统初始化的信息。
现在需要再次修改配置信息,来设置用于串口通信。配置方法如下:
①进入该目录 /boot/,打开cmdline.txt文件
cd /boot/
sudo vi cmdline.txt
进入该文件后,删除红色方框内容
删除后保存退出,删除后为:
②重启
sudo reboot
用到串口通信API需要包含头文件:
#include
串口常见的API参考文章:树莓派wiringPi库详解
将树莓派与电脑进行连接,测试一下树莓派与电脑的串口通信。
TTL与树莓派TX,RX连接后插入电脑端口,注意是交叉接线,最后TTL与树莓派还要共地稳压,保证数据正常沟通。一共三根线,Rx ——Tx、Tx——Rx、GND——GND。最后别忘记给树莓派供电哦!
我们要实现的功能是树莓派与电脑的双工通信,也就是树莓派向PC发送数据,看PC是否接收到;PC向树莓派发送数据,看树莓派是否接收到。我们可以通过串口助手来查看树莓派发上来的数据以及模拟发送数据给树莓派。
①树莓派通过串口发送数据给PC
程序如下:
#include
#include
#include
int main()
{
int fd;
if(wiringPiSetup() == -1)
{
printf("硬件初始化失败\n");
}
fd = serialOpen("/dev/ttyAMA0",9600); //Linux下一切皆文件
while(1)
{
serialPutchar(fd,'c');
//serialPuts(fd,"Hello World!\n");
delayMicroseconds(1000000); //延时函数
}
return 0;
}
我们在PC端打开串口调试助手,注意选对端口,波特率与程序中设置的一致。
结果如下:
每隔一秒钟通过串口向PC段发送一个字符 ‘c’
②PC通过串口发送数据发送给树莓派
程序如下:
#include
#include
#include
int main()
{
int fd;
int cmd;
if(wiringPiSetup() == -1)
{
printf("硬件初始化失败\n");
}
fd = serialOpen("/dev/ttyAMA0",9600);
while(1)
{
while(serialDataAvail(fd) != -1){
cmd = serialGetchar(fd); //读串口数据
printf("get data is %d\n",cmd);
}
}
return 0;
}
结果如下:
我们通过串口调试助手发送整型数 5
树莓派接收到的数据也是 5
③树莓派与PC交互
程序:
#include
#include
#include
int main()
{
int fd;
int cmd;
if(wiringPiSetup() == -1)
{
printf("硬件初始化失败\n");
}
fd = serialOpen("/dev/ttyAMA0",9600); //打开串口
while(1)
{
while(serialDataAvail(fd) != -1)
{
cmd = serialGetchar(fd);
if(cmd == '2')
{
serialPuts(fd,"Pi receive 2 from you!\n");
}
if(cmd == '3')
{
serialPuts(fd,"Pi receive 3 from you!\n");
}
if(cmd == '4')
{
serialPuts(fd,"Pi receive 4 from you!\n");
}
}
}
return 0;
}
结果如下:
后续我们可以将树莓派与语音模块结合起来,将语音模块获取的指令通过串口发送给树莓派,树莓派根据不同的指令执行不同的操作。
通过这一节对串口通信的学习,对串口通信有了一定了解。由此可以进行拓展,为后面智能家居项目服务。
树莓派与语音模块的串口通信,实现语音控制各种灯或其它设备:
语音模块接收到指令后通过串口向树莓派发送相关数据,树莓派根据接收到的数据,选择进行不同到的动作,进而实现对不同设备的控制。当前,树莓派也可以通过串口连接51或者32,将接收到的数据(指令)转发给单片机,单片机根据不同的指令去进行不同的动作。
参考文章:
树莓派wiringPi库详解
树莓派串口通信