基于linux串口实现语音刷抖音

目录

1.开发逻辑图及模块

2.编程实现语音和开发板通信

3.手机接入Linux热拔插相关,打开手机开发者模式允许USB调试

4.用shell指令来操作手机屏幕,模拟手动滑屏幕

5.最终主程序代码


1.开发逻辑图及模块

逻辑图:

模块

(1)语音模块: SU-03T

(2)开发板全志H616

(3)一部手机

接线语音模块TX(B7)接RX,VCC接VCC,GND接GND

配置好语音模块

2.编程实现语音和开发板通信

通配符编译

代码示例:

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

vi 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);

vi uartTest.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 <unistd.h>
#include <pthread.h>
#include "uartTool.h"


int fd;

void* readSerial()
{
	char cmd;
	while(1){
		cmd = myserialGetchar(fd);
		switch(cmd){
		case 'N':
		printf("next\n");
		break;
		case 'P':
		printf("pre\n");
		break;
		case 'Z':
		printf("zan\n");
		break;
		case 'Q':
		printf("qu\n");
		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 = myserialOpen(deviceName, 115200)) == -1){
		printf("open %s error\n",deviceName);
		return -1;
	}
	pthread_create(&readt, NULL, readSerial,NULL);
	while(1){sleep(10);}
}

3.手机接入Linux热拔插相关,打开手机开发者模式允许USB调试

a. 把手机接入开发板

b. 安装adb工具,在终端输入adb安装指令: sudo apt-get install adb

c. 输入命令dmesg能查看到手机接入的信息,但是输入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. 手机弹出调试提醒,点确认手机调试模式

重新拔插一下输入命令 adb devices显示SerialNumber

4.用shell指令来操作手机屏幕,模拟手动滑屏幕

adb shell input swipe 540 1300 540 500 100 向下滑动  540是水平的,1300是竖直方向,下是500

adb shell input swipe 540 500 540 1300 100 向上滑动

adb shell "seq 3 | while read i;do input tap 350 1050 & input tap 350 1050 & sleep 0.05;done;" 双击屏幕(实现点赞功能)

adb shell input keyevent 26 锁屏

5.最终主程序代码

vi uartTest.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 <unistd.h>
#include <pthread.h>
#include "uartTool.h"


int fd;

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 'P':
			printf("pre\n");
			system("adb shell input swipe 540 500 540 1300 100");
		break;
		case 'Z':
			printf("zan\n");
			system("adb shell \"seq 3 | while read i;do input tap 350 1050 &
			input tap 350 1050 & sleep 0.05;done;\"");
		break;
		case 'Q':
			printf("qu\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 = myserialOpen(deviceName, 115200)) == -1){
		printf("open %s error\n",deviceName);
		return -1;
	}
	pthread_create(&readt, NULL, readSerial,NULL);
	while(1){sleep(10);}
}

编译:

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱嵌入式的小佳同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值