串口小项目 - 声控刷抖音

项目准备: 

 orangepi02

语言 模块: SU-03T

电脑


接线:


语言模块 - orangepi
VCC - 5V
GND -  GND
B7(RX)--RX-5

orangepi  手机 通过usb 连接

实现思路图:

语言模块接收到语言信息,发送到 H616 去处理,H616再控制手机实现语言刷抖音的功能


====================== 
插入手机后,使用 指令:  dmesg  -- 查看信息:

 
//手机的内核(安卓的底层实现)也是linux实现的

先下载adb:  sudo apt-get install adb

再使用adb下的命令得到手机编号:

adb  -- Android 调试桥 (Android Debug Bridge )

adb devices

adb shell --  需要手机 的授权 “USB调试”


 

项目代码:

//同步在资源中

muUart.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>


#include<pthread.h>
#include "uartTool.h"

int fd;

void *readSerial()
{
	char cmd;
	while(1){
		cmd=myserialGetchar(fd);
		printf("GET->0x%c\n",cmd);
      
    switch(cmd){
        case 'N':
		puts("next");	
        system("adb shell input swipe 540 1300 540 500 100");
		break;	
	
	
        case 'P':
		puts("pre");	
        system("adb shell input swipe 540 500 540 1300 100");
        break;	
	
	
        case 'Z':
		puts("zan");	
        system("adb shell \"seq 2 | while read i;do input tap 350 1050 & input tap 350 1050 &sleep 0.03;done;\"");

        break;	
	
	
        case 'Q':
		puts("quit");	
        system("adb shell input keyevent 26");
        break;	
	
	}


	}

}


void *sendSerial()
{

	char buf[32];
	while(1){
		memset(buf,'\0',sizeof(buf));
		scanf("%s",buf);
		serialsendString(fd,buf);  
	}


}

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=myserialOpen(deviceName,115200))==-1){
		printf("open %s error\n",deviceName);
		return -1;
	}

	pthread_create(&readt,NULL,readSerial ,NULL);

	while(1)
	{
		sleep(10);
	}

	return 0;
}

uartTool.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>

#include "wiringSerial.h"

char myserialGetchar (const int fd)
{
  char x ;

  if (read (fd, &x, 1) != 1)
    return -1 ;

  return x;
}


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 ;
	}

	 if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1)
	   return -1 ;

	 fcntl (fd, F_SETFL, O_RDWR) ;
	 
	 // Get and modify current options:
	 
	   tcgetattr (fd, &options) ;
	 
		 cfmakeraw	 (&options) ;
		 cfsetispeed (&options, myBaud) ;
		 cfsetospeed (&options, myBaud) ;
	 
		 options.c_cflag |= (CLOCAL | CREAD) ;
		 options.c_cflag &= ~PARENB ;
		 options.c_cflag &= ~CSTOPB ;
		 options.c_cflag &= ~CSIZE ;
		 options.c_cflag |= CS8 ;
		 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)
	 
	   tcsetattr (fd, TCSANOW, &options) ;
	 
	   ioctl (fd, TIOCMGET, &status);
	 
	   status |= TIOCM_DTR ;
	   status |= TIOCM_RTS ;
	 
	   ioctl (fd, TIOCMSET, &status);
	 
	   usleep (10000) ;  // 10mS
	 
	   return fd ;



}


void serialsendString (const int fd, const char* s)
{
  int ret;
  ret=write(fd,s,strlen(s));
  if(ret<0)
  	printf("Serial Puts Error\n");
}

int serialgetString (const int fd, char* buffer)
{
  int n_read;
  n_read=read(fd,buffer,32);
  return n_read;

}





uartTool.h

int myserialOpen (const char *device, const int baud);
void serialsendString (const int fd, const char* s);
int serialgetString (const int fd, char* buffer);


char myserialGetchar (const int fd);


操作步骤: 

1.按接线要求 接好线 (注意我们代码接的是串口5 ,波特率115200)

2.编译: gcc myUart.c uartTool.c -lpthread

3. 运行 ./a.out /dev/ttyS5  

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

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

相关文章

【Proteus】51单片机对步进电机的控制

步进电机&#xff1a;将电脉冲信号转变为角位移或线位移的开换控制系统。在非超载的情况下&#xff0c;电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数&#xff0c;而不受负载变化的影响&#xff0c;即给电机加一个脉冲信号&#xff0c;电机则转过一个步距角。 特点&am…

服务网关GateWay基础

1. 网关基础介绍1.1 网关是什么1.2 为啥要用网关1.3 常见的网关组件NginxNetflix ZuulSpring Cloud GatewayKongAPISIX综合比较 2. gateWay的使用2.1 springCloud整合gateway2.2 GateWay的相关用法2.3 GateWay路由使用示例基本用法转发/重定向负载请求动态路由 2.5 断言(Predic…

代码随想录 797. 所有可能的路径

题目 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i 到节点 graph[i][j]存在一…

电视音频中应用的音频放大器

电视机声音的产生原理是将电视信号转化为声音&#xff0c;然后通过扬声器将声音播放出来。当我们打开电视并选择频道时&#xff0c;电视机首先从天线或有线电视信号中获取声音信号。声音信号经过放大器放大之后&#xff0c;就能够通过扬声器发出声音。电视机声音的产生原理和音…

React【Day4下+5】

环境搭建 使用CRA创建项目&#xff0c;并安装必要依赖&#xff0c;包括下列基础包 Redux状态管理 - reduxjs/toolkit 、 react-redux路由 - react-router-dom时间处理 - dayjsclass类名处理 - classnames移动端组件库 - antd-mobile请求插件 - axios 配置别名路径 1. 背景知识…

Java | Leetcode Java题解之第32题最长的有效括号

题目&#xff1a; 题解&#xff1a; class Solution {public int longestValidParentheses(String s) {int left 0, right 0, maxlength 0;for (int i 0; i < s.length(); i) {if (s.charAt(i) () {left;} else {right;}if (left right) {maxlength Math.max(maxlen…

【Linux】NFS网络文件系统搭建

一、服务端配置 #软件包安装 [roothadoop01 ~]# yum install rpcbind nfs-utils.x86_64 -y [roothadoop01 ~]# mkdir /share#配置文件修改 #格式为 共享资源路径 [主机地址] [选项] # [roothadoop01 ~]# vi /etc/exports /share 192.168.10.0/24(rw,sync,no_root_squash) #…

智慧社区整体解决方案(PPT)

1、背景与现状分析 2、解决方案 3、功能及应用场景介绍 软件资料清单列表部分文档&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&#xff0c;用户需求…

机器视觉系统:PVC片材表面缺陷检测的锐利“眼睛”

PVC片材作为一种广泛应用于建筑、包装、医疗等领域的塑料材料&#xff0c;其表面质量对于产品的性能和使用寿命至关重要。然而&#xff0c;在生产过程中&#xff0c;PVC片材可能会出现多种表面缺陷&#xff0c;如划痕、污渍、气泡、压痕等。为了确保产品质量&#xff0c;机器视…

【五十九】【算法分析与设计】高精度加法和高精度减法

高精度加法 高精度加法&#xff0c;也称为大数加法&#xff0c;是一种能够处理超过标准数据类型&#xff08;如 int 或 long&#xff09;允许范围的大数字的算法。 高精度数字通常无法使用单一的标准数据类型来存储。一个常见的方法是使用数组或字符串来表示每一位数字。例如…

算法课程笔记——STL键值对map

map当下标无限的数组 重点是对应关系&#xff0c;一般不修改compare 类比set 没有lowerbound&#xff0c;因为遍历是无序的 ; map不能用sort函数排序 但可用vector转化为map使用 std::set<std::pair<TKEY, mutable TVAL> > ≈ std::map<TKEY, TVAL>

电子印章盖骑缝章

电子印章盖骑缝章是指在电子文档&#xff08;如PDF文件&#xff09;中&#xff0c;使用电子印章技术&#xff0c;为文档添加一个跨越多页、连续显示的电子印章图像&#xff0c;以模拟传统纸质文档上的骑缝章效果。以下是实现电子印章盖骑缝章的步骤&#xff1a; 一. 准备电子印…

C++_特殊类的设计和单例模式

文章目录 学习目标&#xff1a;1.请设计一个类&#xff0c;不能被拷贝2. 请设计一个类&#xff0c;只能在堆上创建对象3. 请设计一个类&#xff0c;只能在栈上创建对象4. 请设计一个类&#xff0c;不能被继承5. 请设计一个类&#xff0c;只能创建一个对象(单例模式) 特殊类的设…

C++修炼之路之多态--多态的条件与例外,重载+重写+重定义

目录 前言 一&#xff1a;构成多态的条件及一些特殊情况&#xff08;前提是构成父子类&#xff09; 1.多态是在不同的继承关系的类对象&#xff0c;去调用同一函数&#xff0c;产生了不同的结果 2.两个条件 3.三同的两个例外 1.协变---返回值类型可以不同&#xff0c;但必…

外贸客户开发软件哪个好用一点,效果好数据精准的?

选择外贸客户开发软件时&#xff0c;你需要考虑软件的功能、易用性、数据质量以及价格等因素。以下是一些常用的外贸客户开发软件&#xff0c;它们都具有不同的特点和优势&#xff1a; 易谷歌地图数据采集大师&#xff1a; 专为做外贸的朋友开发的一款基于谷歌地图数据采集的软…

Python-VBA函数之旅-hash函数

目录 一、hash函数的定义&#xff1a; 二、hash函数的工作方式&#xff1a; ​三、hash函数的优缺点&#xff1a; 四、hash函数的常见应用场景&#xff1a; 1、hash函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&…

C++进阶:搜索树

目录 1. 二叉搜索树1.1 二叉搜索树的结构1.2 二叉搜索树的接口及其优点与不足1.3 二叉搜索树自实现1.3.1 二叉树结点结构1.3.2 查找1.3.3 插入1.3.4 删除1.3.5 中序遍历 2. 二叉树进阶相关练习2.1 根据二叉树创建字符串2.2 二叉树的层序遍历I2.3 二叉树层序遍历II2.4 二叉树最近…

37、Tomato(VulnHub)

Tomato 一、nmap 2211是ssh的端口&#xff0c;21的ftp也不是弱密码 二、web渗透 随便看看 目录爆破 /seclists/Discovery/Web-Content/common.txt /antibot_image/antibots/readme.txt 发现该站点存在反爬机制 /antibot_image/antibots/info.php 提示我们该网页存在个参数 GET&…

Java高阶私房菜:高并发之线程池底层原理学习

以往我们需要获取外部资源&#xff08;数据源、Http请求等&#xff09;时&#xff0c;需要对目标源创建链接对象&#xff0c;三次握手成功后方可正常使用&#xff0c;为避免持续的资源占用和可能的内存泄漏&#xff0c;还需要调用目标对象close方法释放资源销毁对象。这一建一销…

排序算法集合

912. 排序数组 趁着这道题总结下排序方法 1.快速排序 算法描述 1.从数列中挑出一个元素&#xff0c;称为"基准"&#xff08;pivot&#xff09;&#xff0c; 2.重新排序数列&#xff0c;所有比基准值小的元素摆放在基准前面&#xff0c;所有比基准值大的元素摆在基…