【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 命令:

  1. 连接设备:

    adb devices
    
  2. 安装应用:

    adb install example.apk
    
  3. 卸载应用:

    adb uninstall com.example.package
    
  4. 启动应用:

    adb shell am start -n com.example.package/.MainActivity
    
  5. 查看设备信息:

    adb shell getprop
    
  6. 复制文件到设备:

    adb push localfile.txt /sdcard/
    
  7. 从设备复制文件:

    adb pull /sdcard/remotefile.txt
    
  8. 启动设备 Shell:

    adb shell
    
  9. 查看日志:

    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设备,而无需手动进行设备配置或重新启动系统。这对于用户和开发者来说都是非常方便和实用的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s的service自动发现服务:实战版

Service服务发现的必要性: 对于kubernetes整个集群来说&#xff0c;Pod的地址也可变的&#xff0c;也就是说如果一个Pod因为某些原因退出了&#xff0c;而由于其设置了副本数replicas大于1&#xff0c;那么该Pod就会在集群的任意节点重新启动&#xff0c;这个重新启动的Pod的I…

基于卷积神经网络和客源注意力机制的OD客流预测模型

文章信息 论文题目为《An origin–destination passenger flow prediction system based on convolutional neural network and passenger source-based attention mechanism》&#xff0c;该文于2023年发表于Expert Systems With Applications期刊上。文章提出一种基于乘客源注…

xss学习笔记

跨站脚本攻击 掌握XSS 的原理 掌握XSS 的场景 掌握XSS 的危害 掌握XSS 漏洞验证 掌握XSS 的分类跨站脚本攻击 漏洞概述 ​ 跨站点脚本&#xff08;Cross Site Scripting&#xff0c; XSS&#xff09;是指客户端代码注入攻击&#xff0c;攻击者可以在合法网站或Web 应用程…

Linux可以投屏到电视吗?用网页浏览器就能投屏到电视!

Linux系统的电脑如果要投屏到安卓电视屏幕上&#xff0c;可以使用投屏工具AirDroid Cast的网页版和TV版一起实现。 首先&#xff0c;在Linux系统的电脑里用chrome浏览器或edge浏览器打开webcast.airdroid.com。这就是AirDroid Cast的网页版。你可以看到中间白色框框的右上角有个…

使用Jmeter进行http接口性能测试

在进行网页或应用程序后台接口开发时&#xff0c;一般要及时测试开发的接口能否正确接收和返回数据&#xff0c;对于单次测试&#xff0c;Postman插件是个不错的Http请求模拟工具。 但是Postman只能模拟单客户端的单次请求&#xff0c;而对于模拟多用户并发等性能测试&#xf…

asp.net core mvc之 RAZOR共享指令和标签助手 TagHelpers

一、RAZOR共享指令 RAZOR共享指令&#xff1a;在视图中导入命名空间&#xff0c;执行依赖注入。 RAZOR共享指令是写在 Views目录下的 _ViewImports.cshtml 文件 支持指令如下&#xff1a; addTagHelper 增加标签助手 removeTagHelper 移除标签助手 tagHelperPrefix 标签助手…

es性能强悍的推演过程

前言 es底层复用的Lucene的能力&#xff0c;Lucene在以前的文章中有所讲解&#xff0c;感兴趣可查看 https://blog.csdn.net/u013978512/article/details/125474873?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169771769916777224433628%2522%252C%2522scm%2522…

模拟接口数据之使用Fetch方法实现

文章目录 前言一、package.json配置mock执行脚本二、封装接口&#xff0c;区分走ajax还是fetch三、创建mock目录&#xff0c;及相关接口文件四、定义接口五、使用mock数据使用模拟数据优化fetch返回数据 六、不使用模拟数据七、对比其他需要使用依赖相关配置如有启发&#xff0…

Linux 性能调优之硬件资源监控

写在前面 考试整理相关笔记博文内容涉及 Linux 硬件资源监控常见的命名介绍&#xff0c;涉及硬件基本信息查看查看硬件错误信息查看虚拟环境和云环境资源理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#x…

Linux常用命令——bzip2命令

在线Linux命令查询工具 bzip2 将文件压缩成bz2格式 补充说明 bzip2命令用于创建和管理&#xff08;包括解压缩&#xff09;“.bz2”格式的压缩包。我们遇见Linux压缩打包方法有很多种&#xff0c;以下讲解了Linux压缩打包方法中的Linux bzip2命令的多种范例供大家查看&…

Mac 本地部署thinkphp8【部署环境以及下载thinkphp】

PHP的安装以及环境变量配置 1 PHP安装&#xff1a;在终端输入brew install php 这里是PHP下载的最新的 如果提示‘brew’找不到&#xff0c;自己搜索安装吧&#xff0c; 不是特别难 2 环境变量配置 终端输入vim ~/.bash_profile 输入export PATH"/usr/local/Cellar/php/8.…

C++阶段复习‘‘‘‘总结?【4w字。。。】

文章目录 前言类和对象C类定义和对象定义类成员函数C 类访问修饰符公有&#xff08;public&#xff09;成员私有&#xff08;private&#xff09;成员受保护&#xff08;protected&#xff09;成员 继承中的特点类的构造函数和析构函数 友元函数内联函数this指针指向类的指针类…