【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(Android Debug Bridge)是一个用于在计算机和 Android 设备之间进行通信的命令行工具。它允许开发者执行各种设备操作,例如安装和调试应用程序、访问设备的 Shell、复制文件到设备或从设备复制文件等。ADB 是 Android SDK 的一部分,开发者可以使用它与 Android 设备进行交互。
以下是一些常用的 ADB 命令:
-
连接设备:
adb devices -
安装应用:
adb install example.apk -
卸载应用:
adb uninstall com.example.package -
启动应用:
adb shell am start -n com.example.package/.MainActivity -
查看设备信息:
adb shell getprop -
复制文件到设备:
adb push localfile.txt /sdcard/ -
从设备复制文件:
adb pull /sdcard/remotefile.txt -
启动设备 Shell:
adb shell -
查看日志:
adb logcat
这只是一些常见的 ADB 命令示例,ADB 提供了更多的功能,可以帮助开发者进行 Android 应用程序的开发、调试和测试。请注意,使用 ADB 前需要确保 Android 设备已启用开发者选项和 USB 调试。
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(语音交互)
一、编程实现语音和开发板通信 wiringpi库源码demo.c 二、基于前面串口的代码修改实现 uartTool.huartTool.cuartTest.c 三、ADB adb控制指令 四、手机接入Linux热拔插相关 a. 把手机接入开发板 b. 安装adb工具,在终端输入adb安装指令: sudo apt-g…...
【Spring】静态代理
例子: 租房子 角色: 我 (I ) 中介( Proxy ) 房东( host ) Rent 接口 package org.example;public interface Rent {void rent(); }房东 package org.example;public class Host implements Rent{Overridepublic void rent() …...
tomcat web.xml文件中servlet的load-on-startup
先看一个例子: <servlet><description>JAX-WS endpoint - restful</description><display-name>restful</display-name><servlet-name>restful-addnumbers</servlet-name><servlet-class>com.sun.xml.ws.transpor…...
记chrome打不开网址,无法搜索问题
打开网址解决办法 2023关于chrome谷歌浏览器无法正常上网问题,解决办法,亲测有效 下载插件,解压后拖入chrome的扩展程序中,可以打开国内网址 google引擎搜索解决办法 打开无痕浏览 (不知道什么原理,可…...
Spring面试题:(五)Spring注解开发@Component,@Autowired,@Bean,@Configuration
Bean基本注解 spring提供注解的版本 Component注解替代bean标签 bean其它属性的相关注解: scope 替代scopelazy 替代lazy-initPostConstruct 替代init-methodPreDestroy 替代destroy-method 使用Component注解的前提是开启注解扫描 衍生注解Repository,Servi…...
【Qt-23】ui界面设计-ToolBar
1、ToolBar 右击主窗体添加工具栏 新建动作,可设置图标,图标有本地文件和资源两种方式。 修改toolButtonStyle的属性,可设置图标与汉字显示的方式。 页面跳转: connect(ui->action, SIGNAL(triggered()), this, SLOT(openWid…...
nodejs 异步架构
nodejs的核心之一就是非阻塞的异步IO,于是想知道它是怎么实现的,挖了下nodejs源码,找到些答案,在此跟大家分享下。首先,我用了一段js代码test-fs-read.js做测试,代码如下: var path require(pa…...
腾讯云优惠券介绍、作用、领取方法及使用教程
随着云计算技术的发展,越来越多的企业和个人选择使用云服务进行数据存储、计算等业务。腾讯云作为国内知名的云服务商,提供了一整套完善的云解决方案,并不定期发放优惠券以吸引更多的客户。本文将为大家详细介绍腾讯云优惠券的作用、领取方法…...
浅谈智能变电站自动化系统的应用与产品选型
安科瑞电气股份有限公司 上海嘉定 201801 摘要:现如今,智能变电站发展已经成为了电力系统发展过程中的内容,如何提高智能变电站的运行效率也成为电力系统发展的一个重要目标,为了能够更好地促进电力系统安全稳定运行,…...
适用于初学者的 .NET MAUI
适用于初学者的 .NET MAUI | Microsoft Learn 记录微软Learn中用到的代码。文章比较粗糙,大部分是项目代码粘贴。想详细学习的可到上面的链接学习,代码可以从这里复制后直接运行。 练习中一共有两个页面: 1、MainPage.xaml 用于添加列表中的…...
Web3项目灵魂所在之智能合约编写(Web3项目一实战之二)
正如标题所言,为什么将智能合约称为Web3项目的灵魂所在呢?其实,智能合约好比是传统App的服务器端,若服务器端宕机了,App也就僵死了。 假使您正在浏览本篇文章时,对智能合约还不是很了解,或者说是只知其名不知其意的话,那么,烦请您移步我另外一篇关于 区块链中的智能合…...
python-jupyter实现OpenAi语音对话聊天
1.安装jupyter 这里使用的是jupyter工具,安装时需要再cmd执行如下命令,由于直接执行pip install jupyter会很慢,咱们直接使用国内源 pip install --user jupyter -i http://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.t…...
恒源云之oss上传数据、云台下载数据
目录 一、本地cmd上传数据二、使用云平台下载数据 一、本地cmd上传数据 需要下载恒源云客户端oss需要先将数据(代码、数据集)压缩成zip文件。 本地cmd打开oss,测试是否安成功 oss输入oss命令,并正确输入账号密码 oss login在个人…...
大数据-之LibrA数据库系统告警处理(ALM-12039 GaussDB主备数据不同步)
告警解释 GaussDB主备数据不同步,系统每10秒检查一次主备数据同步状态,如果连续6次查不到同步状态,或者同步状态异常,产生告警。 当主备数据同步状态正常,告警恢复。 告警属性 告警ID 告警级别 可自动清除 12039…...
【左程云算法全讲6】链表相关
系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考…...
从HDFS到对象存储,抛弃Hadoop,数据湖才能重获新生?
Hadoop与数据湖的关系 1、Hadoop时代的落幕2、Databricks和Snowflake做对了什么3、Hadoop与对象存储(OSD)4、Databricks与Snowflake为什么选择对象存储5、对象存储面临的挑战 1、Hadoop时代的落幕 十几年前,Hadoop是解决大规模数据分析的“白…...
灰度与二值化
人工智能的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而举步难行。不过别担心,我为大家整理了一份600多G的学习资源,基本上涵盖了人工智能学习的所有内容。点击下方链接,0元进群领取学习资源,让你的学习之路更加顺畅!记得…...
No183.精选前端面试题,享受每天的挑战和学习
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...
[C国演义] 第十八章
第十八章 最长斐波那契子序列的长度最长等差数列等差序列划分II - 子序列 最长斐波那契子序列的长度 力扣链接 子序列 ⇒ dp[i] — — 以 arr[i] 结尾的所有子序列中, 斐波那契子序列的最长长度子序列 ⇒ 状态转移方程 — — 根据最后一个位置的组成来划分 初始化 — — 根…...
发送失败的RocktMQ消息,你遇到过吗?
背景 需要通过flink同时向测试和线上的RocketMQ中写入数据 现象 在程序中分别创建了两个MqProducer,设置了不同的nameServerAddr,分别调用不同的producer向不同环境发消息,返回发送成功,但是在线上MQ中却查不到数据࿰…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
