STM32入门笔记(02):USART串口通信注意事项笔记(SPL库函数版)

在这里插入图片描述

这是通过串口通信发送过来的数据,里面包括了故障码,电压,电流,频率等信息,请你用STM32f103系列单片机的串口1读取该数据并解析出电压和电流是多少?

要用STM32F103系列单片机的串口1读取并解析发电机上的逆变器发送的数据,你需要编写代码来完成以下步骤:

  1. 初始化串口:配置STM32的USART1以正确的波特率和参数读取数据。
  2. 读取数据:从串口缓冲区读取完整的数据包。
  3. 解析数据:从数据包中提取电压和电流信息。

假设数据格式如下(每个字节的数据如图所示):

  • 起始位:字节0
  • 数据长度:字节1
  • 故障码、电压、电流、频率等信息从字节2开始

根据图片中的数据:

  • 电压信息在字节2和字节3
  • 电流信息在字节4和字节5

以下是一个示例代码,用于在STM32F103系列单片机上实现上述步骤:

#include "stm32f10x.h"
#include "usart.h"  // 包含USART初始化配置文件#define DATA_LENGTH 31  // 假设总共要读取31个字节的数据uint8_t received_data[DATA_LENGTH];  // 接收数据的缓冲区void USART1_IRQHandler(void) {static uint8_t i = 0;if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {received_data[i++] = USART_ReceiveData(USART1);if (i >= DATA_LENGTH) {i = 0;  // 重置接收计数器}}
}void init_USART1(uint32_t baudrate) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);// 配置USART1 Tx (PA.09) 作为推挽复用功能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置USART1 Rx (PA.10) 作为浮空输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// USART参数配置USART_InitStructure.USART_BaudRate = baudrate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);// 使能USART接收中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 配置USART1中断NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 使能USARTUSART_Cmd(USART1, ENABLE);
}int main(void) {uint16_t voltage = 0;uint16_t current = 0;// 初始化USART1,波特率设置为9600(根据实际情况调整)init_USART1(9600);while (1) {// 检查数据包是否完整接收if (received_data[1] == 28) {  // 确保接收的数据长度正确// 解析电压和电流数据voltage = (received_data[2] << 8) | received_data[3];current = (received_data[4] << 8) | received_data[5];// 在这里可以对解析出的电压和电流进行处理,例如显示或记录// 注意:电压和电流的单位以及是否需要转换取决于发送方的数据格式定义}}
}

注意事项:

  1. 波特率设置:根据实际设备的波特率设置USART_InitStructure.USART_BaudRate
  2. 数据长度检查:确保接收的数据长度正确。
  3. 电压和电流解析:根据具体协议,确定数据的字节顺序和单位。

进一步优化:

  1. 数据验证:增加数据包头和校验码的验证,以确保数据的准确性。
  2. 错误处理:处理接收过程中可能出现的错误,如丢包或数据损坏。

为了增加数据包头和校验码的验证,以确保数据的准确性,你可以对接收到的数据包进行更严格的检查和处理。以下是增加数据包头和校验码验证的详细步骤和示例代码。

数据包结构假设

假设你的数据包结构如下:

  • 起始位:字节0(例如,固定为0xAA)
  • 数据长度:字节1(例如,固定为28)
  • 数据内容:字节2到字节29
  • 校验码:字节30(例如,使用简单的累加和校验)

校验码计算方法

假设校验码是所有数据字节(包括起始位和数据长度)的累加和的低8位。

示例代码

以下代码展示了如何在STM32F103单片机上实现数据包头和校验码的验证:

#include "stm32f10x.h"
#include "usart.h"#define DATA_LENGTH 31  // 数据包总长度uint8_t received_data[DATA_LENGTH];  // 接收数据的缓冲区// 计算校验码
uint8_t calculate_checksum(uint8_t *data, uint8_t length) {uint8_t checksum = 0;for (uint8_t i = 0; i < length; i++) {checksum += data[i];}return checksum;
}// USART1中断服务程序
void USART1_IRQHandler(void) {static uint8_t i = 0;if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {received_data[i++] = USART_ReceiveData(USART1);if (i >= DATA_LENGTH) {i = 0;  // 重置接收计数器}}
}void init_USART1(uint32_t baudrate) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);// 配置USART1 Tx (PA.09) 作为推挽复用功能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置USART1 Rx (PA.10) 作为浮空输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// USART参数配置USART_InitStructure.USART_BaudRate = baudrate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);// 使能USART接收中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 配置USART1中断NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 使能USARTUSART_Cmd(USART1, ENABLE);
}int main(void) {uint16_t voltage = 0;uint16_t current = 0;// 初始化USART1,波特率设置为9600(根据实际情况调整)init_USART1(9600);while (1) {// 检查数据包是否完整接收if (received_data[1] == 28) {  // 确保接收的数据长度正确// 验证数据包头和校验码if (received_data[0] == 0xAA) {  // 验证起始位uint8_t checksum = calculate_checksum(received_data, DATA_LENGTH - 1);if (checksum == received_data[30]) {  // 验证校验码// 解析电压和电流数据voltage = (received_data[2] << 8) | received_data[3];current = (received_data[4] << 8) | received_data[5];// 在这里可以对解析出的电压和电流进行处理,例如显示或记录// 注意:电压和电流的单位以及是否需要转换取决于发送方的数据格式定义}}}}
}

代码解释

  1. 校验码计算

    • 函数calculate_checksum用于计算接收到的数据包的校验码。
  2. USART1中断服务程序

    • USART1_IRQHandler中,当接收到新字节时,将其存入接收缓冲区received_data中。
  3. 主循环

    • 检查接收的数据长度是否正确。
    • 验证起始位(假设为0xAA)。
    • 计算并验证校验码。
    • 解析并处理电压和电流数据。

注意事项

  • 波特率设置:根据实际设备的波特率调整USART_InitStructure.USART_BaudRate
  • 校验和验证:根据实际应用选择合适的校验算法,如CRC校验等。
  • 数据解析:根据实际数据格式调整解析代码。

为了处理接收过程中可能出现的错误,如丢包或数据损坏,你可以增加一些错误处理机制,包括超时处理、错误计数、数据重发请求等。以下是具体的步骤和代码示例。

增加错误处理机制

  1. 超时处理:设置接收数据的超时机制,如果在预定时间内没有接收到完整的数据包,则认为接收超时。
  2. 错误计数:记录接收错误的次数,当错误次数超过一定阈值时,采取相应的措施。
  3. 数据包头和校验码验证:在接收数据时,严格验证数据包头和校验码,确保数据完整性。
  4. 丢包重发机制:如果检测到数据包错误,可以请求发送方重新发送数据。

示例代码

以下是一个包含错误处理机制的示例代码:

#include "stm32f10x.h"
#include "usart.h"
#include <stdbool.h>
#include <string.h>#define DATA_LENGTH 31  // 数据包总长度
#define TIMEOUT_THRESHOLD 1000  // 超时时间阈值
#define ERROR_THRESHOLD 5  // 最大允许错误次数uint8_t received_data[DATA_LENGTH];  // 接收数据的缓冲区
uint8_t data_index = 0;  // 当前接收数据的索引
uint32_t timeout_counter = 0;  // 超时计数器
uint8_t error_count = 0;  // 错误计数器// 计算校验码
uint8_t calculate_checksum(uint8_t *data, uint8_t length) {uint8_t checksum = 0;for (uint8_t i = 0; i < length; i++) {checksum += data[i];}return checksum;
}// USART1中断服务程序
void USART1_IRQHandler(void) {if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {uint8_t received_byte = USART_ReceiveData(USART1);received_data[data_index++] = received_byte;timeout_counter = 0;  // 重置超时计数器if (data_index >= DATA_LENGTH) {data_index = 0;  // 重置接收计数器}}
}void init_USART1(uint32_t baudrate) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);// 配置USART1 Tx (PA.09) 作为推挽复用功能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置USART1 Rx (PA.10) 作为浮空输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// USART参数配置USART_InitStructure.USART_BaudRate = baudrate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);// 使能USART接收中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 配置USART1中断NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 使能USARTUSART_Cmd(USART1, ENABLE);
}int main(void) {uint16_t voltage = 0;uint16_t current = 0;// 初始化USART1,波特率设置为9600(根据实际情况调整)init_USART1(9600);while (1) {// 超时处理if (timeout_counter++ > TIMEOUT_THRESHOLD) {timeout_counter = 0;data_index = 0;  // 重置接收索引error_count++;if (error_count >= ERROR_THRESHOLD) {// 错误处理逻辑,例如重启或告警// 这里简单地重置错误计数器error_count = 0;}}// 检查数据包是否完整接收if (data_index == DATA_LENGTH) {// 验证数据包头和校验码if (received_data[0] == 0xAA && received_data[1] == 28) {  // 验证起始位和长度uint8_t checksum = calculate_checksum(received_data, DATA_LENGTH - 1);if (checksum == received_data[30]) {  // 验证校验码// 解析电压和电流数据voltage = (received_data[2] << 8) | received_data[3];current = (received_data[4] << 8) | received_data[5];// 在这里可以对解析出的电压和电流进行处理,例如显示或记录// 注意:电压和电流的单位以及是否需要转换取决于发送方的数据格式定义// 数据处理成功,重置错误计数器error_count = 0;} else {// 校验码错误error_count++;}} else {// 数据包头错误error_count++;}// 重置接收索引data_index = 0;}}
}

代码解释

  1. 超时处理

    • 通过timeout_counter计数器记录接收数据的超时时间。
    • 如果在预定时间内(TIMEOUT_THRESHOLD)没有接收到完整的数据包,则认为接收超时,重置接收索引并增加错误计数器。
  2. 错误计数

    • 通过error_count记录接收错误的次数,当错误次数超过ERROR_THRESHOLD时,可以采取相应的措施,比如重启或告警。
    • 在本示例中,错误计数器简单地重置。
  3. 数据包头和校验码验证

    • 检查接收到的数据包长度是否正确。
    • 验证起始位和数据长度。
    • 计算校验码并与接收到的校验码比较。
    • 如果数据包头或校验码错误,增加错误计数器。
  4. 丢包重发机制

    • 这个示例中没有具体实现丢包重发机制,但可以通过串口发送请求重新发送数据包的命令来实现。
    • 如果检测到数据包错误,可以发送请求给发电机上的逆变器,要求重新发送数据。

注意事项

  • 实际应用中,错误处理策略需要根据具体需求进行调整,例如记录错误日志、发送告警信息或重新初始化串口等。
  • 校验码计算方法可以根据实际应用进行调整,如使用CRC校验等。
  • 丢包重发机制可以通过串口发送指令来实现,需要和逆变器的通信协议相匹配。

为了提高通信的可靠性可以增加握手协议,确保双方在传输数据之前已经准备好,并且可以用于初始化一些必要的参数。

以下是一个简单的握手协议示例:

  1. 发送握手请求:STM32单片机发送握手请求到发电机上的逆变器。
  2. 等待握手响应:STM32单片机等待逆变器的握手响应。
  3. 验证握手响应:STM32单片机验证握手响应是否正确。如果正确,则继续进行数据传输;否则,重新发送握手请求或进行错误处理。

示例代码

以下是一个示例代码,展示了如何在STM32F103单片机上实现握手协议:

#include "stm32f10x.h"
#include "usart.h"
#include <stdbool.h>
#include <string.h>#define DATA_LENGTH 31  // 数据包总长度
#define TIMEOUT_THRESHOLD 1000  // 超时时间阈值
#define ERROR_THRESHOLD 5  // 最大允许错误次数
#define HANDSHAKE_REQUEST 0x55  // 握手请求命令
#define HANDSHAKE_RESPONSE 0xAA  // 握手响应命令uint8_t received_data[DATA_LENGTH];  // 接收数据的缓冲区
uint8_t data_index = 0;  // 当前接收数据的索引
uint32_t timeout_counter = 0;  // 超时计数器
uint8_t error_count = 0;  // 错误计数器// 计算校验码
uint8_t calculate_checksum(uint8_t *data, uint8_t length) {uint8_t checksum = 0;for (uint8_t i = 0; i < length; i++) {checksum += data[i];}return checksum;
}// USART1中断服务程序
void USART1_IRQHandler(void) {if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {uint8_t received_byte = USART_ReceiveData(USART1);received_data[data_index++] = received_byte;timeout_counter = 0;  // 重置超时计数器if (data_index >= DATA_LENGTH) {data_index = 0;  // 重置接收计数器}}
}void init_USART1(uint32_t baudrate) {GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 开启时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);// 配置USART1 Tx (PA.09) 作为推挽复用功能GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// 配置USART1 Rx (PA.10) 作为浮空输入GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// USART参数配置USART_InitStructure.USART_BaudRate = baudrate;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);// 使能USART接收中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);// 配置USART1中断NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);// 使能USARTUSART_Cmd(USART1, ENABLE);
}bool handshake(void) {uint32_t handshake_timeout = 0;// 发送握手请求USART_SendData(USART1, HANDSHAKE_REQUEST);// 等待握手响应while (handshake_timeout++ < TIMEOUT_THRESHOLD) {if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {uint8_t response = USART_ReceiveData(USART1);if (response == HANDSHAKE_RESPONSE) {return true;  // 握手成功}}}return false;  // 握手失败
}int main(void) {uint16_t voltage = 0;uint16_t current = 0;// 初始化USART1,波特率设置为9600(根据实际情况调整)init_USART1(9600);// 进行握手while (!handshake()) {// 握手失败,重新尝试}while (1) {// 超时处理if (timeout_counter++ > TIMEOUT_THRESHOLD) {timeout_counter = 0;data_index = 0;  // 重置接收索引error_count++;if (error_count >= ERROR_THRESHOLD) {// 错误处理逻辑,例如重启或告警// 这里简单地重置错误计数器error_count = 0;}}// 检查数据包是否完整接收if (data_index == DATA_LENGTH) {// 验证数据包头和校验码if (received_data[0] == 0xAA

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

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

相关文章

【Django项目】 音乐网站spotify复刻

代码&#xff1a;https://github.com/tomitokko/spotify-clone 注&#xff1a;该项目不是自己提供mp3文件&#xff0c;而是使用spotify 的api接口获取。

MySQL主从复制故障:“ Slave_SQL_Running:No“ 两种解决办法

问题 今天搭建MySQL的主从复制&#xff0c;查看从机状态时show slave status\G&#xff0c;发现这个参数为NO&#xff0c;导致主从复制失败。 Slave_SQL_Running: No 后面上网查阅了一下资料&#xff0c;大概就是因为在连接支持数据库后&#xff0c;也就是这个命令后&#xff…

c-lodop 打印面单 内容串页

场景&#xff1a;使用c-lodop程序调取打印机连续打印多张快递单时&#xff0c;上页内容&#xff0c;打到了下一页了 问题原因&#xff1a; 由于是将所有面单内容放到了一个页面&#xff0c;c-lodop 在打印时&#xff0c;发现一页放不下&#xff0c;会自动分割成多页 页面元素…

【在Postman中,如果后端返回的是String类型的数据但不是JSON格式,报错】

在Postman中&#xff0c;如果后端返回的是String类型的数据但不是JSON格式 问题描述解决办法 postman后端返回的String数据,不是json,怎么设置结果的接收&#xff1f; 问题描述 在postman中测试接口&#xff0c;报错Error&#xff1a;Abort&#xff0c;或者显示返回数据校验失…

coveralls使用pytest进行本地测试时报错SyntaxError: invalid escape sequence \S

## 错误复现&#xff1a; git clone gitgithub.com:TheKevJames/coveralls-python.git cd coveralls-python poetry install poetry run pytest## 错误内容&#xff1a; ## 完整的打印信息 test session starts platform darwin -- Python 3.8.18, pytest-8.2.1, pluggy-1.5.…

使用 LlamaParse 进行 PDF 解析并创建知识图谱

此 Python 笔记本提供了有关利用 LlamaParse 从 PDF 文档中提取信息并随后将提取的内容存储到 Neo4j 图形数据库中的综合指南。本教程在设计时考虑到了实用性&#xff0c;适合对文档处理、信息提取和图形数据库技术感兴趣的开发人员、数据科学家和技术爱好者。 该笔记本电脑的主…

可视化大屏,不搞点3D效果,感觉有点对不起观众呢。

使用3D模型可以为可视化展现增加更多的维度和真实感&#xff0c;提供更直观、生动的视觉效果。以下是一些3D模型在可视化展现中的作用&#xff1a; 增强沉浸感&#xff1a;通过使用3D模型&#xff0c;可以让观众感受到更真实的场景和物体&#xff0c;增强他们的沉浸感。这有助…

【数组】Leetcode 452. 用最少数量的箭引爆气球【中等】

用最少数量的箭引爆气球 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points &#xff0c;其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。 一支弓箭可以沿着 x 轴从不同点 完全垂直 地…

Freeswitch-Python3开发

文章目录 一、Freeswitch如何使用mod_python31.1 Freeswitch和python1.2 Freeswitch版本选择1.3 Freeswitch编译mod_python31.3.1 debian安装python31.3.2 Freeswitch编译mod_python31.3.3 加载 二、如何编写脚本2.1 函数的基本框架2.2 基本使用2.2.1 触发条件2.2.2 默认脚本位…

pycharm更改远程编辑器设置

pycharm的远程编辑器可以分为两个部分&#xff1a;SFTP服务器(用于传输文件&#xff09;和命令行&#xff08;用于控制linux&#xff09;系统。那么当创建完成后&#xff0c;如何才能更改其设置呢&#xff1f; 一、远程SFTP服务器设置 找到导航栏依次点击tools-deployment-co…

运行vue2项目基本过程

目录 步骤1 步骤2 步骤3 补充&#xff1a; 解决方法&#xff1a; node-scss安装失败解决办法 步骤1 安装npm 步骤2 切换淘宝镜像 #最新地址 淘宝 NPM 镜像站喊你切换新域名啦! npm config set registry https://registry.npmmirror.com 步骤3 安装vue-cli npm install…

采用伪代码及C代码演示如何解决脱机最小值问题

采用伪代码及C代码演示如何解决脱机最小值问题 问题背景算法设计伪代码实现C代码实现证明数组正确性使用不相交集合数据结构最坏情况运行时间的紧确界 问题背景 脱机最小值问题涉及到一个动态集合 &#xff08; T &#xff09; &#xff08;T&#xff09; &#xff08;T&…

并网逆变器学习笔记9---VSG控制

参考文献&#xff1a;《新型电力系统主动构网机理与技术路径》 “构网技术一般包含下垂控制&#xff0c;功率同步控制&#xff0c;虚拟同步机控制&#xff0c;直接功率控制&#xff0c;虚拟振荡器控制 等。其中&#xff0c;虚拟同步机技术&#xff0c;即 VSG&#xff0c;因其物…

蓝牙(2):BR/EDR的连接过程;查询(发现)=》寻呼(连接)=》安全建立=》认证=》pair成功;类比WiFi连接过程。

4.2.1 BR/EDR 流程&#xff1a; 查询&#xff08;发现&#xff09;》寻呼&#xff08;连接&#xff09;》安全建立》认证》pair成功 4.2.1.1 查询&#xff08;发现&#xff09;流程Inquiry (discovering) 类比WiFi的probe request/response 蓝牙设备使用查询流程来发现附近的…

Github 2024-05-24 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10Java设计模式:提高开发效率的正规化实践 创建周期:3572 天开发语言:Java协议类型:OtherStar数量:86766 个Fork数量:25959 次关…

探数API统计分享-1949年-2021年中国历年夏粮产量统计报告

​​​​​​​​中国历年夏粮产量​&#xff0c;为1949年到2021年我国每年的夏粮产量数据。2021年&#xff0c;我国夏粮产量为14596万吨&#xff0c;比上年增长2.2%。 数据统计单位为&#xff1a;万吨 。 我国夏粮产量有多少&#xff1f; 2021年&#xff0c;我国夏粮产量为1…

202206青少年软件编程(Python)等级考试试卷(三级)

第 1 题 【单选题】 下图所示, 有一个名为"书目.csv"的文件。 小明针对这个文件编写了 5 行代码,请问, 代码运行到最后打印在屏幕上的结果是? ( ) with open(书目.csv, r, encoding=utf-8) as f:for line in f.readlines

利用Axure模板快速设计,可视化大屏信息大屏,含近200例资源和各类部件

模板类别&#xff1a; **通用模板&#xff1a;**提供基础的布局和设计元素&#xff0c;适用于各种场景。 **行业特定模板&#xff1a;**如农业、医院、销售、能源、物流、政府机关等&#xff0c;针对不同行业提供专业模板。 **数据展示模板&#xff1a;**包括大数据驾驶舱、统…

webgl开发家居设计软件

WebGL是一种在网页浏览器中渲染3D图形的JavaScript API&#xff0c;它基于OpenGL ES标准&#xff0c;允许开发者创建和显示交互式的3D图形。开发基于WebGL的家居设计软件可以为用户提供一种全新的、沉浸式的家居设计体验。以下是开发此类软件的一些关键步骤和特点。北京木奇移动…