OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7797|回复: 4

51单片机代码移植到了stm32平台 串口发送数据不正确...

[复制链接]

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-3-30
在线时间
0 小时
发表于 2013-3-30 15:05:46 | 显示全部楼层 |阅读模式
在学校做小玩意的时候要在板子上挂一个语音芯片,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  ”,一样也是没有帧头,而且结尾多出一位,校验位不正确...实在是太纠结了

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-30 15:23:46 | 显示全部楼层
USART1->DR = text;
xor^=(text);
while((USART1->SR&0X40)==0);//等待发送结束

这种写法要调转一下,改为:
xor^=(text);
while((USART1->SR&0X40)==0);//等待发送结束
USART1->DR = text;
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-3-30
在线时间
0 小时
 楼主| 发表于 2013-3-30 15:37:47 | 显示全部楼层
谢谢原子哥,太厉害了~~~
按照你说的方式改了,然后看了下串口数据不对,接着耍了个小聪明,将length+3改成length+2,这样才可以发声,不知道根结在哪,是因为平台不同吗。
回复 支持 反对

使用道具 举报

2

主题

15

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-3-30
在线时间
0 小时
 楼主| 发表于 2013-3-30 17:35:48 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
回复【2楼】正点原子:
---------------------------------
谢谢原子哥,太厉害了~~~ 
按照你说的方式改了,然后看了下串口数据不对,接着耍了个小聪明,将length+3改成length+2,这样才可以发声,不知道根结在哪,是因为平台不同吗。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-3-30 18:59:16 | 显示全部楼层
回复【4楼】慢慢学:
---------------------------------
lenth这个,要看你的芯片了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-22 06:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表