一.stm32通信模块
二.串口参数及时序
2进制里,1波特=1bit
三.USART
1 .事项
1.硬件流控制:防止发送过快覆盖数据
2.APB2:USART1
APB1:USART2、USART3
2.内部结构
3.步骤
(1)打开USART和GPIO的时钟
(2)GPIO初始化:TX设为复用输出,RX为输入
(3)配置USART结构体
(4)接收:配置NVIC和ITConfig
四.函数
1.配置时钟输出
void USART_ClockInit(USART_TypeDef* USARTx, USART_ClockInitTypeDef* USART_ClockInitStruct);
void USART_ClockStructInit(USART_ClockInitTypeDef* USART_ClockInitStruct);
2. 开启USART到DMA触发通道
void USART_DMACmd(USART_TypeDef* USARTx, uint16_t USART_DMAReq, FunctionalState NewState);
3.发送数据
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
4.接收数据
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
五.Ascll码
六.串口事项
1. printf和sprintf
用printf只能在一个串口打印
用sprintf先打印到数组,再用Serial_SendString()
2.封装springtf(C语言可变参数)
(1)#include "stdarg.h"
void Serial_Printf(char *format,...)
void Serial_Printf(char *format,...)
{
va_list arg; //定义一个参数变量
va_start(arg,format); //从format中接收参数表放在arg里
vsprintf(String,format,arg);va_end(arg); //释放参数表
Serial_SendString(String);}
七.串口发送
中断/查询
1.查询:在主函数不断调用(一般不用)
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)
{
RxData=USART_ReceiveData(USART1);
OLED_ShowHexNum(1,1,RxData,2);}
2.中断,配置NVIC
八 .UTF-8乱码问题
c/c++处写
--no--multibyte-chars
九.串口数据包
1.HEX数据包发送
(1) 包头包尾和数据载荷重复
1.限制载荷数据范围,对数据进行限幅,例如0~100;
2.使用固定长度数据包
3.增加包头包尾数量,例如:FF FE为包头,FD FC为包尾
2.HEX数据包接收
“数据包”
1.定义状态(画几个圈)
2.。。。