硬件平台
语音模块介绍
重点!!
串口通信
语音模块串口发送的内容(被修改了,不是出厂内容,修改步骤看资料)
switch(dat) /*对结果执行相关操作,客户可删除Printcom 串口输出语句替换为其他需要控制的代码*/
{
case CODE_DMCS: /*命令“亮一点”*/
PrintCom("亮一点rn"); /*text.....*/
break;
case CODE_KFBYZ: /*命令“变暗”*/
PrintCom("变暗rn"); /*text.....*/
break;
case CODE_KD: /*命令“开灯”*/
PrintCom("开灯rn"); /*text.....*/
break;
case CODE_GD: /*命令“关灯”*/
PrintCom("关灯rn"); /*text.....*/
break;
case CODE_BJ: /*命令“亮度30”*/
PrintCom("亮度30rn"); /*text.....*/
break;
case CODE_SH: /*命令“亮度60”*/
PrintCom("亮度60rn"); /*text.....*/
break;
case CODE_GZ: /*命令“亮度100”*/
PrintCom("亮度100rn"); /*text.....*/
break;
default:PrintCom("请重新识别发口令rn"); /*text.....*/break;
}
}
else
{
PrintCom("请说出一级口令rn"); /*text.....*/
}
STM32C8T6接收
主要分为串口中断,超时方式接收,比较
超时方式接收被放到了主循环,配合串口中断使用,是一个不太成熟的函数,不过用在这里绰绰有余。
//串口中断函数:
u8 rev_buf[100];//接收缓冲区
u8 addr=0; //地址偏移量
u8 revice_ok=0;//接收完成标志
u8 revice_start=0;//开始接收受标志
u32 time_out=0;//超时计数值
//串口1中断服务函数
void USART1_IRQHandler(void)
{
u8 data;
data=USART1->DR;//读取同时会清除标志
rev_buf[addr++]=data;
//printf("addr:%drn",addr);
revice_start=1;//开始接收
time_out=0;//超级计数值清零
}
//串口中断接收函数
int ld3320_uart_receive(void)
{
//char * buf = NULL;
int num = 0;
if(revice_ok)
{
revice_ok=0;//清标志
printf("%srn",rev_buf);
printf("%srn",rev_buf);
printf("rev_buf is ok rn");
num = compare_usart((char *) rev_buf);
return num;
}
if(revice_start)//开始接收
{
Main_delay();
time_out++;
num=0;
if(time_out>=50)//超时就
{
revice_ok=1;
rev_buf[addr]='�';
addr=0;
time_out=0;
revice_start=0;
}
}
return 0;
}
//比较
/*
对比的BUF是直接定好的,宏定义方便使用
#define BUF_XIAOCHEN "收到rn"
#define BUF_LIANG "亮一点rn"
#define BUF_AN "变暗rn"
#define BUF_KAI "开灯rn"
#define BUF_GUAN "关灯rn"
#define BUF_SANSHI "亮度30rn"
#define BUF_LIUSHI "亮度60rn"
#define BUF_YIBAI "亮度100rn"
#define BUF_CONGFA "请重新识别发口令rn"
#define BUF_FA "请说出一级口令rn"
*/
int compare_usart(char * string_data)
{
if(strcmp(string_data, ( char *)BUF_XIAOCHEN) == 0) //比较接受字符内容 收到
{
printf("this is compare return 1rn");
return 1;
}
else if(strcmp((char *)rev_buf, (char *)BUF_LIANG) == 0)
{
return 2;
}
else if(strcmp((char *)rev_buf, (char *)BUF_AN) == 0)
{
return 3;
}
else if(strcmp((char *)rev_buf, (char *)BUF_KAI) == 0)
{
return 4;
}
else if(strcmp((char *)rev_buf, (char *)BUF_GUAN) == 0)
{
return 5;
}
else if(strcmp((char *)rev_buf, (char *)BUF_SANSHI) == 0)
{
return 6;
}
else if(strcmp((char *)rev_buf, (char *)BUF_LIUSHI) == 0)
{
return 7;
}
else if(strcmp((char *)rev_buf, (char *)BUF_YIBAI) == 0)
{
return 8;
}
else if(strcmp((char *)rev_buf, (char *)BUF_CONGFA) == 0)
{
return 9;
}
else if(strcmp((char *)rev_buf, (char *)BUF_FA) == 0)
{
return 10;
}
return 0;
}
经过这三步,就可以在主循环得到返回值,根据返回数值执行对应操作。
j=ld3320_uart_receive();//得到接受函数的字符串buff
//i=compare_usart(buff); //字符串buff和已知字符串对比的值
//i=1;
printf("j = %drn",j);
switch(j)
{
case 1:
//printf("1rn");
OLED_ShowChar(48,6,1);
//OLED_Clear();
break;//小陈
case 2: printf(" switch :2rn");break;//亮一点
case 3: printf(" switch :3rn");break;//变暗
case 4: printf(" switch :4rn");break;//开灯
case 5: printf(" switch :5rn");break;//关灯
case 6: printf(" switch :6rn");break;//
case 7: printf(" switch :7rn");break;//
case 8: printf(" switch :8rn");break;//
case 9: printf(" switch :9rn");break;//请重新识别发口令
case 10: printf(" switch :10rn");break;//请说出一级口令
//case 11: printf("11rn");break;//
default:break;
}
}
阅读全文