上海外贸50强企业/天津seo推广优化

上海外贸50强企业,天津seo推广优化,一级域名免费注册,网站建设私单合同STM32 HAL库实战:轻松实现串口通信驱动蓝牙模块与ESP8266开发 引言 STM32F103C8T6作为一款性能强劲的32位微控制器,广泛应用于各类嵌入式系统。本文将详细介绍如何使用STM32F103C8T6的HAL库进行串口通信,并展示如何通过串口驱动蓝牙模块&…

STM32 HAL库实战:轻松实现串口通信驱动蓝牙模块与ESP8266开发


引言

STM32F103C8T6作为一款性能强劲的32位微控制器,广泛应用于各类嵌入式系统。本文将详细介绍如何使用STM32F103C8T6的HAL库进行串口通信,并展示如何通过串口驱动蓝牙模块(如HC-05)和WiFi模块(如ESP8266),实现无线通信功能。


一、串口通信基础

1.1 串口通信原理

串口通信是一种广泛使用的通信方式,通过一根发送线(TX)和一根接收线(RX)进行数据传输。STM32F103C8T6提供了多个USART(通用同步异步收发器)接口,支持全双工通信。

1.2 HAL库配置串口

  • 串口初始化设置

在HAL库中,串口通信的配置主要包括波特率设置、数据位、停止位和校验位等。以下是一个基本的串口初始化代码示例:

UART_HandleTypeDef uart1_handle;                                            /* UART1句柄 *//*** @brief       串口1初始化函数* @param       baudrate: 波特率, 根据自己需要设置波特率值* @retval      无*/
void uart1_init(uint32_t baudrate)
{/*UART1 初始化设置*/uart1_handle.Instance = USART1;                                         /* USART1 */uart1_handle.Init.BaudRate = baudrate;                                  /* 波特率 */uart1_handle.Init.WordLength = UART_WORDLENGTH_8B;                      /* 字长为8位数据格式 */uart1_handle.Init.StopBits = UART_STOPBITS_1;                           /* 一个停止位 */uart1_handle.Init.Parity = UART_PARITY_NONE;                            /* 无奇偶校验位 */uart1_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;                      /* 无硬件流控 */uart1_handle.Init.Mode = UART_MODE_TX_RX;                               /* 收发模式 */HAL_UART_Init(&uart1_handle);                                           /* HAL_UART_Init()会使能UART1 */
}
  • 串口底层初始化:

在以下代码中,当函数调用HAL_UART_Init()函数时,就会自动调用 ‌HAL_UART_MspInit()‌,以完成底层硬件相关的配置。
在下方代码中,我们配置与硬件相关的部分,例如:

  • 使能UART和GPIO的时钟。
  • 初始化TX/RX引脚(配置为复用功能)。
  • 配置中断(串口中断和总线空闲中断)。

/*** @brief       UART底层初始化函数* @param       huart: UART句柄类型指针* @note        此函数会被HAL_UART_Init()调用*              完成时钟使能,引脚配置,中断配置* @retval      无*/
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{GPIO_InitTypeDef gpio_init_struct;if (huart->Instance == USART1)                                          /* 如果是串口1,进行串口1 MSP初始化 */{__HAL_RCC_GPIOA_CLK_ENABLE();                                       /* 使能串口TX脚时钟 */__HAL_RCC_USART1_CLK_ENABLE();                                      /* 使能串口时钟 */gpio_init_struct.Pin = GPIO_PIN_9;                                  /* 串口发送引脚号 */gpio_init_struct.Mode = GPIO_MODE_AF_PP;                            /* 复用推挽输出 */gpio_init_struct.Pull = GPIO_PULLUP;                                /* 上拉 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;                      /* IO速度设置为高速 */HAL_GPIO_Init(GPIOA, &gpio_init_struct);gpio_init_struct.Pin = GPIO_PIN_10;                                 /* 串口RX脚 模式设置 */gpio_init_struct.Mode = GPIO_MODE_AF_INPUT;    HAL_GPIO_Init(GPIOA, &gpio_init_struct);                            /* 串口RX脚 必须设置成输入模式 */HAL_NVIC_EnableIRQ(USART1_IRQn);                                    /* 使能USART1中断通道 */HAL_NVIC_SetPriority(USART1_IRQn, 3, 3);                            /* 组2,最低优先级:抢占优先级3,子优先级3 */__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);                          /* 使能UART1接收中断 */__HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);                          /* 使能UART1总线空闲中断 */}
}
  • 串口中断处理函数:

这边暂时体供串口1的中断处理函数。由于我们串口1开启了两个中断:

    • 接收寄存器非空触发中断
    • 串口空闲线路中断

我们在以下中断处理函数中,处理这两个中断。接收非空中断触发时,将接收到的数据进行缓存到数组中,当触发空闲中断说明数据接收完毕,则将数据打印出来。这边使用printf函数,需要堆fputc函数进行该写。

#define UART1_RX_BUF_SIZE            128  // 
#define UART1_TX_BUF_SIZE            64
uint8_t uart1_rx_buf[UART1_RX_BUF_SIZE];                                    /* UART1接收缓冲区 *//*** @brief       UART1接收缓冲区清除* @param       无* @retval      无*/
void uart1_rx_clear(void)
{memset(uart1_rx_buf, 0, sizeof(uart1_rx_buf));                          /* 清空接收缓冲区 */uart1_rx_len = 0;                                                       /* 接收计数器清零 */
}/*** @brief       串口1中断服务函数* @note        在此使用接收中断及空闲中断,实现不定长数据收发* @param       无* @retval      无*/
void HAL_UART_MspInit(UART_HandleTypeDef *huart)
{GPIO_InitTypeDef gpio_init_struct;if (huart->Instance == USART1)                                          /* 如果是串口1,进行串口1 MSP初始化 */{__HAL_RCC_GPIOA_CLK_ENABLE();                                       /* 使能串口TX脚时钟 */__HAL_RCC_USART1_CLK_ENABLE();                                      /* 使能串口时钟 */gpio_init_struct.Pin = GPIO_PIN_9;                                  /* 串口发送引脚号 */gpio_init_struct.Mode = GPIO_MODE_AF_PP;                            /* 复用推挽输出 */gpio_init_struct.Pull = GPIO_PULLUP;                                /* 上拉 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;                      /* IO速度设置为高速 */HAL_GPIO_Init(GPIOA, &gpio_init_struct);gpio_init_struct.Pin = GPIO_PIN_10;                                 /* 串口RX脚 模式设置 */gpio_init_struct.Mode = GPIO_MODE_AF_INPUT;    HAL_GPIO_Init(GPIOA, &gpio_init_struct);                            /* 串口RX脚 必须设置成输入模式 */HAL_NVIC_EnableIRQ(USART1_IRQn);                                    /* 使能USART1中断通道 */HAL_NVIC_SetPriority(USART1_IRQn, 3, 3);                            /* 组2,最低优先级:抢占优先级3,子优先级3 */__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);                          /* 使能UART1接收中断 */__HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);                          /* 使能UART1总线空闲中断 */}else if (huart->Instance == USART2)                                          /* 如果是串口2,进行串口2 MSP初始化 */{__HAL_RCC_GPIOA_CLK_ENABLE();                                       /* 使能串口TX脚时钟 */__HAL_RCC_USART2_CLK_ENABLE();                                      /* 使能串口时钟 */gpio_init_struct.Pin = GPIO_PIN_2;                                  /* 串口发送引脚号 */gpio_init_struct.Mode = GPIO_MODE_AF_PP;                            /* 复用推挽输出 */gpio_init_struct.Pull = GPIO_PULLUP;                                /* 上拉 */gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;                      /* IO速度设置为高速 */HAL_GPIO_Init(GPIOA, &gpio_init_struct);gpio_init_struct.Pin = GPIO_PIN_3;                                 /* 串口RX脚 模式设置 */gpio_init_struct.Mode = GPIO_MODE_AF_INPUT;    HAL_GPIO_Init(GPIOA, &gpio_init_struct);                            /* 串口RX脚 必须设置成输入模式 */HAL_NVIC_EnableIRQ(USART2_IRQn);                                    /* 使能USART2中断通道 */HAL_NVIC_SetPriority(USART2_IRQn, 3, 3);                            /* 组2,最低优先级:抢占优先级3,子优先级3 */__HAL_UART_ENABLE_IT(huart, UART_IT_RXNE);                          /* 使能UART2接收中断 */__HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);                          /* 使能UART2总线空闲中断 */}
}
  • 改写fputc函数

我们改写fputc函数,这样就可以直接使用printf函数进行串口打印。

/*** @brief       重定义fputc函数* @note        printf函数最终会通过调用fputc输出字符串到串口*/
int fputc(int ch, FILE *f)
{while ((USART1->SR & 0X40) == 0);                                       /* 等待上一个字符发送完成 */USART1->DR = (uint8_t)ch;                                               /* 将要发送的字符 ch 写入到DR寄存器 */return ch;
}

做完这些操作,编译时也记得打开使用MicroLIB。

在这里插入图片描述
至此,我们可以使用printf函数直接利用CH340单片机给电脑发送串口消息。

二、驱动蓝牙模块(HC-08)

2.1 硬件连接

将HC-08蓝牙模块的TX引脚连接到STM32的RX引脚,将HC-08的RX引脚连接到STM32的TX引脚。同时,确保蓝牙模块和STM32共地。

2.2 软件配置

在串口初始化完成后,可以通过串口发送AT指令来配置HC-08蓝牙模块。例如,设置蓝牙模块的名称和配对密码,
我们使用串口二与之交叉相连。

  • 初始化函数
UART_HandleTypeDef uart2_handle= {0};void bt_init(uint32_t baudrate)
{/*uart2 初始化设置*/uart2_handle.Instance = USART2;                                         /* USART1 */uart2_handle.Init.BaudRate = baudrate;                                  /* 波特率 */uart2_handle.Init.WordLength = UART_WORDLENGTH_8B;                      /* 字长为8位数据格式 */uart2_handle.Init.StopBits = UART_STOPBITS_1;                           /* 一个停止位 */uart2_handle.Init.Parity = UART_PARITY_NONE;                            /* 无奇偶校验位 */uart2_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;                      /* 无硬件流控 */uart2_handle.Init.Mode = UART_MODE_TX_RX;                               /* 收发模式 */HAL_UART_Init(&uart2_handle);                                           /* HAL_UART_Init()会使能uart2 */
}
  • 中断处理函数

/*** @brief       uart2接收缓冲区清除* @param       无* @retval      无*/
void uart2_rx_clear(void)
{memset(uart2_rx_buf, 0, sizeof(uart2_rx_buf));                          /* 清空接收缓冲区 */uart2_rx_len = 0;                                                       /* 接收计数器清零 */
}/*** @brief       串口2中断服务函数* @note        在此使用接收中断及空闲中断,实现不定长数据收发* @param       无* @retval      无*/
void USART2_IRQHandler(void)
{uint8_t receive_data = 0;   if(__HAL_UART_GET_FLAG(&uart2_handle, UART_FLAG_RXNE) != RESET){        /* 获取接收RXNE标志位是否被置位 */if(uart2_rx_len >= sizeof(uart2_rx_buf))                            /* 如果接收的字符数大于接收缓冲区大小, */uart2_rx_len = 0;                                               /* 则将接收计数器清零 */HAL_UART_Receive(&uart2_handle, &receive_data, 1, 1000);            /* 接收一个字符 */uart2_rx_buf[uart2_rx_len++] = receive_data;                        /* 将接收到的字符保存在接收缓冲区 */}if (__HAL_UART_GET_FLAG(&uart2_handle, UART_FLAG_IDLE) != RESET)        /* 获取接收空闲中断标志位是否被置位 */{printf("bt recv: %s\r\n", uart2_rx_buf);                               /* 将接收到的数据打印出来 */uart2_rx_clear();__HAL_UART_CLEAR_IDLEFLAG(&uart2_handle);                           /* 清除UART总线空闲中断 */}
}
  • 重写蓝牙发送函数
#include "stdarg.h"void bt_send(char * format, ...)
{uint8_t send_buf[128] ={0};va_list arg;va_start(arg, format);vsprintf((char *)send_buf, format, arg);va_end(arg);HAL_UART_Transmit(&uart2_handle, send_buf, sizeof(send_buf), 100);
}

2.3 数据收发

配置完成后,即可通过串口与蓝牙模块进行数据收发。例如:

int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */uart1_init(115200);bt_init(115200);printf("hello world!\r\n");uint8_t i = 0;while(1){ bt_send("hello, bt%d\r\n", i++);delay_ms(500);}
}

三、驱动WiFi模块(ESP8266)

为避免文章过长,ESP8266的驱动,本文暂时只讲最简单的连接测试,他的几种连接方式放在明天的文章中,进行详细介绍。

3.1 硬件连接

将ESP8266模块的TX引脚连接到STM32的RX引脚,将ESP8266的RX引脚连接到STM32的TX引脚。同时,确保ESP8266的VCC、GND正确连接。

3.2 软件配置

ESP8266的配置相对复杂,需要通过串口发送AT指令进行WiFi连接和TCP/UDP通信设置。
在这个案例中,我们接收连续字符串不采用空闲中断,所以在HAL_UART_MspInit函数中,我们将串口2的IDLE中断注释。
以下是一个简单的WiFi连接示例:

  • 串口初始化
#define ESP8266_RX_BUF_SIZE  128
#define ESP8266_TX_BUF_SIZE  64#define ESP8266_EOK        0
#define ESP8266_ERROR      1
#define ESP8266_ETIMEOUT   2
#define ESP8266_EINVAL     3
UART_HandleTypeDef esp8266_handle = {0};void esp8266_uart_init(uint32_t baudrate)
{esp8266_handle.Instance = USART2;esp8266_handle.Init.BaudRate = baudrate;esp8266_handle.Init.WordLength = UART_WORDLENGTH_8B;esp8266_handle.Init.StopBits = UART_STOPBITS_1;esp8266_handle.Init.Parity = UART_PARITY_NONE;esp8266_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE;esp8266_handle.Init.Mode = UART_MODE_TX_RX;HAL_UART_Init(&esp8266_handle);
}
  • 中断函数
uint8_t esp8266_rx_buf[ESP8266_RX_BUF_SIZE];
uint16_t esp8266_cnt = 0, esp8266_cntPre = 0;void USART2_IRQHandler(void)
{uint8_t receive_data = 0;if(__HAL_UART_GET_FLAG(&esp8266_handle, UART_FLAG_RXNE) != RESET){if(esp8266_cnt >= sizeof(esp8266_rx_buf))esp8266_cnt = 0;HAL_UART_Receive(&esp8266_handle, &receive_data, 1, 1000);esp8266_rx_buf[esp8266_cnt++] = receive_data;//uart1_cnt++;//HAL_UART_Transmit(&uart1_handle, &receive_data, 1, 1000);}
}
  • 判断函数
uint8_t esp8266_wait_receive(void)
{if(esp8266_cnt == 0)return ESP8266_ERROR;if(esp8266_cnt == esp8266_cntPre){esp8266_cnt = 0;return ESP8266_EOK;}esp8266_cntPre = esp8266_cnt;return ESP8266_ERROR;
}
  • 清除函数
void esp8266_rx_clear(void)
{memset(esp8266_rx_buf, 0, sizeof(esp8266_rx_buf));esp8266_cnt = 0;
}
  • 接收函数
void esp8266_receive_data(void)
{if(esp8266_wait_receive() == ESP8266_EOK){printf("esp8266 recv: %s\r\n", esp8266_rx_buf);esp8266_rx_clear();}
}
  • 发送函数

uint8_t esp8266_send_command(char *cmd, char *res)
{uint8_t time_out = 250;esp8266_rx_clear();HAL_UART_Transmit(&esp8266_handle, (uint8_t *)cmd, strlen(cmd), 100);while(time_out--){if(esp8266_wait_receive() == ESP8266_EOK){if(strstr((const char*)esp8266_rx_buf, res) != NULL)return ESP8266_EOK;}delay_ms(10);}return ESP8266_ERROR;
}
  • 测试函数
void esp8266_test(void)
{if(esp8266_send_command("AT", "OK") == ESP8266_EOK)printf("esp8266 test: %s\r\n", esp8266_rx_buf);
}

3.3 数据收发

WiFi连接成功后,即可通过串口与ESP8266进行TCP/UDP数据收发。例如,发送数据到服务器:

#include "sys.h"
#include "delay.h"
#include "uart1.h"
#include "esp8266.h"int main(void)
{HAL_Init();                         /* 初始化HAL库 */stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */uart1_init(115200);esp8266_init(115200);printf("hello world!\r\n");while(1){ esp8266_test();delay_ms(10);}
}

四、总结

本文通过详细的步骤介绍了如何在STM32F103C8T6上使用HAL库进行串口通信,并展示了如何通过串口驱动蓝牙模块(HC-08)和WiFi模块(ESP8266)。这些技术为实现无线通信功能提供了坚实的基础,适用于各种嵌入式系统应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Discuz建站教程之论坛头部logo跳转链接怎么修改?

在修改头部logo跳转链接前&#xff0c;我们需要知道对应代码在哪个文件目录&#xff0c;进入宝塔或是服务器&#xff0c;找到文件&#xff1a;\template\default\common\header.htm&#xff0c;编辑器打开&#xff0c;搜索以下代码&#xff0c;大概在135行 <a href"{i…

python-leetcode-最大连续1的个数 III

1004. 最大连续1的个数 III - 力扣&#xff08;LeetCode&#xff09; 使用滑动窗口的方法来解决这个问题。 思路&#xff1a; 使用双指针&#xff08;滑动窗口&#xff09;&#xff0c;定义左右边界 left 和 right。维护窗口内最多包含 k 个 0。当窗口内的 0 超过 k 个时&…

基于Vue3的流程图绘制库

流程图组件的革命者&#xff0c;带你探索无限可能Vue Flow 基于Vue3的流程图绘制库

学习springboot-Bean管理(Bean 注册,Bean 扫描)

Bean 扫描 可以浏览下面的博客链接 &#xff1a;spring 学习 &#xff08;注解&#xff09;-CSDN博客 在学习spring 注解时&#xff0c;我们使用 Component &#xff0c;Service,Controller等 这样的注解&#xff0c;将目标类信息&#xff0c;传递给IOC容器&#xff0c;为其创…

OpenAI智能体初探:使用 OpenAI Responses API 在 PDF 中实现检索增强生成(RAG)

大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。 知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。 欢迎关注《大模型理论和实战》、《DeepSeek技术解析和实战》,一起探索技术的无限可能! 引子 在信息爆炸的时代,从大量 PDF 文档中快速准确地检索信息…

【MySQL】基本操作 —— DDL

目录 DDLDDL 常用操作对数据库的常用操作查看所有数据库创建数据库切换、显示当前数据库删除数据库修改数据库编码 对表的常用操作创建表数据类型数值类型日期和时间类型字符串类型 查看当前数据库所有表查看指定表的创建语句查看指定表结构删除表 对表结构的常用操作给表添加字…

工厂模式加策略模式 -- 具体实现

这里写目录标题 定义接口定义抽象类定义主处理器分支处理器定义工厂demo 定义接口 public interface EntityHandler extends InitializingBean {MatchContentDTO match(MatchEntityDTO matchEntityDTO);String supportEntityType(); }定义抽象类 public abstract class Abstr…

基于Spring Boot的网上宠物店系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

PHPCMS V9 登录加密改造

要改造 phpcms 的后台登录&#xff0c;使其前端使用加密方式提交&#xff0c;后端解密&#xff0c;你可以采用 RSA 非对称加密 或 AES 对称加密 方式来增强安全性。 方案设计 前端加密 生成公私钥对&#xff08;推荐使用 RSA&#xff09;。前端使用公钥加密密码&#xff0c;然…

FANUC机器人几种常用的通讯网络及接口

FANUC机器人几种常用的通讯网络及接口 Devicenet 网络通讯接口&#xff0c;接口为5针线 (规定用的机架为 81-84&#xff09; PROFIBUS 网络通讯接口&#xff0c;针脚为2针&#xff08;规定用的机架为 67&#xff09; Intemet 网络通讯接口&#xff08;常用的网线接口&#xf…

CentOS8+Zabbix7.2.4解决中文显示问题

#cd /usr/share/zabbix/ui/include/ #grep graphfont defines.inc.php define(‘ZBX_GRAPH_FONT_NAME’, ‘graphfont’); // font file name define(‘ZBX_FONT_NAME’, ‘graphfont’); #ll /usr/share/zabbix/ui/assets/fonts/graphfont.ttf lrwxrwxrwx. 1 root root 36 3…

AI自动化编程初探

先说vscodeclinemodelscope方案&#xff0c;后面体验trae或者cursor再写写其它的。vscode和trae方案目前来说是免费的&#xff0c;cursor要用claud需要付费&#xff0c;而且不便宜&#xff0c;当然效果可能是最好的。 vscode方案&#xff0c;我的经验是最好在ubuntu上&#xff…

101.在 Vue 3 + OpenLayers 使用 declutter 避免文字标签重叠

1. 前言 在使用 OpenLayers 进行地图开发时&#xff0c;我们经常需要在地图上添加点、线、区域等图形&#xff0c;并给它们附加文字标签。但当地图上的标注较多时&#xff0c;文字标签可能会发生重叠&#xff0c;导致用户无法清晰地查看地图信息。 幸运的是&#xff0c;OpenL…

IXTUR气控永磁铁:以高精度气控和稳定磁场,为机器人应用提供稳定抓取力

在现代工业生产和物流领域&#xff0c;物料的抓取与搬运是影响生产效率和成本控制的重要环节。传统夹爪在面对不同材质、形状和重量的物体时&#xff0c;常常存在适应性差、抓取不稳定、操作复杂等问题&#xff0c;导致生产流程中频繁出现停机调整&#xff0c;增加了人工干预成…

江科大51单片机笔记【16】AD/DA转换(下)

写在前言 此为博主自学江科大51单片机&#xff08;B站&#xff09;的笔记&#xff0c;方便后续重温知识 在后面的章节中&#xff0c;为了防止篇幅过长和易于查找&#xff0c;我把一个小节分成两部分来发&#xff0c;上章节主要是关于本节课的硬件介绍、电路图、原理图等理论知识…

【C++】 —— 笔试刷题day_4

刷题day_4 继续加油&#xff01;&#xff01;&#xff01; 一、Fibonacci数列 题目链接&#xff1a;Fibonacci数列 题目解析 题目要求&#xff0c;输入一个数N&#xff0c;我们可以对N进行1/-1操作&#xff1b;题目让我们输出对N进行至少多少步可以变成Fibonacci数。 这里题目…

IP层之分片包的整合处理---BUG修复

在之前章节中&#xff0c;笔者就IP层之分片包的整合处理进行了概念介绍&#xff0c;以及代码编写和仿真&#xff0c;在整体代码调试环节&#xff0c;笔者发现了一个问题&#xff0c;在本文中&#xff0c;笔者将就这个BUG进行说明&#xff0c;以及进行修复&#xff0c;讲解代码实…

pyspark 数据处理的三种方式RDD、DataFrame、Spark SQL案例

目录 一、浅语二、三种数据处理方式比较2.1 RDD2.2 DataFrame2.3 Spark SQL 三、三种方法的创建方式3.1 创建RDD3.2 创建DataFrame3.2.1 创建sqlContext3.2.2 定义Schema3.2.3 创建DataFrame 3.3 创建SparkSQL3.3.1 登录临时表3.3.2 使用sparkSQL 四、三种方法显示部分字段4.1 …

文件解析漏洞靶机---- 练习通关攻略

1.安装靶机 点击 hackme.ova 文件&#xff0c;直接导入虚拟机&#xff0c;选择存储位置 2. 开启靶机 3. kali扫描同C段的ip&#xff0c;找到靶机ip nmap 192.168.182.1/24 经判断&#xff0c;靶机ip为&#xff1a;192.168.182.157 开启端口 http 80 、ssh 远程连接 22 4…

信号处理抽取多项滤波的数学推导与仿真

昨天的《信号处理之插值、抽取与多项滤波》&#xff0c;已经介绍了插值抽取的多项滤率&#xff0c;今天详细介绍多项滤波的数学推导&#xff0c;并附上实战仿真代码。 一、数学变换推导 1. 多相分解的核心思想 将FIR滤波器的系数 h ( n ) h(n) h(n)按相位分组&#xff0c;每…