中级会员
- 积分
- 269
- 金钱
- 269
- 注册时间
- 2016-1-25
- 在线时间
- 75 小时
|
发表于 2016-1-26 15:37:38
|
显示全部楼层
本帖最后由 ljmf5 于 2016-1-26 16:40 编辑
关于串口通信有个问题,程序如下
我在串口输出之前使用了一个printf(),首字符就不显示了,注释掉printf()之后,显示正常
//重定义fputc函数
int fputc(int ch, FILE *f)
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
USART_SendData(USART1,(uint8_t)ch);
return ch;
}
串口程序如下所示(注意红色部分)
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
int main(void)
{
u8 t=0;
u8 tt='A';
u8 aa;
delay_init();
uart_init(9600); //串口初始化为9600
//printf("\n345\n");//加了这个就不显示“A”
USART_ClearFlag(USART1,USART_FLAG_TC);
for(t=0;t<5;t++)
{
aa=tt+t;
//aa=tt+t;
USART_SendData(USART1, aa);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
USART_SendData(USART1, '\n');
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//必须发送一次,判断一次,
//若不进行判断,则转义字符不能发送
}
while(1); //没有最后的“while(1);”,就出现重复三次,之后就进入HardFaultException()的错误死循环。
}
将重定向函数改成
//重定义fputc函数
int fputc(int ch, FILE *f)
{
USART_SendData(USART1,(uint8_t)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
return ch;
}
串口函数改成下面的代码(注意红色部分),就没有问题了
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
int main(void)
{
u8 t=0;
u8 tt='A';
u8 aa;
delay_init();
uart_init(9600); //串口初始化为9600
USART_ClearFlag(USART1,USART_FLAG_TC); //必须在printf之前将Tc清零,否则首字符不显示
printf("\n345\n");//加了这个就不显示“A” ,将重定向的判断语句放在后面就可以了
printf("\nabc\n");
//USART_ClearFlag(USART1,USART_FLAG_TC);
for(t=0;t<5;t++)
{
aa=tt+t;
USART_SendData(USART1, aa);//向串口1发送数据
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
USART_SendData(USART1, '\n');
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//必须发送一次,判断一次,
//若不进行判断,则转义字符不能发送
}
while(1); //没有最后的“while(1);”,就出现重复三次,之后就进入HardFaultException()的错误死循环。
}
|
|