【Orangepi Zero2 全志H616】驱动串口实现Tik Tok—VUI(语音交互)

2023-11-09 22:15

本文主要是介绍【Orangepi Zero2 全志H616】驱动串口实现Tik Tok—VUI(语音交互),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、编程实现语音和开发板通信

  • wiringpi库源码
  • demo.c

二、基于前面串口的代码修改实现

  • uartTool.h
  • uartTool.c
  • uartTest.c

三、ADB

  • adb控制指令

四、手机接入Linux热拔插相关

a. 把手机接入开发板
b. 安装adb工具,在终端输入adb安装指令: sudo apt-get install adb
c. dmeg能查看到手机接入的信息,但是输入adb devices会出现提醒
dinsufficient permissions for device: user in plugdev group; are your udev rules wrong?
d. 配置文件,以支持USB设备的热拔插,支持UDEV的机制
在/etc/udev/rules.d 文件夹下创建规则文件
cd /etc/udev/rules.d/
sudo vim 51-android.rules
在文件中添加内容 SUBSYSTEM==“usb”, ENV{DEVTYPE}==“usb_device”, MODE=“0666”
e. 在手机开发者选项中,打开USB调试,重新拔插手机
f. 手机弹出调试提醒,点确认手机调试模式

一、编程实现语音和开发板通信

将语音模块插入开发板并编程实现基础逻辑代码,添加串口读取一个字符的接口my_serialGetchar();

wiringpi库源码:

在这里插入图片描述
在这里插入图片描述

demo.c

char myserialGetchar (const int fd)
{char x ;if (read(fd , &x, 1) != 1)return -1 ;return x ;
}
void* readSerial() 
{ char cmd; while(1){ cmd = myserialGetchar(fd); switch (cmd) { case 'N' : printf ("NEXT\n") ;system ("adb shell input swipe 540 1300 540 500 100") ;break ; case 'B' : printf ("BACK\n") ; 	  system ("adb shell input swipe 540 500 540 1300 100") ;break ; case 'A' : printf ("AGREE\n") ; system ("adb shell \"seq 2 | while read i;do input tap 540 1050 & input tap 540 1050 & sleep 0.1;done;\"") ;break ; case 'C' : printf ("CLOSE\n") ; system ("adb shell input keyevent 26") ;break ;			}	} 
}

二、基于前面串口的代码修改实现

uartTool.h

#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>#include "wiringSerial.h"int my_serialOpen (const char *device, const int baud) ;void my_serialSendstring (const int fd, const char *s) ;int my_serialGetstring (const int fd, char *buffer) ;char my_serialGetchar (const int fd) ;

uartTool.c

#include "wiringSerial.h"
#include "uartTool.h"int my_serialOpen (const char *device, const int baud)
{struct termios options ;   // 创建一个termios结构体,用于串口参数设置speed_t myBaud ;   // 创建一个速度类型的变量 myBaud,用于保存波特率int status, fd ;   // 创建整数类型的变量 status 和 fd,用于保存状态和文件描述符switch (baud){   // 根据传入的波特率参数选择合适的波特率常数case   9600: myBaud =   B9600 ; break ; case 115200: myBaud = B115200 ; break ; }if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1)   // 打开串口设备,设置打开选项return -1 ;   // 如果打开失败,返回错误代码 -1fcntl (fd, F_SETFL, O_RDWR) ;   // 设置文件状态标志// Get and modify current options: 获取并修改当前的串口参数:tcgetattr (fd, &options) ;   // 获取当前的串口参数cfmakeraw (&options) ;   // 初始化 termios 结构体为原始模式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 ; // Ten seconds (100 deciseconds) 超时等待时间(十分之一秒100ms)tcsetattr (fd, TCSANOW, &options) ;   // 设置新的串口参数ioctl (fd, TIOCMGET, &status);   // 获取串口控制模式状态status |= TIOCM_DTR ;   // 设置 DTR(数据终端就绪)位status |= TIOCM_RTS ;   // 设置 RTS(请求发送)位ioctl (fd, TIOCMSET, &status);   // 设置串口控制模式状态usleep (10000) ;  // 暂停 10 毫秒return fd ;   // 返回串口文件描述符
}void my_serialSendstring (const int fd, const char *s)
{int ret ;ret = write (fd, s, strlen (s)) ; if (ret < 0) printf ("Serial Sendstring Error\n") ;
}int my_serialGetstring (const int fd, char *buffer)
{int n_read ;n_read = read (fd, buffer, 32) ; return n_read ;
}char my_serialGetchar (const int fd)
{char x ;if (read (fd, &x, 1) != 1)return -1 ;return x ;
}

uartTest.c

#include <pthread.h>
#include "uartTool.h"int fd;void* readSerial ()
{char cmd ; while (1) {switch (cmd) { case 'N' : printf ("NEXT\n") ;system ("adb shell input swipe 540 1300 540 500 100") ;break ; case 'B' : printf ("BACK\n") ; 	  system ("adb shell input swipe 540 500 540 1300 100") ;break ; case 'A' : printf ("AGREE\n") ; system ("adb shell \"seq 2 | while read i;do input tap 540 1050 & input tap 540 1050 & sleep 0.1;done;\"") ;break ; case 'C' : printf ("CLOSE\n") ; system ("adb shell input keyevent 26") ;break ;			}}
}int main (int argc, char **argv)
{char deviceName [32] = {'\0'} ;pthread_t readt ;if (argc < 2) {printf ("uage:%s /dev/ttyS?\n", argv[0]) ;return -1 ;}strcpy (deviceName, argv[1]) ;if ((fd = my_serialOpen (deviceName, 115200)) == -1) {printf ("open %s error\n", deviceName) ;return -1;}pthread_create (&readt, NULL, readSerial, NULL) ;while (1) {sleep (10);}}

在这里插入图片描述

三、ADB

ADB(Android Debug Bridge)是一种用于与安卓设备通信和调试的命令行工具。它是Android开发工具包(Android SDK)的一部分,用于在开发过程中连接、控制和调试Android设备或模拟器。

ADB提供了一组命令,允许开发者在计算机上执行各种操作,包括安装和卸载应用程序、传输文件、执行Shell命令、查看设备日志等。使用ADB,开发者可以与设备交互,调试应用程序、分析问题并进行性能优化。

ADB可以通过USB连接或通过网络连接到Android设备。通过USB连接,开发者可以直接将设备连接到计算机,并通过ADB命令与设备进行通信。通过网络连接,开发者可以使用无线网络连接到设备,从而无需使用USB线缆。

需要注意的是,ADB在设备上需要开启开发者选项和USB调试模式才能正常使用。此外,ADB还提供了一些高级功能,如端口转发、截屏、录屏等,以支持更丰富的开发和调试需求。

总的来说,ADB是Android开发中非常重要的工具,它简化了与Android设备的通信和调试过程,为开发者提供了更好的开发环境和工作效率。

adb控制指令

用 shell 指令来操作手机屏幕,模拟手动滑屏幕
1、向下滑动。从坐标点(540,1300)用100ms滑动到坐标点(540,500)

adb shell input swipe 540 1300 540 500 100

2、 向下滑动。从坐标点(540,500)用100ms滑动到坐标点(540,1300)

adb shell input swipe 540 500 540 1300 100 

3、双击。点击坐标点(540,1050)两次,间隔0.1s

adb shell "seq 2 | while read i;do input tap 540 1050 & input tap 540 1050 &sleep 0.1;done;" 

4、锁屏。

adb shell input keyevent 26

使用ADB,开发人员可以通过USB连接将计算机与Android设备连接起来,并通过命令行界面执行各种操作。一些常见的ADB命令包括:

  • adb devices:列出当前连接的Android设备。

  • adb shell:进入设备的命令行界面。

  • adb install <path_to_apk>:安装一个Android应用程序。

  • adb uninstall <package_name>:卸载一个已安装的应用程序。

  • adb logcat:查看设备的系统日志。

  • adb pull <remote_path> <local_path>:从设备上复制文件到计算机上。

  • adb push <local_path> <remote_path>:将文件从计算机上复制到设备上。

请注意,使用ADB需要在计算机上安装Android SDK,并且设备的开发者选项和USB调试选项需要启用。使用ADB时要小心,因为一些命令可能会对设备造成不可逆的影响。

四、手机接入Linux热拔插相关

a. 把手机接入开发板
b. 安装adb工具,在终端输入adb安装指令: sudo apt-get install adb
c. dmeg能查看到手机接入的信息,但是输入adb devices会出现提醒
dinsufficient permissions for device: user in plugdev group; are your udev rules wrong?
d. 配置文件,以支持USB设备的热拔插,支持UDEV的机制
在/etc/udev/rules.d 文件夹下创建规则文件
cd /etc/udev/rules.d/
sudo vim 51-android.rules
在文件中添加内容 SUBSYSTEM==“usb”, ENV{DEVTYPE}==“usb_device”, MODE=“0666”
e. 在手机开发者选项中,打开USB调试,重新拔插手机
f. 手机弹出调试提醒,点确认手机调试模式

Linux 中如何挂载 iPhone 外部设备

1、把手机接入开发板

2、安装 adb 工具,在终端输入 adb 安装指令:

sudo apt-get install adb

3、dmesg 能查看到手机接入的信息,但是输入adb devices会出现提醒

在手机开发者选项中,打开USB调试,重新拔插手机,点击信任此设备
华为进入开发者模式
iPhone开发者模式
安卓同理

dmesg
adb devices
adb shell

在这里插入图片描述
在这里插入图片描述

4、配置文件,以支持USB设备的热拔插,支持UDEV的机制

在/etc/udev/rules.d 文件夹下创建规则文件

cd /etc/udev/rules.d/
sudo vim 51-android.rules

在文件中添加内容

SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"

USB设备的热拔插是指在计算机运行过程中插入或拔出USB设备而无需重新启动计算机或中断正在进行的工作。这种功能由操作系统提供的USB驱动程序和设备管理机制来实现。

UDEV(User Device)是一个设备管理子系统,主要用于动态配置和管理系统中的设备。它可以监测设备的插入和拔出事件,并根据预定义的规则进行自动配置和操作。

当USB设备插入计算机时,UDEV会自动检测设备并通过设备的唯一标识(如设备ID、厂商ID等)匹配相应的规则。根据规则,UDEV可以执行一系列操作,如加载适当的驱动程序、分配设备文件、设置设备权限等。

同样,当USB设备被拔出时,UDEV也会检测到设备的拔出事件,并执行相应的操作,如卸载驱动程序、释放设备文件等。

通过UDEV的机制,操作系统可以实现对USB设备的热拔插支持,提供了便利性和灵活性,使得用户可以方便地连接和断开USB设备,而无需手动进行设备配置或重新启动系统。这对于用户和开发者来说都是非常方便和实用的功能。

这篇关于【Orangepi Zero2 全志H616】驱动串口实现Tik Tok—VUI(语音交互)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/378755

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、