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

中国采购网官方网站网站分屏布局设计

中国采购网官方网站,网站分屏布局设计,网站建设费开票收候开在哪个类别里,赣州网络营销USART串口通讯 一、轮询模式 1.设置所接引脚为UART异步模式 选择完成CTRLS保存。 2.编写测试代码(自动发送hello world) 在mian函数里面编写代码 原函数 调用函数,需要数据类型一致,使用函数通过串口发送数组里面的数据 打开串…

USART串口通讯

一、轮询模式

1.设置所接引脚为UART异步模式

在这里插入图片描述在这里插入图片描述

  • 选择完成CTRL+S保存。

2.编写测试代码(自动发送hello world)

  • 在mian函数里面编写代码
    在这里插入图片描述
  • 原函数
    在这里插入图片描述
  • 调用函数,需要数据类型一致,使用函数通过串口发送数组里面的数据
    在这里插入图片描述
  • 打开串口助手测试
  • 选择对应的端口,波特率需要一致。
    在这里插入图片描述

3.编写接收数据的代码

在这里插入图片描述

  • 通过串口助手测试代码正常使用。
    在这里插入图片描述

二、中断模式收发

1.打开URAT的中断功能,然后保存自动生成代码

在这里插入图片描述

2.使用中断发送数据

在这里插入图片描述

3.使用中断接收数据

  • 串口使用中断模式来接收信息,没有等待时间,如果程序写在while循环中,会有这次数据还没有接收完成就去接收下次数据的情况,所以需要将对应程序写在中断函数的回调函数中。
  • 在stm32f1xx_hal_uart.c文件中,有一个回调函数,我们可以重新定义其内容
    在这里插入图片描述
  1. 将定义的数组改成全局变量
/* USER CODE BEGIN PV */
uint8_t receiveData[2];
/* USER CODE END PV */
  1. 复制回调函数到main.c文件中,重新定义回调函数
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {HAL_UART_Transmit_IT(&huart1, receiveData, 2);GPIO_PinState state = GPIO_PIN_SET;	if (receiveData[1] == '1') {state = GPIO_PIN_RESET;if (receiveData[0] == 'L') {HAL_GPIO_WritePin(GPIOB, LED_MCU_Pin, state);}}if (receiveData[1] == '0') {state = GPIO_PIN_SET;if (receiveData[0] == 'L') {HAL_GPIO_WritePin(GPIOB, LED_MCU_Pin, state);}}HAL_UART_Receive_IT(&huart1, receiveData, 2);				//每次执行完回调函数内容后,要继续为下次接收开启串口接收数据
}
/* USER CODE END 0 */

3.串口使用DMA模式接收发送数据

  • 无论用上面哪种方式,询问或者中断,都会占用CPU,所以可以使用DMA来搬运数据,等搬运完成触发中断就可以去处理。减少了对CPU的占用率。
  1. 开启DMA功能。
    在这里插入图片描述
  2. 将串口中断函数改成DMA函数,修改其后缀即可,其他不变。
    在这里插入图片描述
    在这里插入图片描述
  3. 下载调试发现程序正常,正常接收发送数据。

4.串口接收不定长数据

  • 我们可以认为空闲(ldle)中断发生时,就是一帧数据包接收完成了,此时再对数据进行分析处理即可。
  HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));/* 接收空闲中断,接收长度是最大长度。而不是接收数据的长度。可以设置为数组的长度。而数组的长度要尽量大。不至于溢出 */
  • HAL_UARTEx_ReceiveToIdle_DMA对应的回调函数不是之前RxCpltCallback回调函数了,而是RxEventCallback这个回调函数了。
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {if (huart == &huart1) {									//判断触发的中断是哪个中断HAL_UART_Transmit_DMA(huart, receiveData, Size);	//将接收的数据发送回去HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));		//重新启动接收函数}
}
  • 下载代码,连接电脑发送数据,单片机可以正常接收到数据并且执行RxEventCallback()函数,而不是执行RxCpltCallback()这个回调函数。
  • 上面虽然实现了功能,但是当接收数据达到接收数组的一半时,也会有产生中断,使得一半之后的数据接收不到,所以需要在接收数据之后将接收过半中断给关闭了
  HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));/* 接收空闲中断,接收长度是最大长度。而不是接收数据的长度。可以设置为数组的长度。而数组的长度要尽量大。不至于溢出 */__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);

5.蓝牙透传模块BT24

  1. BT24蓝牙透传模块可以通过串口收发数据,BT24蓝牙模块默认波特率为9600,所以需要将波特率设置为9600,手机可以下载DX-SMART这个APP连接蓝牙模块,并且进行数据的收发。
    在这里插入图片描述
  2. 添加DMA通道:在 USART1 -> Configuration -> DMA Settings 标签卡中,点击 Add 按钮,分别添加 USART3_RX 和 USART3_TX 的 DMA 通道
    在这里插入图片描述
  3. 使能串口中断:在 USART1 -> Configuration -> NVIC Settings 标签卡中,勾选 USART1 global interrupt 的 Enable
    在这里插入图片描述
  4. 代码部分
  • 定义全局变量 receiveData 作为串口接收数组,由于是不定长数据的接收,因此缓冲区大小可以根据实际需求调整,只能大不能小,否则可能会丢失数据。
/* USER CODE BEGIN PV */
uint8_t receiveData[50];
/* USER CODE END PV */
  • 在 main 函数中,使用 HAL_UARTEx_ReceiveToIdle_DMA 函数开启不定长数据DMA接收,注意:需要关闭DMA传输过半中断,我们只需要接收完成中断,此函数是以空闲中断作为接收完成的标志,而不是接收长度,因此可以接收任意长度的数据。
  /* USER CODE BEGIN 2 */HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));	//通过DMA将数据接收并存到receiveData数组中__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);	//关闭DMA传输过半中断,只需要接收完成中断。/* USER CODE END 2 */
  • 在中断函数 HAL_UARTEx_RxEventCallback 中,处理接收到的数据,所有的串口接收和发送操作都在中断函数中进行,不会阻塞主程序。下面代码功能是接收到数据之后确人是蓝牙所连接口接收到的之后,发送回去,并对数据进行解析从而控制LED灯的亮或者灭。
  • 数据包含了(包头,数据长度,功能数据,校验和)。包含由自己决定,下面例子包头是0xAA,第二位是长度,接着是控制LED的亮灭(0x00表示输出低电平,0x01表示输出高电平),之后是控制的哪个LED(0x01表示第一个LED,0x02表示第二个LED,0x03表示第三个LED),最后是前面所有数据的总和来当作一个验证方式。
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size) {if (huart == &huart1) {HAL_UART_Transmit_DMA(&huart1, receiveData, Size);if (receiveData[0] == 0xAA) {if (receiveData[1] == Size) {uint8_t sum = 0;for (uint8_t i = 0; i < Size - 1; i++) {sum = sum + receiveData[i];}if (sum == receiveData[Size - 1]) {for (uint8_t i = 2; i < Size - 1; i += 2) {GPIO_PinState state = GPIO_PIN_SET;if (receiveData[i + 1] == 0x00) {state = GPIO_PIN_RESET;} else {state = GPIO_PIN_SET;}if (receiveData[i] == 0x01) {HAL_GPIO_WritePin(GPIOA, LED1_Pin, state);} else if (receiveData[i] == 0x02) {HAL_GPIO_WritePin(GPIOA, LED2_Pin, state);}  else if (receiveData[i] == 0x03) {HAL_GPIO_WritePin(GPIOA, LED3_Pin, state);}}}}}HAL_UARTEx_ReceiveToIdle_DMA(&huart1, receiveData, sizeof(receiveData));__HAL_DMA_DISABLE_IT(&hdma_usart1_rx, DMA_IT_HT);}
}
  • 手机通过蓝牙将数据发送到BT24模块,单片机通过串口连接蓝牙模块可以接收数据。
    在这里插入图片描述
  • 打开手机APP连接好蓝牙模块之后,发送0xAA, 0x09, 0x01, 0x01, 0x02, 0x01, 0x03, 0x01, 0xBC,单片机接收到之后发送回来,手机也会接收到这个数据,并且将LED1,LED2,LED3三个LED灯全部点亮,确认代码无误。
http://www.yayakq.cn/news/691876/

相关文章:

  • 怎样建设单位网站esc怎么做网站
  • 广告类的网站谷歌浏览器官网下载手机版
  • 做驾考学时在哪个网站wordpress 媒体模版
  • 网站后台传图片怎么部署wordpress
  • 物流公司做网站需求建设工程信息查询
  • wordpress通知站点360搜索深圳网站设计教程
  • 贵阳做网站的公司北京网站建设公司如何排版
  • 南昌哪家网站开发公司好网站设计怎么好看
  • 阿里云网站域名绑定做网站哪种语言好
  • 深圳市南山区住房和建设局网站官网蓝色高科技网站模板
  • 中山市饮食网站建设西安找工作哪个网站好
  • 网站建设 中企动力宜昌学校网站框架
  • 制作网站一般使用的软件有哪些桂林企业网站建设
  • 自己的网站首页背景怎么做微信运营服务商
  • 装修公司网站dede模板杭州网站建设_数据库开发网站_大数据网站开发
  • 手机网站整站模板下载工具网站建设服务市场分析
  • 建立网站的平台搜钛建站
  • 网站建设官方商城wordpress调用用户名
  • 视频当背景图片 网站开发电影网站权重怎么做
  • 建立网站的几个步骤上海单位建设报建网站
  • 设计一个官方网站推广广告中山网站建设推广
  • 用树莓派做网站服务器wordpress 加子目录
  • 科技网站推荐怀集住房和城乡建设部网站
  • 贵阳网站开发招聘做网站和推广工资多少
  • 江西 商城网站开发国外免费空间申请
  • 高端大气网站推荐网站建设前期
  • 东莞公司品牌网站建设学校网页设计方案
  • 网站推广内容网站建设结课论文
  • 学院网站建设项目网站建设促销活动
  • 手机和pc网站山东百度推广代理