GPT对话知识库——串口通信的数据的组成?起始位是高电平还是低电平?如何用代码在 FreeRTOS 中实现串口通信吗?如何处理串口通信中的数据帧校验吗?

目录

1,问:

1,答:

串口数据的组成

串口数据传输帧的完整结构

起始位的电平状态:低电平

举例:UART数据传输的例子

适用场景

总结

2,问:

2,答:

a. 如何在 FreeRTOS 中实现串口通信?

步骤概述:

代码示例(STM32 HAL + FreeRTOS)

b. 如何处理串口通信中的数据帧校验?

1. 校验位的类型:

2. 校验位的实现(以 STM32 为例):

3. 通过软件实现自定义校验机制:

总结

3,问:

3,答:

a. 在 FreeRTOS 下如何通过中断处理串口收发数据?

1. 中断处理的基本流程

2. 在 FreeRTOS 中如何结合中断和任务

3. 代码示例:UART 接收中断 + FreeRTOS 消息队列

(1)启用 UART 接收中断

(2)UART 中断服务程序

(3)接收任务:处理队列中的数据

(4)总结中断与任务的结合

b. 如何优化串口通信任务的实时性和效率?

1. 减少任务阻塞时间

2. DMA(直接存储器访问)优化大数据量通信

启用 DMA 传输的示例:

3. 任务优先级调整

4. 优化任务的 CPU 占用


提问模型:GPT-4o-mini Free

提问时间:2024.09.13

1,问:

详细说说串口数据的组成,起始位是高电平还是低电平

1,答:

串口通信(UART, Universal Asynchronous Receiver-Transmitter)的数据传输过程包含多个部分,包括起始位、数据位、校验位和停止位。为了详细解释这些内容,我们将逐步分析串口数据的组成,并解答起始位的电平状态。

串口数据的组成

  1. 空闲状态: 在没有传输数据时,串口通信线(数据线)处于高电平,表示线路空闲状态(也称为逻辑1)。这意味着当串口没有传输数据时,默认状态是高电平。

  2. 起始位: 当开始传输数据时,发送端会发出一个起始位(Start Bit),表示数据传输的开始。

    • 起始位的电平:低电平(逻辑0)
    • 在起始位的期间,信号线会从空闲状态的高电平拉低到低电平,通知接收端数据传输即将开始。
  3. 数据位: 起始位之后就是数据位,用于传输实际的数据。数据位的数量通常是 5到9位,但在大多数常见应用中是 8位

    • 数据位的传输是从 最低有效位(LSB) 开始逐位传送到 最高有效位(MSB)
    • 数据位可以是高电平(逻辑1)或者低电平(逻辑0),这取决于具体传输的数据内容。
  4. 校验位(可选): 这是一种错误检测机制,用于确保数据传输的准确性。如果启用了校验位,传输过程中会附加一个 校验位

    • 校验位可以是奇校验(Odd Parity)或偶校验(Even Parity),用于检查传输的数据位中逻辑1的数量是奇数还是偶数。
    • 如果校验失败,接收端可以检测到数据传输中可能出现的错误。
  5. 停止位: 数据传输完成后,发送端会发送停止位(Stop Bit),表示一帧数据的结束。停止位的长度可以是 1位、1.5位或2位

    • 停止位的电平:高电平(逻辑1)
    • 停止位结束后,信号线回到空闲状态,准备传输下一个字节。

串口数据传输帧的完整结构

典型的串口数据帧格式如下:

[ 起始位 | 数据位 | 校验位 (可选) | 停止位 ]

8位数据位,1位校验位,1位停止位 的串口帧为例:

  • 起始位:1位,低电平(逻辑0)
  • 数据位:8位(可设置为其他位数),数据逐位发送
  • 校验位:1位(可选),用于校验数据的正确性
  • 停止位:1位或更多,表示数据帧的结束,处于高电平

起始位的电平状态:低电平

起始位始终是低电平,这是串口通信中的一个标准。当串口通信线路处于空闲状态时,线路保持高电平。数据传输开始时,发送方通过将电平拉低至逻辑0,通知接收方数据传输即将开始。

举例:UART数据传输的例子

假设使用 9600 波特率,配置为 8-N-1 模式(即 8 数据位、无校验位、1 停止位),并传输字节 0x5A(即 01011010)。

该字节的传输序列如下:

  1. 空闲状态:高电平
  2. 起始位:低电平
  3. 数据位(从LSB开始):传输 01011010
    • LSB = 0 → 低电平
    • 1 → 高电平
    • 0 → 低电平
    • 1 → 高电平
    • 1 → 高电平
    • 0 → 低电平
    • 1 → 高电平
    • MSB = 0 → 低电平
  4. 停止位:高电平
  5. 回到空闲状态:高电平

适用场景

串口通信广泛应用于各种场景中,包括:

  • 嵌入式系统中的调试接口:例如使用 UART 与开发板进行通信、调试程序。
  • 设备间通信:如 GPS 模块、蓝牙模块、传感器等外部设备与主控芯片通过串口通信传输数据。
  • 串口控制:通过串口控制设备,如连接到PLC、工业设备等。

总结

串口通信中的数据传输由起始位、数据位、可选的校验位和停止位组成。起始位总是低电平,停止位则是高电平。串口数据传输适合简单、低速的设备间通信,被广泛应用于嵌入式系统中。

提问模型:GPT-4o-mini Free

提问时间:2024.09.13

2,问:

a. 想知道如何用代码在 FreeRTOS 中实现串口通信吗?
b. 需要进一步了解如何处理串口通信中的数据帧校验吗?

a和b都说说看

2,答:

我们先逐步探讨在 FreeRTOS 中实现串口通信的代码,以及如何处理串口通信中的数据帧校验。

a. 如何在 FreeRTOS 中实现串口通信?

在 FreeRTOS 中,串口通信通常是通过 UART 外设驱动实现的。由于不同的硬件平台和芯片(如 STM32、ESP32、NXP)有各自的 UART 硬件和驱动库,下面以 STM32 平台为例,结合 HAL 库 来介绍如何在 FreeRTOS 中使用串口通信。

步骤概述:
  1. 配置 UART 外设:在 STM32 的 CubeMX 工具中配置 UART 外设(波特率、数据位、校验位、停止位等)。
  2. 创建任务:在 FreeRTOS 中,使用任务或中断服务程序(ISR)进行串口收发操作。
  3. 使用消息队列或信号量:结合 FreeRTOS 的消息队列或信号量机制,可以同步串口收发任务。
代码示例(STM32 HAL + FreeRTOS)

初始化 UART: 使用 HAL 库初始化 UART 外设,配置波特率和其他参数。

// HAL 库初始化 UART 配置(在 main.c 中)
UART_HandleTypeDef huart1;void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = 9600;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){// 错误处理Error_Handler();}
}

创建 FreeRTOS 任务: 在 FreeRTOS 中创建两个任务:一个用于发送数据,另一个用于接收数据。

// 发送任务
void vUARTSendTask(void *pvParameters)
{const char *message = "Hello from FreeRTOS!\r\n";while (1){HAL_UART_Transmit(&huart1, (uint8_t *)message, strlen(message), HAL_MAX_DELAY); // 发送数据vTaskDelay(pdMS_TO_TICKS(1000));  // 每隔1秒发送一次}
}// 接收任务
void vUARTReceiveTask(void *pvParameters)
{uint8_t rxBuffer[20];while (1){HAL_UART_Receive(&huart1, rxBuffer, sizeof(rxBuffer), HAL_MAX_DELAY);  // 接收数据// 在此处理接收到的数据process_received_data(rxBuffer);}
}

消息队列和信号量的结合: 为了更好地管理串口收发,可以使用 FreeRTOS 消息队列信号量 进行数据的传递和同步。例如,接收数据时,将其放入消息队列以供其他任务处理。

// 定义队列句柄
QueueHandle_t uartQueue;// 创建队列
uartQueue = xQueueCreate(10, sizeof(uint8_t) * 20);// 在接收任务中将数据发送到队列中
void vUARTReceiveTask(void *pvParameters)
{uint8_t rxBuffer[20];while (1){HAL_UART_Receive(&huart1, rxBuffer, sizeof(rxBuffer), HAL_MAX_DELAY);xQueueSend(uartQueue, &rxBuffer, portMAX_DELAY);  // 将接收到的数据放入队列}
}// 在处理任务中从队列中取出数据进行处理
void vDataProcessTask(void *pvParameters)
{uint8_t receivedData[20];while (1){if (xQueueReceive(uartQueue, &receivedData, portMAX_DELAY) == pdPASS){process_received_data(receivedData);  // 处理队列中的数据}}
}

这种架构将串口的接收与处理解耦,使得任务之间的通信更加高效和灵活。

b. 如何处理串口通信中的数据帧校验?

串口通信中的数据帧校验主要是为了检测数据传输过程中可能发生的错误。常见的校验方式有奇校验(Odd Parity)和偶校验(Even Parity)。

1. 校验位的类型:
  • 无校验位:不使用校验位,适合对数据错误容忍度较高的场景。
  • 奇校验(Odd Parity):确保数据帧中的 1 的个数为奇数,如果不是,校验位被置为 1。
  • 偶校验(Even Parity):确保数据帧中的 1 的个数为偶数,如果不是,校验位被置为 1。
2. 校验位的实现(以 STM32 为例):

在配置 UART 外设时,可以启用校验位。通过设置 UART_InitTypeDef 中的 Parity 参数来选择是否使用校验位以及选择哪种校验方式。

// 使用偶校验配置 UART
void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = 9600;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_EVEN;  // 偶校验huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){// 错误处理Error_Handler();}
}
3. 通过软件实现自定义校验机制:

有些场景下,可能需要自定义更复杂的校验机制(如 CRC 校验)。可以在发送数据前,计算校验值并将其附加在数据末尾,接收方在收到数据后进行校验。

// 计算简单的校验和(示例)
uint8_t calculate_checksum(uint8_t *data, size_t length)
{uint8_t checksum = 0;for (size_t i = 0; i < length; i++){checksum ^= data[i];  // XOR 计算}return checksum;
}// 发送带校验的数据
void send_data_with_checksum(uint8_t *data, size_t length)
{uint8_t checksum = calculate_checksum(data, length);HAL_UART_Transmit(&huart1, data, length, HAL_MAX_DELAY);HAL_UART_Transmit(&huart1, &checksum, 1, HAL_MAX_DELAY);  // 发送校验值
}// 接收数据并校验
void receive_data_with_checksum(void)
{uint8_t data[20];uint8_t received_checksum;HAL_UART_Receive(&huart1, data, sizeof(data), HAL_MAX_DELAY);HAL_UART_Receive(&huart1, &received_checksum, 1, HAL_MAX_DELAY);  // 接收校验值uint8_t calculated_checksum = calculate_checksum(data, sizeof(data));if (calculated_checksum == received_checksum){// 校验通过process_received_data(data);}else{// 校验失败handle_checksum_error();}
}

在这里,通过 异或(XOR) 计算简单的校验和。在发送方,先计算出数据的校验值并发送;在接收方,接收到数据后重新计算校验和并对比已发送的校验值。如果匹配,数据被认为是有效的。

总结

  1. 在 FreeRTOS 中实现串口通信:可以使用串口驱动库(如 STM32 HAL 库)结合 FreeRTOS 任务与消息队列,实现可靠的串口数据发送与接收。
  2. 串口通信中的数据帧校验:可以使用 UART 外设的内置校验功能(如奇偶校验),或者自定义软件校验机制(如 XOR 或 CRC)确保数据的完整性和正确性。

提问模型:GPT-4o-mini Free

提问时间:2024.09.13

3,问:

a. 需要进一步了解 FreeRTOS 下如何通过中断处理串口收发数据吗?
b. 想要优化串口通信任务的实时性和效率吗?

再细说说a和b

3,答:

接下来我们更深入探讨 如何在 FreeRTOS 下通过中断处理串口数据收发 以及 如何优化串口通信任务的实时性和效率

a. 在 FreeRTOS 下如何通过中断处理串口收发数据?

使用中断(ISR, Interrupt Service Routine)来处理串口收发可以提高系统的实时性,避免任务阻塞过久,特别是在高数据速率或频繁收发数据的场景中。通过中断处理,可以立即响应串口事件,而不是轮询串口的状态。

1. 中断处理的基本流程
  • 发送数据时:当需要发送数据时,通常是在没有数据发送的时候触发一次中断,之后每发送一个字节再触发一次中断,直到整个数据发送完成。
  • 接收数据时:每当接收到一个字节的数据,中断会被触发,将数据保存在缓冲区或消息队列中,等待任务处理。
2. 在 FreeRTOS 中如何结合中断和任务

在 FreeRTOS 中使用中断服务程序(ISR)时,注意以下几点:

  • FreeRTOS 的 ISR API:在中断中操作 FreeRTOS 的队列或信号量时,需要使用特殊的 ISR 版本函数,如 xQueueSendFromISR()xSemaphoreGiveFromISR()
  • 任务通知机制:使用 FreeRTOS 提供的 任务通知机制,可以在中断中通知任务去处理数据,避免频繁切换上下文。
3. 代码示例:UART 接收中断 + FreeRTOS 消息队列

STM32 HAL 库 为例,以下代码展示如何通过 UART 中断接收数据并使用 FreeRTOS 消息队列传递给处理任务。

(1)启用 UART 接收中断

在初始化 UART 时,启用接收中断模式。

// 初始化 UART 并启用接收中断
void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = 9600;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){// 错误处理Error_Handler();}// 启用接收中断HAL_UART_Receive_IT(&huart1, rxBuffer, 1);  // 以中断方式接收1字节
}
(2)UART 中断服务程序

每当接收到一个字节的数据,UART 中断会被触发。这里通过 HAL_UART_RxCpltCallback() 来处理接收到的数据,并将其放入 FreeRTOS 消息队列中。

// 声明消息队列
QueueHandle_t uartQueue;// 中断服务回调函数,处理接收到的字节
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{BaseType_t xHigherPriorityTaskWoken = pdFALSE;if (huart->Instance == USART1){// 将接收到的字节放入队列xQueueSendFromISR(uartQueue, &rxBuffer, &xHigherPriorityTaskWoken);// 继续接收下一个字节HAL_UART_Receive_IT(huart, rxBuffer, 1);}// 如果需要,切换到更高优先级的任务portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
(3)接收任务:处理队列中的数据

接收任务从消息队列中读取数据并进行处理。此任务通过中断触发的队列接收数据,避免了轮询。

// 任务:从队列中接收数据并处理
void vUARTReceiveTask(void *pvParameters)
{uint8_t receivedByte;while (1){// 从队列中读取数据,等待时间为 portMAX_DELAY(阻塞等待)if (xQueueReceive(uartQueue, &receivedByte, portMAX_DELAY) == pdPASS){// 处理接收到的数据process_received_data(receivedByte);}}
}
(4)总结中断与任务的结合

通过启用 UART 中断,当每个字节到达时,会触发中断并将数据放入 FreeRTOS 消息队列。任务只需要从队列中读取数据即可,避免了对 UART 状态的轮询,从而提高了系统的响应性和实时性。

b. 如何优化串口通信任务的实时性和效率?

在 FreeRTOS 系统中,串口通信任务的实时性和效率优化可以从以下几个方面入手:

1. 减少任务阻塞时间

在任务中接收串口数据时,如果直接使用 HAL_UART_Receive(),任务可能会阻塞,尤其是在长时间没有数据到来的情况下。这会影响其他任务的运行。为了避免任务阻塞太久,可以使用以下两种方式:

  • 中断驱动方式:正如上文所述,使用中断处理串口收发可以减少任务阻塞,确保数据到来时立即处理。
  • 设置合理的超时时间:在调用串口收发函数时,使用一个合理的超时时间,避免无限期阻塞。
HAL_UART_Receive(&huart1, rxBuffer, sizeof(rxBuffer), 100);  // 100ms超时
2. DMA(直接存储器访问)优化大数据量通信

对于大量数据的串口通信,启用 DMA(Direct Memory Access) 可以极大地提升效率。DMA 可以在后台将数据直接传输到存储器,无需 CPU 参与,大大减轻了 CPU 的负担。

启用 DMA 传输的示例:
// 初始化 UART 并启用 DMA 传输
void MX_USART1_UART_Init(void)
{huart1.Instance = USART1;huart1.Init.BaudRate = 9600;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK){// 错误处理Error_Handler();}// 启用 DMA 接收HAL_UART_Receive_DMA(&huart1, dma_rx_buffer, BUFFER_SIZE);
}

通过 DMA 方式,数据接收不需要等待,而是后台自动接收,接收完成后会触发中断或信号,任务可以根据数据量和应用需求及时处理数据。

3. 任务优先级调整

为了保证串口通信的实时性,可以根据应用场景调整串口通信任务的优先级:

  • 如果串口通信任务对实时性要求较高,考虑将它的优先级设置为高优先级,使其优先响应。
  • 如果数据处理任务要求耗时较多,可以将其分解为多个较小的任务,减少每次执行时间,以提高响应性。
// 创建任务时调整优先级
xTaskCreate(vUARTReceiveTask, "UART Receive Task", 128, NULL, tskIDLE_PRIORITY + 2, NULL);  // 高优先级
xTaskCreate(vDataProcessTask, "Data Process Task", 256, NULL, tskIDLE_PRIORITY + 1, NULL);  // 较低优先级
4. 优化任务的 CPU 占用

串口通信任务应避免占用太多 CPU 资源。常见的优化策略包括:

  • 使用消息队列:避免串口任务不断轮询接收数据,改为中断方式将数据放入消息队列中,任务仅在有数据时处理。
  • 使用任务通知机制:FreeRTOS 提供的任务通知机制比消息队列更加轻量,适用于简单的事件通知场景。
// 在中断中使用任务通知机制代替队列
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{BaseType_t xHigherPriorityTaskWoken = pdFALSE;if (huart->Instance == USART1){// 直接通知任务vTaskNotifyGiveFromISR(receiveTaskHandle, &xHigherPriorityTaskWoken);// 继续接收HAL_UART_Receive_IT(huart, rxBuffer, 1);}portYIELD_FROM

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

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

相关文章

微波无源器件 功分器3 一种用于多端口辐射单元的紧凑四路双极化正交模功分器的设计

摘要&#xff1a; 一种有着双极化能力并且能作为一个Fabry-Perot谐振腔天线的馈源包含四个输入端口的新型紧凑功分器的概念和设计被提出了。在四个圆波导中的双同相极化通过使用四个5端口十字转门结合两个8by1&#xff08;八合一&#xff09; 功分网络。功分器末端接了两个端口…

【RabbitMQ】工作模式

工作模式概述 简单模式 简单模式中只存在一个生产者&#xff0c;只存在一个消费者。生产者生产消息&#xff0c;消费者消费消息。消息只能被消费一次&#xff0c;也称为点对点模式。 简单模式适合在消息只能被单个消费者处理的场景下存在。 工作队列模式&#xff08;Work Qu…

项目管理 | 一文读懂什么是敏捷开发管理

在快速变化的商业环境中&#xff0c;项目管理方式也在不断演进&#xff0c;其中敏捷开发管理因其高效、灵活和适应性强的特点&#xff0c;逐渐成为众多企业和团队的首选。本文将详细解析敏捷开发管理的定义、具体内容及其核心角色&#xff0c;帮助读者全面理解这一先进的项目管…

心觉:不能成事的根本原因

很多人一直都很努力&#xff0c;每天都很忙 每天都学习很多东西&#xff0c;学习各种道&#xff0c;各种方法论 但是许多年过去了依然一事无成 自己的目标没有达成&#xff0c;梦想没有实现 为什么呢 关键是没有开悟 那么什么是开悟呢 现在很多人都在讲开悟 貌似开悟很…

harmony初学者入门

一、开发前准备 1.申请开发者账号,可进行个人认证和企业认证 2.下载开发者工具&#xff0c;下载最新版本的devecoStudio &#xff0c;当然可以下载历史版本的 3.安装DevEco Studio 4.申请模拟器 并且安装模拟器 在此说明下 有预览器 模拟器和真机&#xff0c; 个人开发学习的话…

阿里云 Quick BI使用介绍

Quick BI使用介绍 文章目录 阿里云 Quick BI使用介绍1. 创建自己的quick bi服务器2. 新建数据源3. 上传文件和 使用4. 开始分析 -选仪表盘5. 提供的图表6. 一个图表的设置使用小结 阿里云 Quick BI使用介绍 Quick BI是一款全场景数据消费式的BI平台&#xff0c;秉承全场景消费…

AI逻辑推理入门

参考数据鲸 (linklearner.com) 1. 跑通baseline 报名 申领大模型API 模型服务灵积-API-KEY管理 (aliyun.com) 跑通代码 在anaconda新建名为“LLM”的环境,并安装好相应包后,在jupyter notebook上运行baseline01.ipynb 2. 赛题解读 一般情况下,拿到一个赛题之后,我们需…

C++系列-匿名对象

匿名对象 &#x1f4a2;什么是匿名对象&#x1f4a2;匿名对象的创建方式及作用域&#x1f4a2;匿名对象的对象类型&#x1f4a2;&#x1f4a2;匿名的基本数据类型对象&#x1f4a2;&#x1f4a2;匿名的自定义的类类型对象&#x1f4a2;&#x1f4a2;匿名的标准库的类对象 &…

CleanClip vs 传统剪贴板:究竟谁更胜一筹?

在日常工作和生活中,复制粘贴可以说是我们使用最频繁的操作之一。传统的剪贴板功能虽然简单易用,但在功能性和效率上还有很大的提升空间。今天,我们就来比较一下新兴的剪贴板增强工具CleanClip与传统剪贴板,看看到底谁更胜一筹。 1. 剪贴历史管理 传统剪贴板只能存储最后一次…

通过adb命令打开手机usb调试

adb shell settings put global adb_enabled 1 这个命令会将全局ADB启用设置为1&#xff0c;允许通过ADB进行调试。 adb shell settings put secure adb_authentication_enabled 1 这个命令会启用ADB身份验证&#xff0c;允许设备在连接时要求授权。 adb shell settings put …

【Java】类的成员之一-代码块【主线学习笔记】

文章目录 前言类的成员之一-代码块作用静态初始化块非静态代码块 前言 Java是一门功能强大且广泛应用的编程语言&#xff0c;具有跨平台性和高效的执行速度&#xff0c;广受开发者喜爱。在接下来的学习过程中&#xff0c;我将记录学习过程中的基础语法、框架和实践技巧等&#…

Pyspark下操作dataframe方法(3)

文章目录 Pyspark dataframe操作方式3df.foreach 逐条执行foreachPartition 按分区逐条执行freqltemsgroupBy 分组head 获取指定数量开头hint 查询优化intersect 获取交集&#xff08;去重&#xff09;isEmpty 判断dataframe是否为空join 关联limit 限定数量mapInPandas 迭代处…

PaddleNLP本文分类及docker部署流程

本文记录使用PaddleNLP进行文本分类的全流程 参考&#xff1a;https://github.com/PaddlePaddle/PaddleNLP/tree/develop/legacy/applications/text_classification/multi_class 文章目录 1. 数据准备2. 模型训练2.1 准备关键库2.2 模型训练&#xff06;验证2.3 模型测试2.4 结…

分布式中间件-redis相关概念介绍

文章目录 什么是redis?示意图Redis的主要特点Redis的主要用途Redis的工作原理Redis的持久化与备份 redis 6.x新增特性多线程数据加载客户端缓存新的 RESP 3 协议支持ACL&#xff08;Access Control List&#xff09;功能新增数据类型性能改进配置文件的改进其他改进 redis数据…

前端vue中如何给reactive赋值

const deviceDatareactive({}) const getDeviceDetail (list)>{ if(list.length > 0){ for(let item of list){ if(item.id param.id){ Object.assign(deviceData,item) } } } }

02 基于STM32的按键控制继电器驱动电机

本专栏所有源资料都免费获取&#xff0c;没有任何隐形消费。 注意事项&#xff1a;STM32仿真会存在各种各样BUG&#xff0c;且尽量按照同样仿真版本使用。本专栏所有的仿真都采用PROTEUS8.15。 本文已经配置好STM32F103C8T6系列&#xff0c;在PROTUES仿真里&#xff0c;32单片…

Doker学习笔记--黑马

介绍&#xff1a;快速构建、运行、管理应用的工具 在不同的服务器上部署多个应用&#xff0c;但是往往不同应用之间会有冲突&#xff0c;因为它们所依赖的环境&#xff0c;函数库&#xff0c;配置都不一样&#xff0c;此时docker在运行时形成了一个隔离环境&#xff08;容器&am…

【C++篇】C++类与对象深度解析(三):类的默认成员函数详解

文章目录 【C篇】C类与对象深度解析&#xff08;三&#xff09;前言4. 运算符重载基本概念4.1 运算符重载的基本概念4.2 重载运算符的规则4.3 成员函数重载运算符4.4 运算符重载的优先级与结合性4.5 运算符重载中的限制与特殊情况4.5.1 不能创建新的操作符4.5.2 无法重载的运算…

李宏毅机器学习2023-HW13-Network Compression

文章目录 TaskLinkBaselineSimple BaselineMedium BaselineStrong BaselineBoss BaselineFitNet Knowledge DistillationRelational Knowledge Distillation (RKD)Distance Metric (DM) Knowledge Distillation Task 通过network compression完成图片分类&#xff0c;数据集跟…

QT 带箭头的控件QPolygon

由于对当前项目需要绘制一个箭头控件&#xff0c;所以使用了QPainter和QPolygon来进行绘制&#xff0c;原理就是计算填充&#xff0c;下面贴出代码和效果图 这里简单介绍下QPolygon QPolygon是继承自 QVector<QPoint>那么可以很简单的理解为&#xff0c;他就是一个点的…