串口的发送与中断接收简单应用
前言
本文为作者在复习串口通信协议后进行的知识总结,希望在分享自己对串口通信理解的同时,能够对各位读者有所帮助,谢谢。
一、串口通信
(1)含义
串口通信是一种设备与设备之间常用的全双工通信协议。大部分使用都是异步通信,若需要同步通信,可以添加时钟线实现。
(2)硬件接线
USART通信常由4根线组成,分别是VCC电源线、GND地线、RXD接收线以及TXD发送线。需要注意的是,两个设备的RXD要连接TXD,TXD要连接RXD。若两个设备都有独立电源供电,那么VCC电源线即可除去。
(3)参数
以下是串口通信的参数
波特率:串口通信的速率,单位是bps,即每秒传输多少位数据。倘若通信双方由于通信速率不同,则可能导致接收数据发生错误。
起始位:标志着某一数据帧的开始,在空闲状态时数据线为高电平,起始位会将其拉低为低电平,标志着开始传输数据帧。
数据位:用于承载数据,有 “0” 和 “1”两种表示状态,在数据帧中通常有8位。
停止位:在传输完数据位后,会再传输一位停止位,固定为高电平,使得方便接收下一数据帧。
校验位:用于校验数据是否传输正确,串口通信采用的是奇偶校验法。
二、硬件接线图
(1)引脚连接
RX----PA2
TX----PA3
GND---GND
VCC---5V
(2)代码部分
main.c
uint16_t RX_DATA;//串口接收数据
#define LED_ON GPIO_ResetBits(GPIOB, GPIO_Pin_5) //打开LED灯
#define LED_OFF GPIO_SetBits(GPIOB, GPIO_Pin_5) //关闭LED灯
int main(void)
{
LED_Init();
Bluetooth_Init();//蓝牙模块初始化
OLED_Init();
while(1)
{
}
}
//蓝牙中断服务函数
void USART2_IRQHandler(void)
{
OLED_Init();
if (USART_GetITStatus(USART2, USART_IT_RXNE) == SET)
{
RX_DATA=USART_ReceiveData(USART2);
if(RX_DATA==0x30)
{
LED_ON;
OLED_ShowString(0, 0, "LED ON", OLED_8X16);
OLED_Update();
}
if(RX_DATA==0X31)
{
LED_OFF;
OLED_ShowString(0, 0, "LED OFF", OLED_8X16);
OLED_Update();
}
OLED_ShowHexNum(0, 16, RX_DATA, 4, OLED_8X16);
OLED_Update();
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}
}
Bluetooth.c
void Bluetooth_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_Init(USART2, &USART_InitStructure);
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
USART_Cmd(USART2, ENABLE);
}
三、蓝牙模块控制LED亮灭现象
总结
本文仅介绍了串口通讯的基本概念以及简单应用,串口打印还可用于程序调试中,是个很好的调试工具,希望本文对各位读者有所帮助。