原子哥 串口通信代码笔记2

本人小白 有什么错误多多指教 

串口收发状态的函数USART_GetFlagStatus和USART_GetFlagStatus

函数USART_GetITStatus与USART_GetFlagStatus的区别是:该函数不仅会判断标志位是否置1,同时还会判断是否使能了相应的中断。通常在中断函数中使用

USART_GetFlagStatus(USART1, USART_FLAG_TC);当其置1 标志着串口1发送完成

USART_GetFlagStatus(USART1, USART_FLAG_RXNE);当其置1 标志着串口1接收完成

USART_GetITStatus(USART1, USART_IT_RXNE);当其置1 标志着串口1接收完成且接收中断开启

USART_GetITStatus(USART1, USART_IT_TC);当其置1 标志着串口1发送完成且发送中断开启

在此解释一下USART_IT_TC和USART_IT_TXE的区别  TC表示发送完成 TXE表示发送了但并未完成(USART_FLAG_TC和USART_FLAG_TXD同理)

简单举个例子:你要发送10个数据  此时已经发送了5个,第六个还未发送,对于TXE来说它已发送了 它的USART_GetITStatus函数置1 但对TC来说并未发送完成它的USART_GetITStatus函数置0

串口发送函数 单片机发送给其他外设

方法1:USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

方法2:USART1->DR=Data;  //将数值赋给DR寄存器 通过寄存器直接发送出去

方法3:printf("%d",200);  //以这样的方式发送数据

方法1和方法2的缺陷为只能发送单个字符单个参数 方法3可以发送字符串和多个参数

许多STM32不可以直接使用printf 则需要加入以下代码

#if 1
#pragma import(__use_no_semihosting)             
//标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 

}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
_sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
	return ch;
}
#endif 

 或者勾选以下的Use MicroLI选项来支持printf函数使用:

 也可以自行设置函数来达到使用USART_SendData函数发送字符串的目的

串口接收函数

USART_ReceiveData(USART_TypeDef* USARTx);

你可能感兴趣的:(stm32,物联网)