树莓派通过串口驱动SU-03T语音模块

树莓派通过串口驱动SU-03T语音模块

文章目录

  • 树莓派通过串口驱动SU-03T语音模块
    • 一、SU-03T语音模块的配置和烧录
      • 1.1 PIN引脚配置:
      • 1.2 设置唤醒词:
      • 1.3 设置控制详情:
      • 1.4 下载SDK并烧录到语音模块:
    • 二、测试语音模块
    • 三、树莓派通过串口驱动语音模块控制设备
      • 3.1 硬件连接:
      • 3.2 代码实现:

在这里插入图片描述

一、SU-03T语音模块的配置和烧录

1.1 PIN引脚配置:

在这里插入图片描述

1.2 设置唤醒词:

在这里插入图片描述

1.3 设置控制详情:

在这里插入图片描述

在这里插入图片描述

1.4 下载SDK并烧录到语音模块:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

下载完之后我们的语音模块就可以和树莓派进行串口通信了,但是不急,我们先测试一下语音模块

二、测试语音模块

将USB-TTL的TXD和RXD分别和语音模块的TXD和RXD交叉相连,然后插到电脑的USB中:

在这里插入图片描述

在这里插入图片描述

经过测试我们的语音模块工作是OK的,下面我们就可以写代码了

三、树莓派通过串口驱动语音模块控制设备

3.1 硬件连接:

在这里插入图片描述

在这里插入图片描述

由于我的树莓派供电是电脑USB供电的,所以这些外设它驱动不了,所以我们接了一个我们自己做的外置电源,但是外置电源要和树莓派共地!

3.2 代码实现:

/* mySerialTool.h */
#ifndef __MYSERIALTOOL_H__
#define __MYSERIALTOOL_H__

/*
* @Author: <NAME> 打开指定的串口设备,并设置波特率
*
* @param device 串口设备名称,如"/dev/ttyUSB0"
* @param baud 波特率,如9600、115200等
* @return 成功返回文件描述符,失败返回-1
*/
int mySerialOpen(const char *device, const int baud);
 
/*
* @Author: 向指定的串口设备发送字符串
*
* @param fd 串口设备文件描述符
* @param str 要发送的字符串 
* @return 无
*/
void mySerialSendString(const int fd, const char *str);
 
/*
* @Author: 从指定的串口设备读取字符串
*
* @param fd 串口设备文件描述符              
* @param buffer 读取到的字符串存放的缓冲区      
* @return 读取到的字符串的长度,失败返回-1
*/
int mySerialReadString(const int fd, char *buffer);

#endif
/* mySerialTool.c */
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
 
/*打开指定的串口设备,并设置波特率*/
int mySerialOpen(const char *device, const int baud)
{
    struct termios options; // 串口配置参数
    speed_t myBaud;         // 波特率
    int status, fd;         // 状态和文件描述符
 
    //根据传入的波特率参数设置相应的波特率
    switch(baud){
        case 9600:
            myBaud = B9600;
            break;
        case 115200:
            myBaud = B115200;
            break;
        default:
            printf("不支持的波特率!\n");
            return -2;
    }  
 
    //打开串口设备
    if( (fd = open(device, O_RDWR | O_NOCTTY | O_NDELAY)) == -1){
        printf("无法打开串口设备\n");
        return -1;
    }
 
     // 设置文件描述符的标志为读写模式
    fcntl(fd, F_SETFL, O_RDWR);
 
    // 获取当前串口配置
    tcgetattr(fd, &options);
 
    // 设置串口为原始模式,无特殊处理
    cfmakeraw(&options);
    // 设置输入波特率
    cfsetispeed(&options, myBaud);
    // 设置输出波特率
    cfsetospeed(&options, myBaud);
 
    // 清除标志位并设置数据格式
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~PARENB; // 无奇偶校验位
    options.c_cflag &= ~CSTOPB; // 1个停止位
    options.c_cflag &= ~CSIZE; // 清除数据位
    options.c_cflag |= CS8; // 设置为8位数据位
    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 非规范模式,不执行输入处理
    options.c_oflag &= ~OPOST; // 输出处理
 
    // 设置读取时的超时和最小接收字符数
    options.c_cc[VMIN] = 0;
    options.c_cc[VTIME] = 100; // 10秒超时
 
    // 应用串口配置
    tcsetattr(fd, TCSANOW, &options);
 
    // 使用ioctl设置串口的DTR和RTS信号
    ioctl(fd, TIOCMGET, &status);
    status |= TIOCM_DTR;
    status |= TIOCM_RTS;
    ioctl(fd, TIOCMSET, &status);
 
    // 短暂延时
    usleep(10000); // 10毫秒延时
 
    return fd; // 返回文件描述符
}
 
/*向指定的串口设备发送字符串*/
void mySerialSendString(const int fd, const char *str)
{
    int ret;
 
    ret = write(fd, str, strlen(str));            // 发送字符串
    if(ret == -1){
        printf("串口发送失败!\n");
        exit(-1);                                 // 发送失败,退出程序
    }
}
 
/*从指定的串口设备读取字符串*/
int mySerialReadString(const int fd, char *buffer)
{
    int n_read;
 
    n_read = read(fd, buffer, 32);                // 读取串口数据
    if(n_read == -1){
        printf("串口读取失败!\n");
        exit(-1);                                 // 读取失败,退出程序
    }
}
/* main.c */
#include <stdio.h>
#include <string.h>
#include <wiringPi.h>
#include "mySerialTool.h"

#define LED1 26                                            //定义四个LED引脚
#define LED2 27
#define LED3 28
#define LED4 29

void LED_GPIO_Init()
{
    pinMode(LED1, OUTPUT);                                  //设置四个LED引脚为输出模式
    pinMode(LED2, OUTPUT);
    pinMode(LED3, OUTPUT);
    pinMode(LED4, OUTPUT);
}

int main(int argc, char **argv)
{
    int fd;
    char deviceName[32] = {'\0'};
    int n_read;                                             //读取数据长度   
    char readBuf[2] = {0x98, 0x00};                         //接收数据缓存

    if(argc < 2){                                           //查看命令行参数是否存在
        printf("Usage: %s /dev/ttyAMA0\n", argv[0]);
        return -1;
    }

    strcpy(deviceName, argv[1]);                            //拷贝设备名到deviceName
    fd = mySerialOpen(deviceName, 9600);                    //打开串口
    if(fd < 0){
        printf("打开串口设备失败\n");
        return -1;
    }

    if(wiringPiSetup() == -1){                               //初始化wiringPi
        printf("初始化wiringPi失败\n");
        return -1;
    }
    LED_GPIO_Init();                                         //初始化LED引脚

    while(1){
        n_read = mySerialReadString(fd, readBuf);
        //printf("读到的数据为:%c\n", readBuf[1]);
        if(n_read > 0 && readBuf[1] == '1'){
            printf("打开一号灯\n");
            digitalWrite(LED1, LOW);
        }else if(n_read > 0 && readBuf[1] == '2'){
            printf("打开二号灯\n");
            digitalWrite(LED2, LOW);
        }else if(n_read > 0 && readBuf[1] == '3'){
            printf("打开三号灯\n");
            digitalWrite(LED3, LOW);
        }else if(n_read > 0 && readBuf[1] == '4'){
            printf("打开四号灯\n");
            digitalWrite(LED4, LOW);
        }else if(n_read > 0 && readBuf[1] == 'c'){
            printf("关闭所有灯\n");
            digitalWrite(LED1, HIGH);
            digitalWrite(LED2, HIGH);
            digitalWrite(LED3, HIGH);
            digitalWrite(LED4, HIGH);
        }
        memset(readBuf, '\0', sizeof(readBuf));
    }
    return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/873867.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汇舸环保从北交所转战港交所:狂分红超8000万,客户依赖度越来越高

《港湾商业观察》施子夫 7月31日&#xff0c;上海汇舸环保科技集团股份有限公司&#xff08;以下简称&#xff0c;汇舸环保&#xff09;递表港交所获受理&#xff0c;联席保荐机构中信证券和中国银河证券。 8月14日&#xff0c;公司披露公告称&#xff0c;另委任法国巴黎证券…

HTML零基础教程(超详细)

一、什么是HTML HTML&#xff0c;全称超文本标记语言&#xff08;HyperText Markup Language&#xff09;&#xff0c;是一种用于创建网页的标准标记语言。它通过一系列标签来定义网页的结构、内容和格式。HTML文档是由HTML元素构成的文本文件&#xff0c;这些元素包括标题、段…

99.WEB渗透测试-信息收集-网络空间搜索引擎shodan(1)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;98.WEB渗透测试-信息收集-Google语法&#xff08;12&#xff09; 信息收集方向-网络空间…

UEFI——获取UEFI MemoryMap

一、MemoryMap简介 首先讲一下什么是MemoryMap&#xff1f; 内存映射&#xff08;Memory Mapping&#xff09;是一种将文件内容映射到进程的虚拟地址空间的技术。在这种机制下&#xff0c;文件可以视为内存的一部分&#xff0c;从而允许程序直接对这部分内存进行读写操作&…

西门子WinCC开发笔记(一):winCC西门子组态软件介绍、安装

文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/142060535 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、Op…

Mysql Innodb存储引擎原理—链接如下

Mysql Innodb存储引擎| ProcessOn免费在线作图,在线流程图,在线思维导图 ProcessOn是一个在线协作绘图平台&#xff0c;为用户提供强大、易用的作图工具&#xff01;支持在线创作流程图、思维导图、组织结构图、网络拓扑图、BPMN、UML图、UI界面原型设计、iOS界面原型设计等。同…

大数据-124 - Flink State 01篇 状态原理和原理剖析:状态类型 执行分析

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

数学建模笔记—— 模糊综合评价

数学建模笔记—— 模糊综合评价 模糊综合评价1. 模糊数学概述2. 经典集合和模糊集合的基本概念2.1 经典集合2.2 模糊集合和隶属函数1. 基本概念2.模糊集合的表示方法3. 模糊集合的分类4. 隶属函数的确定方法 3. 评价问题概述4. 一级模糊综合评价模型典型例题 5. 多层次模糊综合…

SprinBoot+Vue停车场管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

iOS——GCD再学习

GCD 使用GCD好处&#xff0c;具体如下&#xff1a; GCD 可用于多核的并行运算&#xff1b;GCD 会自动利用更多的 CPU 内核&#xff08;比如双核、四核&#xff09;&#xff1b;GCD 会自动管理线程的生命周期&#xff08;创建线程、调度任务、销毁线程&#xff09;&#xff1b…

❤《实战纪录片 1 》原生开发小程序中遇到的问题和解决方案

《实战纪录片 1 》原生开发小程序中遇到的问题和解决方案 文章目录 《实战纪录片 1 》原生开发小程序中遇到的问题和解决方案1、问题一&#xff1a;原生开发中 request请求中返回 的数据无法 使用this传递给 data{}中怎么办&#xff1f;2、刚登录后如何将token信息保存&#xf…

智汇云舟荣膺国家级专精特新“小巨人”企业称号

近日&#xff0c;北京市经济和信息化局发布了经工业和信息化部审核的第六批专精特新“小巨人”企业名单&#xff0c;智汇云舟凭借其在视频孪生领域的卓越贡献和技术实力成功入选&#xff0c;荣膺国家级专精特新“小巨人”企业称号。 专精特新“小巨人”&#xff0c;是目前全国中…

PDF 全文多语言 AI 摘要 API 数据接口

PDF 全文多语言 AI 摘要 API 数据接口 PDF / 文本摘要 AI 生成 PDF 文档摘要 AI 处理 / 智能摘要。 1. 产品功能 支持多语言摘要生成&#xff1b;支持 formdata 格式 PDF 文件流传参&#xff1b;快速处理大文件&#xff1b;基于 AI 模型&#xff0c;持续迭代优化&#xff1b;…

【鸿蒙开发工具报错】Build task failed. Open the Run window to view details.

Build task failed. Open the Run window to view details. 问题描述 在使用deveco-studio 开发工具进行HarmonyOS第一个应用构建开发时&#xff0c;通过Previewer预览页面时报错&#xff0c;报错信息为&#xff1a;Build task failed. Open the Run window to view details.…

哈希表,算法

一.什么是哈希表 哈希表是一种用于快速数据存取的数据结构。它通过哈希函数将键&#xff08;key&#xff09;映射到表中的一个位置&#xff0c;从而实现高效的插入、删除和查找操作。 二.哈希冲突 哈希冲突发生在多个键通过哈希函数映射到哈希表的同一位置时。由于哈希表的大…

【专题】2024年中国游戏出海洞察报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37570 2023 年全球游戏市场规模高达 6205.2 亿美元&#xff0c;且预计未来持续增长&#xff0c;这清晰地展示了该市场的巨大潜力和良好前景。 中国游戏在全球移动游戏市场的份额于 2023 年已达 37%&#xff0c;产业贡献超 30% 的市场…

Redis主从数据同步过程:命令传播、部分重同步、复制偏移量等

请记住胡广一句话&#xff0c;所有的中间件所有的框架都是建立在基础之上&#xff0c;数据结构&#xff0c;计算机网络&#xff0c;计算机原理大伙一定得看透&#xff01;&#xff01;~ 1. Redis数据同步 1.1 数据同步过程 大家有没想过为什么Redis多机要进行数据同步&#…

[数据集][目标检测]水面垃圾检测数据集VOC+YOLO格式2027张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2027 标注数量(xml文件个数)&#xff1a;2027 标注数量(txt文件个数)&#xff1a;2027 标注…

SAP 免费学习网站推荐

1、https://www.guru99.com/ 可以看到有很多的开发语言可以学习。其中就有SAP。 点击SAP菜单后&#xff0c;可以看到每个模块的操作 每个模块下面都有操作的截图&#xff0c;结合翻译软件看的话很容易看懂 2、https://community.sap.com/ 这个是SAP官方的社区&#xff0c…

[数据结构] 开散列法 闭散列法 模拟实现哈希结构(一)

标题&#xff1a;[数据结构] 开散列法 && 闭散列法 模拟实现哈希结构 个人主页&#xff1a;水墨不写bug 目录 一、闭散列法 核心逻辑的解决 i、为什么要设置位置状态&#xff1f;&#xff08;伪删除法的使用&#xff09; ii、哈希函数的设计 接口的实现 1、插入&a…