初级会员

- 积分
- 121
- 金钱
- 121
- 注册时间
- 2020-11-3
- 在线时间
- 26 小时
|

楼主 |
发表于 2020-12-8 16:55:45
|
显示全部楼层
void USART_Send_Byte(unsigned char byte)
{
while(__HAL_UART_GET_FLAG(&UART1_Handler,UART_FLAG_RXNE)==RESET); //等待发送数据寄存器空
USART1->TDR=byte;
while((USART1->ISR&0X40)==0); //循环发送,直到发送完毕
}
这样写也发不了声,下面是语音合成代码
void SYN6288_Speech( char * str )
{
char * p = str;
int len = 0,check=0xFD,i;//check异或校验
while( *p++ != 0 )//计算待发送文本长度
{
len++;
}
len+=3; //计算数据区长度
delay_ms(2); /*测试得出这里要加至少2ms的延时,不然如果连续发送语音会发生某些语音丢失的情况,
只延时1ms也会丢失,直接加载后面的8ms上也会发生丢失的情况*/
// while(SynBusy_Sta);
USART_Send_Byte(0xFD); //发送帧头
/*数据区长度高字节在前*/
USART_Send_Byte( len >> 8 );//发送数据区长度高八位
USART_Send_Byte( len );//发送数据区长度低八位
check = check ^ ( len >> 8 ) ^ ( len );//校验和
/*命令参数*/
USART_Send_Byte( 0x01 );//发送命令字->表示语音合成命令
USART_Send_Byte( 0x01 );//发送命令参数->不加背景音乐,文本GBK编码格式
/*异或校验*/
check = check ^ 0x01 ^ 0x01;//帧头和数据区长度字节做的异或校验
//发送文本内容
for( i = 0; i < len-3; i++ )
{
USART_Send_Byte(*str);
check ^= ( *str );
str++;
}
USART_Send_Byte(check); //发送异或检验
delay_ms(8);//数据手册要求帧与帧之间的发送间隔必须超过8ms
} |
|