在学校做小玩意的时候要在板子上挂一个语音芯片,51单片机上调通了,也有例程代码,但是自己移植到STM32开发板的时候,串口的数据老是不正确,自己研究了好久,也没有看出门道,希望各位高手帮我看下,指点指点。
先贴上51的主程序:串口初始化部分删了~
#include <reg51.h>
#include <string.h>
|
void main(void)
{
/****************需要发送的文本**********************************/
char code text[ ] = {"中文语音合成芯片"};
unsigned char headOfFrame[5];
unsigned char length ;
unsigned char ecc = 0 ;//定义校验字节
unsigned int i = 0;
length = strlen(text);//需要发送文本的长度
|
/*****************发送过程**************************************/
headOfFrame[0] = 0xFD ;//构造帧头 FD
headOfFrame[1] = 0x00 ;//构造数据区长度的高字节
headOfFrame[2] = length + 3;//构造数据区长度的低字节
headOfFrame[3] = 0x01 ;//构造命令字:合成播放命令
headOfFrame[4] = 0x01 ;//构造命令参数:编码格式为 GBK
|
for(i = 0; i<5; i++)
{
ecc=ecc^(headOfFrame);
SBUF = headOfFrame;
while (TI== 0) {;}
TI = 0;
}
|
for(i = 0; i<length; i++)
{
ecc=ecc^(text);
SBUF = text;
while (TI== 0) {;}
TI = 0;
}
|
SBUF=ecc;
while (TI== 0) {;}
TI=0;
while(1);
|
单片机的代码用串口调试助手接收到的十六进制的内容是“FD 00 13 01 01 D6 D0 CE C4 D3 EF D2 F4 BA CF B3 C9 D0 BE C6 AC F3 ”。其中前五个是相关命令信息,中间16个是文本中6个文字的16进制GBK编码,最后一个是校验位(初始的时候是0x00,然后依次和命令字、文本异或),调试之后可以清楚发音。
下面是自己改变移植的,主程序如下:
#include <stm32f10x_lib.h>
#include "sys.h"
#include "usart.h"
#include "string.h"
int main(void)
{
//while (1) {
unsigned char text[ ] = {"中文语音合成芯片"};//需要发送的文本
unsigned char head[5];
unsigned int length = 0;
unsigned char xor=0;
unsigned int i = 0;
length =sizeof(text); //需要发送文本的长度
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化为9600
/* USART1->DR=0xFD;
xor^=0xFD;
while((USART1->SR&0X40)==0);//等待发送结束
USART1->DR=0x00;
xor^=0x00;
while((USART1->SR&0X40)==0);//等待发送结束
USART1->DR=length;
xor^=length;
while((USART1->SR&0X40)==0);//等待发送结束
USART1->DR=0x01;
xor^=0x01;
while((USART1->SR&0X40)==0);//等待发送结束
USART1->DR=0x01;
xor^=0x01;
while((USART1->SR&0X40)==0);//等待发送结束
*/ 这里注释掉的这部分是第一次编的,输出的有点奇怪。后来直接仿照单片机的来了。用这个串口输出的是“00 11 01 01 D6 D0 CE C4 D3 EF D2 F4 BA CF B3 C9 D0 BE C6 AC 00 F1 ”,没有帧头0xFD,结尾部分不正确。
head[0]=0xFD;
head[1]=0x00;
head[2]=length+3;
head[3]=0x01;
head[4]=0x01;
for(i = 0; i<5; i++) //依次发送待合成的文本数据
{
xor^=(head);
USART1->DR = head;
while((USART1->SR&0X40)==0);//等待发送结束
} //这就是另外一个版本的
for(i = 0; i<length; i++) //依次发送待合成的文本数据
{
USART1->DR = text;
xor^=(text);
while((USART1->SR&0X40)==0);//等待发送结束
}
USART1->DR=xor;
while((USART1->SR&0X40)==0);//等待发送结束
while(1);
}
串口输出的结果是“ 00 14 01 01 D6 D0 CE C4 D3 EF D2 F4 BA CF B3 C9 D0 BE C6 AC 00 F4 ”,一样也是没有帧头,而且结尾多出一位,校验位不正确...实在是太纠结了
|