USART串口发送的三种方式
发送方式如果以字符方式发送,则按照ASCLL码表中该数值对应的字符发送即可,也可使用‘u’加单引号的方式发送。
/* 发送方法1 */
USART_SendData(USART1 , 0x55); //发送单个数值
while(USART_GetFlagStatus(USART1, USART_FLAG_TC)==RESET); //检查发送中断标志位
/* 发送方法2 */
printf("STM32F103 "); //纯字符串发送数据到串口
printf("STM32 %d %d ",a,b); //纯字符串和变量发送数据到串口,a符号变量
//其中%d的意思是将后面的字母a,b转换成十进制数显示,%d的位置可以随意摆放,显示时用后面的字母以%d的形式代替。
/* 发送方法3 */
USART1_printf("STM32 %d %d ",a,b);
USART2_printf("STM32 %d %d ",a,b);
USART3_printf("STM32 %d %d ",a,b);
// printf是专用与某个串口的函数,需要通过下面宏定义来实现,某时刻只能用于一个串口。
#define USART_n USART1 //定义使用printf函数的串口,其他串口要使用USART_printf专用函数发送
//利用相同的方法定义,使用发送方法3可以同时使用串口的发送。
USART串口接收的两种方式
//查询方式接收
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE) != RESET){ //查询串口待处理标志位
a =USART_ReceiveData(USART1);//读取接收到的数据
}
//电脑发送的数据正好是8位数据,a定义的是8位类型,缺点是实时性不高,占用CPU空间。
//中断方式接收(只要有中断标志位置1,则进入中断服务程序)
USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);//开启ENABLE/关闭DISABLE中断
void USART1_IRQHandler(void){ //串口1中断服务程序(固定的函数名不能修改)
u8 a;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ //接收中断(接收到的数据必须是0x0d 0x0a结尾) ,检查是否是接收中断(中断原因很多,只要有一个中断标志位变化,就进入中断,因此需要判断)
a =USART_ReceiveData(USART1);//读取接收到的数据
printf("%c",a); //把收到的数据发送回电脑
}
}
超级终端
超级终端中回车键按下后,会连续返回发送两个值给单片机,分别为0x0d(回车)、0x0a(换行)这时分别检测即可,在程序中通过设置相关的中断标志变量来检测回车键的按下。
extern u16 USART1_RX_STA; //接收状态标记
初值为0,通过接收修改改变其值,在中断程序中判断:
程序如下:
void USART1_IRQHandler(void){ //串口1中断服务程序(固定的函数名不能修改)
u8 Res;
//以下是字符串接收到USART_RX_BUF[]的程序,(USART_RX_STA&0x3FFF)是数据的长度(不包括回车)
//当(USART_RX_STA&0xC000)为真时表示数据接收完成,即超级终端里按下回车键。
//在主函数里写判断if(USART_RX_STA&0xC000),然后读USART_RX_BUF[]数组,读到0x0d 0x0a即是结束。
//注意在主函数处理完串口数据后,要将USART_RX_STA清0
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET){ //接收中断(接收到的数据必须是0x0d 0x0a结尾)
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
printf("%c",Res); //把收到的数据以 a符号变量 发送回电脑
if((USART1_RX_STA&0x8000)==0){//接收未完成
if(USART1_RX_STA&0x4000){//接收到了0x0d
if(Res!=0x0a)USART1_RX_STA=0;//接收错误,重新开始
else USART1_RX_STA|=0x8000; //接收完成了
}else{ //还没收到0X0D
if(Res==0x0d)USART1_RX_STA|=0x4000;
else{
USART1_RX_BUF[USART1_RX_STA&0X3FFF]=Res ; //将收到的数据放入数组
USART1_RX_STA++; //数据长度计数加1
if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}