1.STM32CubeMX的配置没啥子好说的,使能然后改一下波特率和字长,然后在将中断勾选,把中断等级调到1(一定要比systick的优先级垃圾!!!)

2.驱动代码

在生成的it.c文件中,例如用的是串口3,防止串口的ORE的bug粗现

void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE)!=RESET)
__HAL_UART_CLEAR_OREFLAG(&huart1);
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
/* USER CODE BEGIN USART1_IRQn 1 */ /* USER CODE END USART1_IRQn 1 */
}

  

在用户文件userUtility.c中,第一个函数也是为了防止串口出ORE的bug,第二个函数用于接收

void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
if(__HAL_UART_GET_FLAG(huart, UART_FLAG_ORE)!=RESET)
__HAL_UART_CLEAR_OREFLAG(huart);
}
/*-----------------------------------------------------------*/ /*-----------------------------------------------------------*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart1)
{
vUart1RecData();
}
else if(huart == &huart4)
{
vUart4RecData();
}
}

  

串口的驱动文件中

#define UARTX_RX_BUF_MAX_LEN 32
#define UARTX_TX_BUF_MAX_LEN 32 static uc prv_ucUartxRxBuf[UARTX_RX_BUF_MAX_LEN];
static uc prv_ucUartxRxLen;
static uc prv_ucUartxTxBuf[UARTX_TX_BUF_MAX_LEN];
static uc prv_ucUartxTxLen; void vStartUartxRecIt(void)//初始化函数,开启串口接收中断
{
HAL_UART_Receive_IT(&huart1, prv_ucUartxRxBuf,);
} void vUartxRecData(void)
{
prv_ucUartxRxLen=;
while(HAL_UART_Receive(&huart1, &prv_ucUartxRxBuf[prv_ucUartxRxLen], , )==HAL_OK)//进入阻塞接收2ms接不到就不算在同一包数据中,就是因为这里内部用了sysytick来延时,所以要注意中断优先级
{
prv_ucUartxRxLen++;
if(prv_ucUartxRxLen>=UARTX_RX_BUF_MAX_LEN)
{
break;
}
}
controlData.ucUart1RxFlg=;
} void vHandleUartxRxBuf(void)
{
if(controlData.ucUart1RxFlg==)//通过一个Flg来耦合接收和处理函数,处理函数看情况放在userWhile中或者直接放在TIM6的回调函数中,多少ms执行一次,充当实时任务
{
//
//Handle code
//
memset((uc *)&prv_ucUartxRxBuf,,sizeof(prv_ucUartxRxBuf));
controlData.ucUart1RxFlg=;
vStartUartxRecIt();
}
}

3.串口发送数据的时候

HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)

这个函数最好用

__disable_irq();


__enable_irq();

夹起来,一来是为了防止发送的时候,有中断来造成数据传输有“断包”的现象,二来是避免发送数据的时候同时接到数据

产生ORE这种BUG

PS;有的人看到可能会说CLEAR_LG这个宏函数,要求输入的参数和GET_ERROR返回的值,参数类型不一样,但其实看一下底层的宏定义会发现,

就tm是同一个玩意儿

最新文章

  1. oracle 自增长序列
  2. day27_反射
  3. Myeclipse 找不到Convert to maven project选项
  4. Huffman
  5. Java SE 第二十四讲----static与final使用陷阱关键字
  6. C# 多线程---------<一>
  7. CentOS 关闭蜂鸣
  8. Android-IA Power Manager (S3)
  9. java 导出excel(复杂案例)
  10. UVA 11992 线段树
  11. dojo、iframe和FusionCharts兼容性
  12. 【Unity3D与23种设计模式】策略模式(Strategy)
  13. Rails + React +antd + Redux环境搭建
  14. contentType,charset和pageEncoding的区别
  15. Java Web 项目发布到Tomcat中三种部署方法
  16. Delphi之TStrings和TStringLists类
  17. 终于把eShopOnContainer部署成功了。
  18. Java虚拟机------JVM内存区域
  19. Linux程序设计:进程通信
  20. Java之静态代码块

热门文章

  1. 安装软件,遇到弹框Windows Installer Coordinator,一直循环卡在这个弹框处
  2. python数据类型及其详解
  3. []、()、None的区别
  4. HC-05蓝牙模块配对步骤
  5. model 字段参数 choice
  6. React-Native android 开发者记录
  7. vue踩坑(二):跨域以及携带cookie
  8. 生成式对抗网络(GAN)实战——书法字体生成练习赛
  9. 第一个spring简单的helloworld
  10. String、StringBuilder、StringBuffer 区别