当前位置: 首页 > article >正文

STM32CubeMX【串口收发USART】

第一步,配置cubemx

配置好点右上角生成

第二步,串口方式

阻塞式发送

英文、中文正常、浮点有口

/* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();//配置完自动生成的

发送到串口助手上 

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    //等想发的数据都发完了才会结束
        //5为字符串长度,0xFFFF为超时时间超过这个时间其余的数据就不发了
		HAL_UART_Transmit(&huart1,(uint8_t*)"Hello",5,0xFFFF);
		//&huart1是串口句柄 huart1存了串口的所有数据
		//(uint8_t*)"Hello"【字符串常量】需要传uint8_t*
		HAL_Delay(1000);
    }

从串口助手上发到单片机,再发回串口助手 

while(1){
uint8_t buf[5];//缓存一下

//接收数据,并返回到串口助手
HAL_UART_Receive(&huart1,(uint8_t*)buf,3,0xFFFF);
HAL_UART_Transmit(&huart1,(uint8_t*)buf,3,0xFFFF);
}

 printf函数进行串口发送

#include <stdio.h>//引入标准库头文件
//重写fputc,printf內部是通过它调用的
int fputc(int c,FILE*stream)
{
    uint8_t ch[1]={c};
    HAL_UART_Transmit(&huart1,ch,5,0xFFFF);
    return c;
}
//重写fgetc,scanf內部是通过它调用的
int fputc(FILE*stream)
{
    uint8_t ch[1];
    HAL_UART_Receive(&huart1,ch,1,0xFFFF);
    return ch[0];
}
while(1){
int val=0;
scanf("%d",&val);
printf("%d\r\n",val);//回车并换行

}

使用中断方式(每个字节都会进入一次中断)

不需要等待就能发送完毕

先去NVIC使能中断,调优先级(编号越大优先级越低)

uint8_t buffer[5];//定义成全局变量防止被销毁

int main()
{
//第一次触发中断接收语句
HAL_UART_Receive_IT(&huart1,buffer,3);

while(1){

}
return 0;
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
       //当完成了所有数据的发送时就会进入这个回调
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    //每发一个字节都会进入中断
    HAL_UART_Transmit_IT(&huart1,(uint8_t*)buffer,3);//不需要等待就能发送完毕
    //接收数据,并返回到串口助手

    HAL_UART_Receive_IT(&huart1,buffer,3);
}

DMA(搬运数据)方式(固定数据够了才发)

固定长度数据

uint8_t buffer[5];//定义成全局变量防止被销毁

int main()
{
//第一次触发中断接收语句,dma与中断不同是会接收完固定长的数据
HAL_UART_Receive_DMA(&huart1,buffer,3);

while(1){

}
return 0;
}
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
       //当完成了所有数据的发送时就会进入这个回调
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    //不用每发一个字节都会进入中断
    HAL_UART_Transmit_DMA(&huart1,(uint8_t*)buffer,3);//不需要等待就能发送完毕
    //接收数据,并返回到串口助手

    HAL_UART_Receive_DMA(&huart1,buffer,3);
}

空闲中断*

不定长接收,基于DMA的修改

uint8_t buffer[5];//定义成全局变量防止被销毁

int main()
{
//第一次触发中断接收语句,dma与中断不同是会接收完固定长的数据
HAL_UART_Receive_DMA(&huart1,buffer,3);

__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);

while(1){

}
return 0;
}

若不是0就是空闲中断了

extern uint8_t buffer[5];//it.c文件里得声明一下

 

3-用来获取DMA计数值

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{//当完成了所有数据的发送时就会进入这个回调
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    //不用每发一个字节都会进入中断
    HAL_UART_Transmit_DMA(&huart1,(uint8_t*)buffer,3);//不需要等待就能发送完毕
    //接收数据,并返回到串口助手

    HAL_UART_Receive_DMA(&huart1,buffer,3);
}

第三步,串口调试助手 

串口接线A10RX接TX,A9TX接RX

需要下USB转TTL的串口驱动,下正点原子的XCOM

保证波特率、数据位....都一致,(该串口助手是GB2312编码

keil中应该也得设置成GB2312编码才能正常传输中文


http://www.kler.cn/news/358840.html

相关文章:

  • Spring Boot:中小型医院网站开发新选择
  • 【4.8】图搜索算法-BFS解单词接龙
  • vr体验馆计时收银软件试用版下载 佳易王VR游戏厅计时计费管理系统使用操作教程
  • Map转Map
  • 【stm32】DMA的介绍与使用
  • 从0开始学Python-day6
  • Android视频编解码 MediaCodec使用(2)
  • 计算机毕业设计PySpark+Django深度学习游戏推荐系统 游戏可视化 游戏数据分析 游戏爬虫 Scrapy 机器学习 人工智能 大数据毕设
  • docker 和 containerd 关系
  • 现代开源个人航班跟踪系统AirTrail
  • 【OD】【E卷】【真题】【100分】热点网站统计(PythonJavaJavaScriptC++C)
  • string类的模拟实现
  • 软件压力测试如何进行?深圳软件测试机构分享
  • VsCode 如何自定义代码片段(Code Snippet)
  • 政府信息化项目验收检测有哪些注意事项?
  • Git-本地项目同步到远程仓库
  • Python游戏编程入门注-第2章2
  • Anzo Capital 昂首资本带你解读货币相关性
  • Spring MessageSource国际化原理
  • 自动化运维:提升效率与降低风险的关键