文章目录
综述:
串口通信多用于多机通信,基于模块化的编程思想,实现模块与Mcu间的通信。
通信分为:全双工、半双工、单工。
全双工:双方能够同时的进行发送和接收数据
半双工:通信双的数据流是双向的,但是不能同时的进行发送和接收
单工:通信双反的数据流是固定的,只能是从A–>B,或者是从 B—>A。
通信协议及格式
我们把双方要进行通信,看成两个人讲话。两个想要讲话的前提是:要说的话对方要听的懂(数据的格式),说话的语速对方能够听进去(波特率)。
数据的格式:数据位、停止位、奇偶校验位。
树莓派串口编程
配置准备
修改 cmdline.txt文件
cd /boot/
sudo vim cmdline.txt
删除【】之间的部分
情况1:
dwc_otg.lpm_enable=0 【console=ttyAMA0,115200】 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
情况2:
dwc_otg.lpm_enable=0 console=tty1 【console=serial0,115200】 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
修改 inittab文件
有些环境可能没有 inittab这个文件
不需要这一步
cd /etc/
sudo vim inittab
注释掉最后一行内容:,在前面加上 # 号
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
重启
重启让系统启动时去读那些配置文件的变化,才能开始串口编程。
sudo reboot 重启
串口编程相关API
使用时需要包含头文件:#include <wiringSerial.h>
树莓派通过串口与电脑进行通信
通过USB to TTL使树莓派与电脑相连。
#include<wiringPi.h>
#include<wiringSerial.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
int main(){
int fd;
char readbuf[128];
fd=serialOpen("/dev/ttyAMA0",9600);
while(1){
memset(readbuf,'\0',sizeof(readbuf));//初始化很重要
serialPuts(fd,"xiu chuan da dui zhang\r\n");
if(serialDataAvail(fd)>0){
read(fd,readbuf,sizeof(readbuf));
if(strcmp(readbuf,"6")==0)
printf("9606\n");
else if(strcmp(readbuf,"666")==0)
printf("2020 0606\n");
else
printf("wiringPi here\n");
printf("read context:%s\n",readbuf);
}
delay(1000);
}
}
运行结果
语音模块与树莓派通信
将语音模块接到树莓派上;(3.3v不接)
TXD——RXD
RXD——TXD
GND——GND
5v —— 5v
代码与第一个例子类似
int main(){
int fd;
char readbuf[128] = {'\0'};
fd = serialOpen("/dev/ttyAMA0",9600);
int nread;
while(1){
memset(readbuf,'\0',sizeof(readbuf));
nread = read(fd,readbuf,sizeof(readbuf));
if(strlen(readbuf) == 0){
printf("time out");
continue;
}
printf("get data :%d read context:%s\r\n",nread,readbuf);
}
}
keil 语音模块代码
打印初始信息
获取一级命令后:
获取二级命令后:开灯关灯
运行结果:命令没有读全主要是由于read一次只能读8位所以系统选择分开输出。