| 
 
中级会员  
 
	积分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()的错误死循环。
 }
 
 
 
 | 
 |