树莓派库(wiringPi)详解:
https://www.cnblogs.com/lulipro/p/5992172.html
1. 修改语音代码的口令和串口输出
需要注意的是:
1、一级口令可能会影响到树莓派的识别(即使串口能正常识别)
2、语音输出的内容要英文,最好不要超过8个字节(树莓派一次只接收8个字节),除了要输出给树莓派必要接收的,其他输出全部注释掉。
2. 修改文件,使得串口变为可通信状态。
/* 修改 cmdline.txt文件 */
>cd /boot/
>sudo vim cmdline.txt
删除【】之间的部分
dwc_otg.lpm_enable=0 【console=ttyAMA0,115200】 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
/*修改 inittab文件 */ (没有这个文件就跳过)
>cd /etc/
>sudo vim inittab注释掉最后一行内容:,在前面加上 # 号
#T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
sudo reboot 重启
3. 语音模块和树莓派的接线
VCC: 5V
树莓派和语音模块的TXD和RXD是交叉接线的。
共地:树莓派和语音模块的GND相连
4. 编写代码验证树莓派能接收语音模块的数据
这验证之前,一定要单独测试语音模块和串口通信没有问题
树莓派的和PC串口通信接发数据没有问题
每喊一次一级口令,语音模块在亮着的灯的对角,就会再有一个灯亮起
这时再喊二级口令。
根据这样来,就不会经常喊着没反应,或者识别出错的概率会降低
#include <wiringPi.h>
#include <stdio.h>
#include <wiringSerial.h>
#include <unistd.h>
#include <string.h>
int main()
{
int fd;
int nread;
char cmd[128] = {'\0'};
wiringPiSetup();
fd = serialOpen("/dev/ttyAMA0",9600); //打开并初始化串口
//printf("fd = %d\n",fd);
while(1){
memset(cmd,'\0',sizeof(cmd));
nread = read(fd,cmd,sizeof(cmd));
if(nread == 0){
printf("waiting for\n");
continue;
}else{
printf("getData=%d,context:%s\n",nread,cmd);
}
}
return 0;
}
注意:
如果read的返回值是有数据的,但是打印不出缓存buf里面的内容
1、很有可能就是语音模块的代码没有改对 ,参照步骤一去排查
2、对于read缓存buf里面的内容,可以for 0到7 把buf 0到buf 7一个字节一个字节按16进制输出,然后对比下ascii表,看看到底传输过来的是啥数据
for(i=0;i<7;i++){
printf("do divice contrl: %X \n",voiceHandler->comand[i]);
}
3、如果觉得电压不够,可以将语音模块的 VCC5v 和 GND 和 串口转ttl 的那个硬件的 vcc 和 GND 相连,直接插入电脑或者插入手机充电头供电。