这篇主要了解通讯的概念:
全双工:同一时刻,两个设备之间可以同时收发数据;
半双工:两个设备之间可以收发数据,但不能在同一时间;
单工 : 一个设备固定发送,一个设备固定接收;
同步通讯:收发设备会使用一根信号线作为时钟信号,在其驱动下,双方进行协调以同步数据,通过规定在时钟的上升沿或下降沿对数据进行采集;
异步通讯:不使用时钟线,它在数据信号里穿插一些同步作用的信号位;或者以数据帧的格式传输,可以约定好传输速率,以便更好的同步。
比特率:每秒传输的二进制位数;
波特率:每秒传输的码元数;
串口通讯:现在使用到的一般是:RXD,TXD,GND三条信号线,数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口;协议层规定了数据包由起始位,主体数据,校验位,停止位组成;通讯双方的数据包的格式要一致才能正常收发数据;
- 起始位:一个逻辑0的数据位表示;
- 主体数据:通常被约定位5,6,7,8,位长;
- 校验位:奇偶校验,01校验,无校验;
- 停止信号:由0.5,1,1.5或2个逻辑1的数据位表示;
USART:通用同步异步收发器
UART:通用异步收发器
bsp_usart.h文件:
#ifndef __USART_H #define __USART_H #include"stm32f10x.h" #include"stdio.h" #define USARTx USART1 #define USART_CLK RCC_APB2Periph_USART1 #define USART_APBxClkCmd RCC_APB2PeriphClockCmd #define USART_BAUDRATE 115200 #define USART_TX_GPIO_PORT GPIOA #define USART_TX_GPIO_PIN GPIO_Pin_9 #define USART_RX_GPIO_PORT GPIOA #define USART_RX_GPIO_PIN GPIO_Pin_10//不要写成GPIOA_Pin_10 #define USART_GPIO_CLK RCC_APB2Periph_GPIOA #define USART_GPIO_APBxClkCmd RCC_APB2PeriphClockCmd #define USART_IRQ USART1_IRQn//在stm32f10x.h中 #define USART_IRQHandler USART1_IRQHandler//在启动文件中 void USART_Config(void); #endif
bsp_usart.c文件:
#include"bsp_usart.h" static void NVIC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//优先级分组 NVIC_InitStructure.NVIC_IRQChannel=USART_IRQ;//中断源 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断通道 NVIC_Init(&NVIC_InitStructure);//初始化配置 } void USART_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; //开启GPIO和 串口时钟 RCC_APB2PeriphClockCmd(USART_GPIO_CLK, ENABLE); RCC_APB2PeriphClockCmd(USART_CLK, ENABLE); //配置传输模式 GPIO_InitStructure.GPIO_Pin = USART_TX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(USART_TX_GPIO_PORT, &GPIO_InitStructure); //配置接受模式 GPIO_InitStructure.GPIO_Pin = USART_RX_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(USART_RX_GPIO_PORT, &GPIO_InitStructure); //配置串口工作模式 USART_InitStructure.USART_BaudRate = USART_BAUDRATE;//在.h文件里有定义 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//有线数据长度 USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位 USART_InitStructure.USART_Parity = USART_Parity_No ;//无检验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发一起 USART_Init(USARTx, &USART_InitStructure);//初始化配置 //配置中断 NVIC_Config(); //使能串口中断 USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE); //使能串口 USART_Cmd(USARTx, ENABLE); }
中断处理函数:
void USART_IRQHandler(void) { uint8_t ucTemp;//声明一个中间量供数据中转 if(USART_GetITStatus(USARTx,USART_IT_RXNE)!=RESET)//如果发生了中断 { ucTemp = USART_ReceiveData(USARTx);//MCU将接受到PC通过串口发送来的数据保存起来 USART_SendData(USARTx,ucTemp); //MCU将保存的数据再通过串口发送给PC } }
//以上这串代码就是通过PC上的串口调试助手发送数据到单片机上,然后单片机在把数据发送到PC上的串口调试助手
main.c文件:
#include "bsp_usart.h" int main() { USART_Config(); while(1) { } }