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

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

相关文章:

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

目录 1&#xff0c;问&#xff1a; 1&#xff0c;答&#xff1a; 串口数据的组成 串口数据传输帧的完整结构 起始位的电平状态&#xff1a;低电平 举例&#xff1a;UART数据传输的例子 适用场景 总结 2&#xff0c;问&#xff1a; 2&#xff0c;答&#xff1a; a. 如…...

从头开始学MyBatis—02基于xml和注解分别实现的增删改查

首先介绍此次使用的数据库结构&#xff0c;然后引出注意事项。 通过基于xml和基于注解的方式分别实现了增删改查&#xff0c;还有获取参数值、返回值的不同类型对比&#xff0c;帮助大家一次性掌握两种代码编写能力。 目录 数据库 数据库表 实体类 对应的实体类如下&#x…...

AI音乐创作的新时代:从创意到旋律的智能化转型

文章目录 &#x1f3bc; AI音乐创作的新时代&#xff1a;从创意到旋律的智能化转型1 AI在音乐创作中的应用1.1 AI如何生成音乐&#xff1f; 2 常见的AI音乐创作工具2.1 AIVA2.2 Ecrett Music2.3 Jukedeck 3 AI音乐创作的流程3.1 第一步&#xff1a;确定音乐风格和情感基调3.2 第…...

Spring Boot集成Akka remoting快速入门Demo

1.什么是Akka remoting&#xff1f; Akka-Remoting一种ActorSystem之间Actor对Actor点对点的沟通协议.通过Akka-Remoting来实现一个ActorSystem中的一个Actor与另一个ActorSystem中的另一个Actor之间的沟通 Akka Remoting限制&#xff1a; 不支持NAT&#xff08;Network Add…...

JVM 调优篇7 调优案例1-堆空间的优化解决

一 jvm优化 1.1 优化实施步骤* 1)减少使用全局变量和大对象&#xff1b; 2)调整新生代的大小到最合适&#xff1b; 3)设置老年代的大小为最合适&#xff1b; 4)选择合适的GC收集器&#xff1b; 1.2 关于GC优化原则 多数的Java应用不需要在服务器上进行GC优化&#xff1…...

文件格式转换:EXCEL和CSV文件格式互相转换

目录 1.EXCEl和CSV文件格式互相转换1.1首先安装所需的Python包1.2excel转换为csv代码如下:1.3csv转换为excel代码如下:由于excel文件在数学建模数据处理当中的局限性,我们通常把excel文件转换为csv文件来处理,下面是相关的代码,我直接封装成函数,你们直接调用即可,我会添…...

基于协同过滤的北京森林公园推荐---附源码74454

摘要 本论文主要论述了如何基于协同过滤开发一个北京森林公园推荐&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;通过爬虫技术对北京森林公园的景点信息数据进行爬取&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述北京森…...

002 JavaClent操作RabbitMQ

Java Client操作RabbitMQ 文章目录 Java Client操作RabbitMQ1.pom依赖2.连接工具类3.简单模式4.工作队列模式&#xff08;work&#xff09;公平调度示例 5.发布/订阅模式&#xff08;fanout&#xff09;交换机绑定示例代码 6.路由模式&#xff08;direct&#xff09;7.Topic匹配…...

lablelme标注的数据转成YOLO v8 格式

1 labelme 转 yolov8 格式 import json import cv2 import numpy as np import os def json2yolo(path):# dic{N_shaoxi:0, N_qiaoqi:1, N_qiaojie:2, N_pianyi:3, N_yiwu: 4, \# NV_shaoxi: 5, NV_qiaoqi: 6, NV_qiaojie: 7, NV_pianyi: 8, NV_yiwu: 9,\# …...

【linux】cat 命令

cat 命令是 Linux 和 Unix 系统中非常基础且常用的一个命令&#xff0c;它的全称是 "concatenate" 的缩写&#xff0c;意为“连接”或“串联”。尽管名字听起来像是专门用于连接文件的&#xff0c;但 cat 命令的用途远不止于此。它主要用于查看、创建、合并文件内容&…...

速通sass基础语法

速通Sass语法&#xff1a; sass的特点&#xff1a; 由于css的缺陷&#xff1a;无法自定义变量&#xff0c;不可引用&#xff0c;嵌套等。sass/scss/less等css预处理器产生。以sass为例&#xff0c;引入了变量、嵌套、运算、混入(Mixin)、继承、颜色处理、函数等诸多功能。方便…...

Vue: watch5种监听情况

目录 一.watch的性质与作用 1.watch 的性质包括&#xff1a; 2.watch 常用于以下场景&#xff1a; 二.监视ref定义的基本类型数据 三.监视ref定义的对象类型数据 四.监视reactive定义的对象类型数据 五.监视ref或reactive定义的对象类型数据中的某个属性 六.监视上述的…...

Android 车联网——汽车系统介绍(附2)

汽车系统指的是由多个模块或组件组成的系统,如发动机系统、制动系统、空调系统等,这些系统通常由多个 ECU 协同工作来完成特定的任务。 一、汽车系统 1、防抱死制动系统 ABS(Anti-lock Braking System,防抱死制动系统)是一项重要的汽车安全技术,其主要功能是在车辆紧急…...

C++ 链表

基本用法 C++提供了list容器,这是一个双向链表,能高效进行数据添加和删除。 引入头文件 #include <iostream> #include <list> // 引入list头文件 using namespace std;创建和初始化 list...

中国初创公司数量下降了98%

近年来&#xff0c;中国风险投资市场的风云变幻&#xff0c;通过IT Juzi&#xff08;IT桔子&#xff09;等权威数据服务提供商的透镜&#xff0c;得以清晰展现。数据显示&#xff0c;自2018年的鼎盛时期——拥有51,302家初创公司以来&#xff0c;这一数字在短短五年内急剧下降至…...

【SSRF漏洞】——http协议常见绕过

改变的确很难&#xff0c;但结果值得冒险 本文如有错误之处&#xff0c;还请各位师傅指正 一.ssrf概述 SSRF全称为Server-side Request Fogery,中文含义服务器端请求伪造 SSRF是一种由攻击者构造形成由目标服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标…...

[网络][CISCO]CISCO_华为网络设备端口镜像配置

CISCO 华为网络设备端口镜像配置大全 isco交换机通常支持2组镜像&#xff0c;4000系列有支持6组镜象的。支持所全端口镜像。 Cisco catylist2820 有2个菜单选项 先进入menu选项&#xff0c;enable port monitor 进入cli模式&#xff0c; en conf term interface fast0/…...

第二十五章 添加数字签名

文章目录 第二十五章 添加数字签名数字签名概述添加数字签名 第二十五章 添加数字签名 本主题介绍如何向 IRIS Web 服务和 Web 客户端发送的 SOAP 消息添加数字签名。 通常&#xff0c;会同时执行加密和签名。为简单起见&#xff0c;本主题仅介绍签名。有关结合加密和签名的信…...

GHOST重装后DEF盘数据救援指南

一、现象解析&#xff1a;GHOST重装后的DEF盘失踪之谜 在计算机维护的日常中&#xff0c;GHOST重装因其快速便捷的特点&#xff0c;成为众多用户解决系统问题的首选方法。然而&#xff0c;这一操作虽能迅速恢复系统至初始状态&#xff0c;却也暗藏风险&#xff0c;尤其是当不慎…...

使用blender快速制作metahuman面部以及身体绑定教程

【metablriger教程】使用blender一键绑定自定义角色metahuman绑定并导入UE5引擎教程_哔哩哔哩_bilibili 目前市面上的制作metahuman绑定的工具大多是maya的&#xff0c;metablriger是一个帮助用户快速制作metahuman绑定的blender插件&#xff0c;可以平替市面上已有的metahuma…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中&#xff0c;我们可能会遇到一些流式数据处理的场景&#xff0c;比如接收来自上游接口的 Server-Sent Events&#xff08;SSE&#xff09; 或 流式 JSON 内容&#xff0c;并将其原样中转给前端页面或客户端。这种情况下&#xff0c;传统的 RestTemplate 缓存机制会…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...