stm32cube生成工程 串口发送和接收

1.printf函数重定向

①以stm32f103rct6的usart1为例,打开cube,配置好RCC和USART1,生成mdk程序。

②打开工程,在main.c中

/* USER CODE BEGIN Includes */下面添加

#include“stdio.h”

/* USER CODE BEGIN PV */下面添加

int fputc(int ch, FILE *f)
{
USART1->DR=(uint8_t)ch;
while((USART1->SR&0X40)==0);//等待发送结束

return ch;
}
int GetKey(void)
{
while (!(USART1->SR & 0x20));
return ((int)(USART1->DR & 0x1FF));
}

至此,可以使用printf函数通过USART1打印数据。配置其他串口如USART2并将fputc和GetKey函数中的USART1改为USART2,即可用printf函数通过USART2打印数据了。

2.用stm32cube配置好串口后生成mdk程序,发送可以直接使用HAL_UART_Transmit(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size, uint32_t Timeout)这个函数。一般Size就写1,timeout也小点,10-50吧。

接收稍微麻烦点,①在初始化时,用HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)手动打开串口接收中断。

②修改串口接收中断的回调函数,对接收的数据进行处理。

例如:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
RxBuff[Rx_Count++]=RxByte;

if(RxByte==0x0A)
{
HAL_UART_Transmit(&huart1,RxBuff,Rx_Count,10);
Rx_Count=0;
}
if(Rx_Count>=254)
{
Rx_Count=0;
}
HAL_UART_Receive_IT(&huart1,&RxByte,1);      //因为根据初始化时HAL_UART_Receive_IT(&huart1,&RxByte,1);意思是接收一个字节就要关中断,接收内容放在RxByte中。所以在中断回调函数中我们又要重新打开1字节中断。这样形成循环。
}

串口中断回调函数名就是HAL_UART_RxCpltCallback是不能改的,函数内容可改。这样简单的接收处理对发送的数据有要求就是,发送数据最后一个字节必须是0x0a,所以有其局限性,以后加上串口超时功能就可以了。

别忘了设置全局变量

uint8_t TxBuff[]="hello world!";
uint8_t RxBuff[255];
uint16_t Rx_Count;
uint8_t RxByte;

时间: 2024-10-10 08:26:22

stm32cube生成工程 串口发送和接收的相关文章

STM32Cube IDE配置串口发送与接收

此项目源码下载地址:https://github.com/lizhiqiang0204/STM32CubeIDE_Uart 串口与中断配置如下 在生成的main函数中,添加开启串口接收中断 HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USE

单片机C51串口发送、接收寄存器

所以,发送和接收寄存器可使用同一地址,编写验证程序(发送和接收是独立空间):读取一个数(1)->发送一个数(2)->再读取得1则是独立空间 不知道STM32串口寄存器和C51串口寄存器是否同样道理 STM32串口寄存器:STM32的发送与接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包含了TDR和RDR,对它读操作,读取的是RDR寄存器的值,对它的写操作,实际上是写到TDR寄存器的:当向该寄存器写数据的时候,串口就会自动发送,当收到收据的时候,也是存在该寄存器内. 同步与异步

关于单片机串口发送和接收的问题

串口初始化过程: 1.确定T/C1的工作方式--TMOD 2.设置T/C初始值----------------------------TH1.TH2 3.启动T/C-----------------------------------TR1 4.串行口的控制------------------------------SCON 5.串口在中断方式下,需要开CPU和源中断----IE 总结:不一定需要使用中断函数,可以在main函数里面的while里面判断RI和TI是否等于1, 如果不使用中断函数i

串口发送二进制数据

串口想要利用Mscomm控件发送任何数据 不管是什么类型的都得转换成VARIANT型的变量,顺便提醒一下 想要串口发送和接收(好像尤指接收)二进制数据 要把那个InputMode 设置为 1  ( Binary ), 0 代表的是 Text. 再有一个vc不管只是vc,而是所有针对于Windows的开发环境而言,只要他是在WIN API的基础上的都有BYTE这个类型,这个类型顾名思义就是一个字节,比如你想发送的127  = 0xFF,你可以BYTE byVal = 0xFF;还有你如果用的是 M

C#串口通信—向串口发送数据,同步接收返回数据

最近写C#串口通信程序,系统是B/S架构.SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了.所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件.经过测试,可以正常使用(不支持多线程调用). 一.Machine类 1.Machine类有一个静态变量,定义如下: private static SerialPort serialPort = null; 2.向串口发送数据,同步接收返回数据的方

C# ---串口发送接收数据实例

硬件设备: pH/ORP 电导率/TDS/盐度 溶解氧 2000/3000/5000/5500 变送器/控制器 设定: P-08:RS-485输出设定 P-11:485传输设定 设定这俩种的ID号 根据ID,对串口发送请求:接收串口返回的数据. C# ---串口发送接收数据实例

stm32RS485串口通信——中断接收发送数据

功能:通过PC机的串口调试助手发送数据给串口A,串口B接收到串口A发送的数据,再由串口B将接收到的数据返回给PC机的串口调试助手. PC->串口A->串口B->PC. 实验平台:stm32f407 /********************************************************************* 本平台具有六个串口: com1  485 com2 com3  232 需一个管脚控制DTU com4 485 com5  调试串口  TTL com6

串口通信基础,接收,发送数据

通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种.它们的区别是: 串行通信的分类 1.按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输:    半双工:允许数据在两个方向上传输.但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信:它不需要独立的接收端和发送端,两者可以合并一起使用一个端口.    全双工:允许数据同时在两个方向上传输.因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端.

Bluemix结合RabbitMq实现消息发送与接收实例

什么是RabbitMq? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消 息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过 队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求. 什么是Bluemix? BlueMix 是 IBM 基于 Cloud Foundr