定长数据、不定长数据收发(另附proteus仿真)"/>
记录5——stm32f411ceu6之串口实现定长数据、不定长数据收发(另附proteus仿真)
目录
- 1.定长数据收发
- 任务
- 代码实现
- Proteus 仿真
- 2.不定长数据收发
- 任务
- stm32cubemx配置
- 代码实现
- 效果
1.定长数据收发
任务
利用UART实现任意长度数据的发送,单片机接收到数据后再将数据原样发送给电脑
代码实现
/* USER CODE BEGIN PV */
uint8_t RxBuffer[10];//定义接收区缓冲量
/* USER CODE END PV */
while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_UART_Receive(&huart2,RxBuffer,5,0xFFFF);HAL_UART_Transmit(&huart2,RxBuffer,5,0xFFFF);}/* USER CODE END 3 */
Proteus 仿真
- 同样由于proteus的stm32类型有限,此处以f103c6为例,进行proteus模拟仿真,相关配置参照前面的方法利用CubeMX+Keil+Proteus即可。
注意:设置Crystal Frequency时一定要和之前Cube MX 的时钟树中的相同,否则虚拟串口出现的只是乱码
-
此处使用USANT8 异步通信,PA9为TX(发送),PA10为RX(接收)。
-
实现效果:
开始模拟时会跳出虚拟串口窗口;
当每输入5个字符,窗口会显示一次这5个字符。如图,显示的是hello中5个字符。
2.不定长数据收发
任务
利用UART实现任意长度数据的发送,单片机接收到数据后在末尾加上换行符发送给电脑。
stm32cubemx配置
UART与DMA开启方法在之前的对应部分有介绍
详情请见:
记录2——stm32f411CEU6的LED灯玩UART+DMA通信、外部中断EXIT、定时器中断(另含Proteus仿真)
代码实现
main.c中
/* USER CODE BEGIN PV */
uint8_t RxBuffer[100];//定义接收区缓冲量
/* USER CODE END PV */
/* USER CODE BEGIN PD */
#include "string.h"//为了后面可以使用strcat连接两个数组
/* USER CODE END PD */
/* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 */HAL_UART_Receive_DMA(&huart2,RxBuffer,50);//开启接收区的DMA__HAL_UART_ENABLE_IT(&huart2 ,UART_IT_IDLE);//使能空闲中断/* USER CODE END 2 */
stm32f4xx_it.c中
手动添加空闲中断的内容
/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */
extern uint8_t RxBuffer[100];//外部声明
/* USER CODE END PV */
(在C语言中,修饰符extern用在变量或者函数的声明前,用来说明“此变量/函数是在别处定义的,要在此处引用")
void USART2_IRQHandler(void)
{/* USER CODE BEGIN USART2_IRQn 0 */if(__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE) != RESET )//获取的空闲中断标志位非0,此时说明触发空闲中断{char str[]="\r\n";//换行用数组包含回车加换行__HAL_UART_CLEAR_IDLEFLAG(&huart2);//清除空闲中断标志位HAL_UART_DMAStop(&huart2);//数据已传输结束,停止DMA接收uint8_t len= 50- __HAL_DMA_GET_COUNTER(huart2.hdmarx);//总数-剩余字节数=实际接收字节数strcat((char*)RxBuffer ,str );HAL_UART_Transmit_DMA(&huart2,RxBuffer,len+2);//将接收的字节数重新发送回电脑HAL_UART_Receive_DMA(&huart2,RxBuffer,50);//再次开启DMA接收}/* USER CODE END USART2_IRQn 0 */
补充:
DOS和Windows:需要\r\n才解析为有效的回车换行,否则只有回行首或只有换行。
Unix和Mac OS X:将\n解析为有效的回车换行。
Macintosh/OS 9:将\r解析为有效的回车换行。
\r代表Carriage Return;
\n代表Line Feed。
效果
更多推荐
记录5——stm32f411ceu6之串口实现定长数据、不定长数据收发(另附proteus仿真)
发布评论