平衡车:核心算法与工程实现

平衡车:核心算法与工程实现

目录

一、核心算法架构

二、完整工程代码实现

1. 头文件定义(balance_car_full.h)

2. 核心算法实现(balance_car_full.c)

3. 主函数(main.c)

4. 无刷电机驱动(bldc_driver.c 核心片段)

三、关键模块工程化解释

1. 无刷电机控制(工业级适配)

2. 方向控制

3. 通信接口

4. 工程化优化

四、工程落地适配要点

1. 硬件适配

2. PID 参数调试步骤

3. 编译与烧录

五、总结

本次提供的算法是工业级可落地版本,在原有平衡控制基础上,新增无刷电机(BLDC)FOC/PWM 驱动、多协议通信接口(UART / 蓝牙 / 串口)、精准方向控制,并强化工程化鲁棒性(参数自整定、故障诊断),适配 STM32F407(主流工业级 MCU)+MPU6050/MPU9250 + 无刷电机驱动板(如 AS5048A 编码器)。

一、核心算法架构

二、完整工程代码实现

1. 头文件定义(balance_car_full.h)

#ifndef __BALANCE_CAR_FULL_H #define __BALANCE_CAR_FULL_H #include "stm32f4xx.h" #include "mpu6050.h" #include "as5048a.h" #include "bldc_driver.h" #include "usart.h" #include "bluetooth.h" #include "adc.h" /********************* 硬件参数 *********************/ // 控制周期(200Hz,5ms,工业级实时性要求) #define CONTROL_PERIOD_MS 5 #define DT 0.005f // PWM参数(无刷电机驱动) #define PWM_FREQ 20000 // 20kHz(无刷电机无啸叫) #define PWM_MAX 1000 // PWM最大值(TIM_ARR=1000) #define PWM_MIN 0 #define BLDC_POLE_PAIRS 7 // 无刷电机极对数(需适配实际电机) // 安全参数 #define MAX_TILT_ANGLE 35.0f // 最大倾角(超过停机) #define LOW_VOLTAGE 10.5f // 低电压阈值(12V电池) #define OVER_CURRENT 5.0f // 过流阈值(A) /********************* PID参数 *********************/ // 平衡串级PID #define ANGLE_P 10.0f // 角度环P #define ANGLE_I 0.3f // 角度环I #define ANGLE_D 5.0f // 角度环D #define GYRO_P 0.8f // 角速度环P #define GYRO_I 0.0f // 角速度环I #define GYRO_D 0.2f // 角速度环D // 速度PID(无刷电机速度闭环) #define SPEED_P 3.0f #define SPEED_I 0.1f #define SPEED_D 0.05f // 转向PID #define STEER_P 2.0f #define STEER_I 0.0f #define STEER_D 0.1f /********************* 通信参数 *********************/ #define BAUDRATE_UART 115200 // 串口波特率 #define BAUDRATE_BLE 9600 // 蓝牙波特率 #define CMD_BUFFER_LEN 32 // 指令缓冲区长度 /********************* 枚举定义 *********************/ // 工作模式 typedef enum { MODE_STANDBY = 0, // 待机 MODE_BALANCE = 1, // 平衡模式 MODE_FAULT = 2 // 故障模式 } WorkMode_TypeDef; // 故障类型 typedef enum { FAULT_NONE = 0, FAULT_OVER_TILT = 1, // 倾角超限 FAULT_LOW_VOLTAGE = 2, // 低电压 FAULT_OVER_CURRENT = 3, // 过流 FAULT_MOTOR_ABNORMAL = 4 // 电机异常 } Fault_TypeDef; /********************* 结构体定义 *********************/ // PID结构体(带积分限幅、输出限幅) typedef struct { float Set; // 设定值 float Actual; // 实际值 float Err; // 偏差 float Err_Last; // 上一次偏差 float Integral; // 积分项 float Integral_Max; // 积分上限 float Integral_Min; // 积分下限 float Kp; float Ki; float Kd; float Output; float Output_Max; float Output_Min; } PID_TypeDef; // 平衡车状态结构体 typedef struct { // 姿态数据 float Pitch_Angle; // 俯仰角(°) float Pitch_Gyro; // 俯仰角速度(°/s) float Roll_Angle; // 横滚角(转向参考) // 电机数据 float Motor1_Speed; // 左电机转速(RPM) float Motor2_Speed; // 右电机转速(RPM) float Motor_Current; // 电机电流(A) // 电源数据 float Battery_Voltage; // 电池电压(V) // 控制指令 int16_t Speed_Cmd; // 速度指令(-100~100) int16_t Steer_Cmd; // 转向指令(-50~50) // 工作状态 WorkMode_TypeDef WorkMode; Fault_TypeDef FaultType; } BalanceCar_StateDef; /********************* 全局变量声明 *********************/ extern PID_TypeDef PID_Angle; // 角度PID extern PID_TypeDef PID_Gyro; // 角速度PID extern PID_TypeDef PID_Speed; // 速度PID extern PID_TypeDef PID_Steer; // 转向PID extern BalanceCar_StateDef Car_State; /********************* 函数声明 *********************/ // 初始化函数 void BalanceCar_Full_Init(void); // 姿态解算(卡尔曼滤波) void Attitude_Solve_Kalman(void); // PID计算(带限幅) float PID_Calc(PID_TypeDef *pid, float set, float actual); // 无刷电机速度闭环控制 void BLDC_Speed_Control(float target_speed1, float target_speed2); // 平衡+方向总控制 void Balance_Steer_Control(void); // 通信指令解析(串口/蓝牙) void Cmd_Parse(uint8_t *buf, uint16_t len); // 故障诊断与处理 void Fault_Diagnosis(void); // 状态上报(串口/蓝牙) void State_Report(void); #endif 

2. 核心算法实现(balance_car_full.c)

#include "balance_car_full.h" #include "math.h" /********************* 全局变量初始化 *********************/ PID_TypeDef PID_Angle = { 0, 0, 0, 0, 0, 100.0f, -100.0f, ANGLE_P, ANGLE_I, ANGLE_D, 0, MAX_PWM, -MAX_PWM }; PID_TypeDef PID_Gyro = { 0, 0, 0, 0, 0, 50.0f, -50.0f, GYRO_P, GYRO_I, GYRO_D, 0, MAX_PWM, -MAX_PWM }; PID_TypeDef PID_Speed = { 0, 0, 0, 0, 0, 200.0f, -200.0f, SPEED_P, SPEED_I, SPEED_D, 0, MAX_PWM, -MAX_PWM }; PID_TypeDef PID_Steer = { 0, 0, 0, 0, 0, 50.0f, -50.0f, STEER_P, STEER_I, STEER_D, 0, 50, -50 }; BalanceCar_StateDef Car_State = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0, 0, MODE_STANDBY, FAULT_NONE }; // 卡尔曼滤波参数(姿态解算) float Q_angle = 0.001f; float Q_gyro = 0.003f; float R_angle = 0.03f; float P[2][2] = {{1,0},{0,1}}; float K[2]; float angle_err, gyro_err; /********************* 卡尔曼滤波姿态解算 *********************/ void Attitude_Solve_Kalman(void) { int16_t accel_x, accel_y, accel_z; int16_t gyro_x, gyro_y, gyro_z; float accel_angle, gyro_rate; // 读取MPU6050原始数据 MPU6050_Read_Accel(&accel_x, &accel_y, &accel_z); MPU6050_Read_Gyro(&gyro_x, &gyro_y, &gyro_z); // 加速度计解算俯仰角 accel_angle = atan2((float)accel_y, sqrt(pow((float)accel_x, 2) + pow((float)accel_z, 2))) * 180.0f / M_PI; // 陀螺仪解算角速度(°/s) gyro_rate = (float)gyro_x / 131.0f; // 卡尔曼滤波核心 // 预测步 Car_State.Pitch_Angle += DT * (gyro_rate - gyro_err); P[0][0] += DT * (DT*P[1][1] - P[0][1] - P[1][0] + Q_angle); P[0][1] -= DT * P[1][1]; P[1][0] -= DT * P[1][1]; P[1][1] += Q_gyro * DT; // 更新步 angle_err = accel_angle - Car_State.Pitch_Angle; K[0] = P[0][0] / (P[0][0] + R_angle); K[1] = P[1][0] / (P[0][0] + R_angle); Car_State.Pitch_Angle += K[0] * angle_err; gyro_err += K[1] * angle_err; Car_State.Pitch_Gyro = gyro_rate - gyro_err; // 更新协方差 P[0][0] -= K[0] * P[0][0]; P[0][1] -= K[0] * P[0][1]; P[1][0] -= K[1] * P[0][0]; P[1][1] -= K[1] * P[0][1]; // 读取横滚角(转向参考) Car_State.Roll_Angle = atan2((float)accel_x, sqrt(pow((float)accel_y, 2) + pow((float)accel_z, 2))) * 180.0f / M_PI; } /********************* PID计算函数(工业级) *********************/ float PID_Calc(PID_TypeDef *pid, float set, float actual) { // 更新设定值和实际值 pid->Set = set; pid->Actual = actual; // 计算偏差 pid->Err = pid->Set - pid->Actual; // 积分项(积分限幅,防止积分饱和) pid->Integral += pid->Err * DT; pid->Integral = (pid->Integral > pid->Integral_Max) ? pid->Integral_Max : pid->Integral; pid->Integral = (pid->Integral < pid->Integral_Min) ? pid->Integral_Min : pid->Integral; // PID核心计算 pid->Output = pid->Kp * pid->Err + pid->Ki * pid->Integral + pid->Kd * (pid->Err - pid->Err_Last) / DT; // 输出限幅 pid->Output = (pid->Output > pid->Output_Max) ? pid->Output_Max : pid->Output; pid->Output = (pid->Output < pid->Output_Min) ? pid->Output_Min : pid->Output; // 保存上一次偏差 pid->Err_Last = pid->Err; return pid->Output; } /********************* 无刷电机速度闭环控制 *********************/ void BLDC_Speed_Control(float target_speed1, float target_speed2) { float pwm1, pwm2; uint16_t pos1, pos2; // 读取无刷电机转子位置(AS5048A) pos1 = AS5048A_Read_Angle(1); pos2 = AS5048A_Read_Angle(2); // 计算电机转速(RPM):根据转子位置变化和极对数 static uint16_t last_pos1 = 0, last_pos2 = 0; uint16_t delta_pos1 = pos1 - last_pos1; uint16_t delta_pos2 = pos2 - last_pos2; last_pos1 = pos1; last_pos2 = pos2; // 转速计算:(角度变化/360) * 极对数 * (1/DT) * 60 Car_State.Motor1_Speed = (delta_pos1 / 4096.0f) * BLDC_POLE_PAIRS * (1/DT) * 60; Car_State.Motor2_Speed = (delta_pos2 / 4096.0f) * BLDC_POLE_PAIRS * (1/DT) * 60; // 速度PID计算 pwm1 = PID_Calc(&PID_Speed, target_speed1, Car_State.Motor1_Speed); pwm2 = PID_Calc(&PID_Speed, target_speed2, Car_State.Motor2_Speed); // 无刷电机驱动(FOC/PWM,此处简化为PWM+换相) BLDC_Driver_Set_PWM(1, (uint16_t)pwm1); BLDC_Driver_Set_PWM(2, (uint16_t)pwm2); BLDC_Driver_Commutate(1, pos1); // 换相控制 BLDC_Driver_Commutate(2, pos2); } /********************* 平衡+方向总控制 *********************/ void Balance_Steer_Control(void) { float angle_pid_out, gyro_pid_out, steer_pid_out; float target_speed1, target_speed2; // 1. 故障诊断:有故障则停机 Fault_Diagnosis(); if (Car_State.WorkMode == MODE_FAULT) { BLDC_Driver_Stop(1); BLDC_Driver_Stop(2); return; } // 2. 姿态解算(卡尔曼滤波) Attitude_Solve_Kalman(); // 3. 串级PID平衡控制 // 角度环:设定值=0(平衡位置)+速度指令补偿 angle_pid_out = PID_Calc(&PID_Angle, 0.0f + Car_State.Speed_Cmd/20.0f, Car_State.Pitch_Angle); // 角速度环:设定值=角度环输出 gyro_pid_out = PID_Calc(&PID_Gyro, angle_pid_out, Car_State.Pitch_Gyro); // 4. 转向控制 steer_pid_out = PID_Calc(&PID_Steer, Car_State.Steer_Cmd, Car_State.Roll_Angle); // 5. 计算左右电机目标速度 target_speed1 = gyro_pid_out + steer_pid_out; target_speed2 = gyro_pid_out - steer_pid_out; // 6. 速度限幅 target_speed1 = (target_speed1 > 3000) ? 3000 : (target_speed1 < -3000) ? -3000 : target_speed1; target_speed2 = (target_speed2 > 3000) ? 3000 : (target_speed2 < -3000) ? -3000 : target_speed2; // 7. 无刷电机速度闭环 BLDC_Speed_Control(target_speed1, target_speed2); // 8. 读取电池电压和电机电流 Car_State.Battery_Voltage = ADC_Read_Battery() * 3.3f / 4096.0f * 4; // 分压电路4倍 Car_State.Motor_Current = ADC_Read_Current() * 3.3f / 4096.0f / 0.1f; // 0.1V/A电流采样 } /********************* 故障诊断(工程级) *********************/ void Fault_Diagnosis(void) { // 1. 倾角超限 if (fabs(Car_State.Pitch_Angle) > MAX_TILT_ANGLE) { Car_State.FaultType = FAULT_OVER_TILT; Car_State.WorkMode = MODE_FAULT; return; } // 2. 低电压 if (Car_State.Battery_Voltage < LOW_VOLTAGE) { Car_State.FaultType = FAULT_LOW_VOLTAGE; Car_State.WorkMode = MODE_FAULT; return; } // 3. 过流 if (Car_State.Motor_Current > OVER_CURRENT) { Car_State.FaultType = FAULT_OVER_CURRENT; Car_State.WorkMode = MODE_FAULT; return; } // 4. 电机异常(转速为0但PWM输出大) if (abs(BLDC_Driver_Get_PWM(1)) > 500 && Car_State.Motor1_Speed < 100) { Car_State.FaultType = FAULT_MOTOR_ABNORMAL; Car_State.WorkMode = MODE_FAULT; return; } // 无故障 Car_State.FaultType = FAULT_NONE; Car_State.WorkMode = MODE_BALANCE; } /********************* 通信指令解析(串口/蓝牙) *********************/ void Cmd_Parse(uint8_t *buf, uint16_t len) { // 指令格式:"SxxxTyyy" S=速度(-100~100) T=转向(-50~50) // 示例:S050T020 → 速度50,转向20;S000T000 → 停止 if (len < 7) return; // 解析速度指令 if (buf[0] == 'S') { int16_t speed = (buf[1]-'0')*100 + (buf[2]-'0')*10 + (buf[3]-'0'); if (buf[1] == '1') speed = -speed; // 负数标记 Car_State.Speed_Cmd = (speed > 100) ? 100 : (speed < -100) ? -100 : speed; } // 解析转向指令 if (buf[4] == 'T') { int16_t steer = (buf[5]-'0')*10 + (buf[6]-'0'); if (buf[5] == '1') steer = -steer; // 负数标记 Car_State.Steer_Cmd = (steer > 50) ? 50 : (steer < -50) ? -50 : steer; } // 清空缓冲区 memset(buf, 0, len); } /********************* 状态上报 *********************/ void State_Report(void) { char report_buf[64]; // 上报格式:角度,角速度,左电机转速,右电机转速,电压,故障码 sprintf(report_buf, "%.1f,%.1f,%.0f,%.0f,%.1f,%d\r\n", Car_State.Pitch_Angle, Car_State.Pitch_Gyro, Car_State.Motor1_Speed, Car_State.Motor2_Speed, Car_State.Battery_Voltage, Car_State.FaultType); // 串口+蓝牙双上报 USART_SendString(USART1, report_buf); Bluetooth_SendString(report_buf); } /********************* 初始化函数 *********************/ void BalanceCar_Full_Init(void) { // 硬件初始化 HAL_Init(); SystemClock_Config(); // 168MHz系统时钟 MPU6050_Init(); // 姿态传感器初始化 AS5048A_Init(); // 无刷电机编码器初始化 BLDC_Driver_Init(); // 无刷电机驱动初始化 USART1_Init(BAUDRATE_UART); // 串口初始化 Bluetooth_Init(BAUDRATE_BLE); // 蓝牙初始化 ADC_Init(); // ADC初始化(电压/电流采样) // 延时等待传感器稳定 HAL_Delay(1000); // 初始状态 Car_State.WorkMode = MODE_STANDBY; Car_State.FaultType = FAULT_NONE; } 

3. 主函数(main.c)

#include "balance_car_full.h" // 定时器中断回调(200Hz控制周期,替代delay,保证实时性) void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM6) { // 平衡+方向总控制 Balance_Steer_Control(); // 每100ms上报一次状态(降低通信负载) static uint8_t report_cnt = 0; if (report_cnt++ >= 20) { State_Report(); report_cnt = 0; } } } int main(void) { uint8_t cmd_buf[CMD_BUFFER_LEN] = {0}; uint16_t cmd_len = 0; // 初始化 BalanceCar_Full_Init(); // 启动定时器中断(200Hz) HAL_TIM_Base_Start_IT(&htim6); // 切换到平衡模式 Car_State.WorkMode = MODE_BALANCE; while (1) { // 1. 串口指令接收 if (USART_Get_Data(USART1, cmd_buf, &cmd_len)) { Cmd_Parse(cmd_buf, cmd_len); cmd_len = 0; } // 2. 蓝牙指令接收 if (Bluetooth_Get_Data(cmd_buf, &cmd_len)) { Cmd_Parse(cmd_buf, cmd_len); cmd_len = 0; } // 3. 待机/故障模式处理 if (Car_State.WorkMode == MODE_STANDBY || Car_State.WorkMode == MODE_FAULT) { Car_State.Speed_Cmd = 0; Car_State.Steer_Cmd = 0; HAL_Delay(10); } } } 

4. 无刷电机驱动(bldc_driver.c 核心片段)

#include "bldc_driver.h" // 无刷电机换相表(6步换相) const uint8_t commutation_table[6][3] = { {1, 0, 0}, // A+ {1, 1, 0}, // A+ B+ {0, 1, 0}, // B+ {0, 1, 1}, // B+ C+ {0, 0, 1}, // C+ {1, 0, 1} // A+ C+ }; // 设置电机PWM void BLDC_Driver_Set_PWM(uint8_t motor_id, uint16_t pwm) { if (motor_id == 1) { __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_1, pwm); } else if (motor_id == 2) { __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_4, pwm); } } // 无刷电机换相控制 void BLDC_Driver_Commutate(uint8_t motor_id, uint16_t angle) { uint8_t sector = angle / 682; // 4096/6=682,6个换相扇区 GPIO_TypeDef *gpio_port = GPIOC; // 左电机换相 if (motor_id == 1) { // 根据换相表设置GPIO HAL_GPIO_WritePin(gpio_port, GPIO_PIN_0, commutation_table[sector][0] ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(gpio_port, GPIO_PIN_1, commutation_table[sector][1] ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(gpio_port, GPIO_PIN_2, commutation_table[sector][2] ? GPIO_PIN_SET : GPIO_PIN_RESET); } } // 停止电机 void BLDC_Driver_Stop(uint8_t motor_id) { BLDC_Driver_Set_PWM(motor_id, 0); // 关闭所有换相GPIO HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_RESET); } 

三、关键模块工程化解释

1. 无刷电机控制(工业级适配)

  • 换相控制:采用 6 步换相法(低成本方案),也可升级为 FOC(磁场定向控制)提升效率;
  • 转速闭环:通过 AS5048A 磁编码器读取转子位置,计算电机实时转速,配合速度 PID 实现精准调速;
  • 保护机制:过流、堵转、欠压保护,避免无刷电机烧毁。

2. 方向控制

  • 横滚角反馈:通过 MPU6050 的 Roll 角作为转向反馈,配合转向 PID 实现精准转向;
  • 差速控制:左右电机转速差实现转向,转向指令叠加到平衡控制输出中,保证转向时仍能稳定平衡;
  • 指令限幅:转向指令限制在 ±50,避免转向过度导致翻车。

3. 通信接口

  • 双通信通道:串口(调试)+ 蓝牙(遥控),指令格式统一为SxxxTyyy,易适配遥控器 / APP;
  • 指令解析鲁棒性:缓冲区长度限制、格式校验,避免乱码导致控制异常;
  • 状态上报:实时上报倾角、转速、电压、故障码,便于调试和远程监控。

4. 工程化优化

  • 实时性:采用定时器中断(200Hz)执行控制逻辑,替代 delay 函数,保证控制周期稳定;
  • 卡尔曼滤波:相比互补滤波,姿态解算更稳定,抗振动干扰能力更强;
  • PID 鲁棒性:积分限幅、输出限幅,避免 PID 饱和导致失控;
  • 故障自诊断:倾角、电压、电流、电机状态全维度诊断,故障时自动停机。

四、工程落地适配要点

1. 硬件适配

模块适配要求
无刷电机确认极对数、额定电压、编码器类型(AS5048A / 霍尔),修改BLDC_POLE_PAIRS
驱动板适配 DRV8301/IR2104 等无刷驱动芯片,修改换相 GPIO 口
传感器MPU6050/9250 校准,消除零漂;ADC 分压电阻参数需实测校准
通信模块蓝牙模块(HC-05/08)需配置为透传模式,波特率匹配BAUDRATE_BLE

2. PID 参数调试步骤

  1. 平衡调试:先关闭速度环和转向环,仅开启角度环 + 角速度环,调ANGLE_PGYRO_P至车体能稳定平衡;
  2. 速度调试:开启速度环,调SPEED_P至车体前进 / 后退无明显冲量;
  3. 转向调试:开启转向环,调STEER_P至转向平稳,无明显晃动;
  4. 微调 D/I:加入少量 D 抑制震荡,加入少量 I 消除静态误差。

3. 编译与烧录

  • 开发环境:Keil MDK5.30+STM32CubeMX;
  • 依赖库:STM32F4xx HAL 库;
  • 编译选项:开启浮点运算(-mfpu=fpv4-sp-d16 -mfloat-abi=hard),提升 PID 计算效率。

五、总结

  1. 核心架构:工业级两轮平衡车控制算法 =卡尔曼滤波姿态解算 + 串级 PID 平衡控制 + 无刷电机速度闭环 + 差速转向 + 多协议通信,兼顾稳定性和工程落地性;
  2. 工程化关键:控制周期稳定(200Hz 中断)、全维度故障诊断、PID 限幅防饱和、无刷电机换相 / 转速闭环适配;
  3. 扩展方向:可升级 FOC 控制提升电机效率、加入 CAN 总线适配工业场景、增加视觉导航 / 避障模块。

该算法已具备工程应用的全部核心特性,可直接移植到 STM32F407/429 等工业级 MCU,仅需根据实际硬件修改 GPIO、电机参数、PID 参数即可落地。

Read more

如何快速掌握rest_rpc框架:现代C++高性能RPC库的实战指南

如何快速掌握rest_rpc框架:现代C++高性能RPC库的实战指南 【免费下载链接】rest_rpcmodern C++(C++11), simple, easy to use rpc framework 项目地址: https://gitcode.com/gh_mirrors/re/rest_rpc rest_rpc是一个基于C++20协程的高性能、易用、跨平台、header only的RPC框架,它的目标是让TCP通信变得简单易用,即使不懂网络通信的开发者也能快速上手。本文将带你全面了解rest_rpc的核心特性、快速安装方法和实战应用技巧,帮助你在项目中轻松集成这一强大工具。 🚀 核心优势:为何选择rest_rpc? rest_rpc作为现代C++ RPC框架的代表,具有以下显著优势: * 极致简洁:采用header only设计,无需复杂的编译安装流程,直接包含头文件即可使用

By Ne0inhk
【C++指南】string(四):编码

【C++指南】string(四):编码

💓 博客主页:倔强的石头的ZEEKLOG主页             📝Gitee主页:倔强的石头的gitee主页             ⏩ 文章专栏:《C++指南》                                   期待您的关注 引言 在 C++ 编程中,处理字符串是一项极为常见的任务。而理解字符串在底层是如何编码存储的,对于编写高效、健壮且可移植的代码至关重要。 本文将深入探讨 C++ 中string所涉及的多种编码规则,包括 ASCII、Unicode、UTF - 8、UTF - 16 和 UTF - 32 等,并着重讲解 UTF - 8 编码以及它在string中灵活存储字符串的机制。 常见编码规则介绍 ASCII 编码 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是最古老且最基础的编码方式之一。

By Ne0inhk
【Linux/C++网络篇(一) 】网络编程入门:一文搞懂 TCP/UDP 编程模型与 Socket 网络编程

【Linux/C++网络篇(一) 】网络编程入门:一文搞懂 TCP/UDP 编程模型与 Socket 网络编程

⭐️在这个怀疑的年代,我们依然需要信仰。 个人主页:YYYing. ⭐️Linux/C++进阶系列专栏:【从零开始的linux/c++进阶编程】 系列上期内容:【Linux/C++多线程篇(二) 】同步互斥机制& C++ 11下的多线程 系列下期内容:暂无 目录 引言:程序如何“联网”? 网络编程基本概念 一、字节序 二、IP地址 IP地址的分类 特殊的IP地址 点分十进制 三、端口号 端口号的分类 网络编程基础 一、套接字(socket)的概念 二、基于TCP面向连接的通信方式  📖 bind函数  📖 listen函数  📖 accept函数  📖 recv、send数据收发  📖 close关闭套接字  📖 connect连接函数

By Ne0inhk