六、树莓派串口通信及相关概念

综述:

串口通信多用于多机通信,基于模块化的编程思想,实现模块与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位所以系统选择分开输出。
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值