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

上位机知识篇---二进制操作


文章目录

  • 前言
  • 接收数据示例:0xAA 0x12 0x34 0x55
  • 合并高/低字节数据
  • RGB565颜色值:0xF800(红色)
  • Python中负数右移
  • 接收帧:01 03 02 12 34 CRC


前言

本文简单对单片机、上位机中的映射(Mapping)和位移操作符(Bit Shifting)等相关知识进行了简单介绍.


一、单片机与上位机中的二进制操作基础
在嵌入式开发(单片机)和上位机编程(如Python、C#等)中,二进制操作是底层数据处理的核心,尤其在硬件控制、通信协议解析和数据压缩等领域。

  1. 位移操作符
    左移(<<):将二进制数向左移动指定位数,右侧补0。

作用:等效于乘以2^n(n为位移数)。

示例:0b0001 << 2 → 0b0100(十进制1→4)。

右移(>>):将二进制数向右移动指定位数,左侧补0(逻辑右移)或补符号位(算术右移)。

作用:等效于除以2^n(取整)。

示例:0b1000 >> 2 → 0b0010(十进制8→2)。

  1. 映射(Mapping)
    定义:将输入数据的范围按比例转换到目标范围,常用于传感器数据校准、数值标准化等场景。

公式:y = (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min

二、单片机中的二进制操作(以C语言为例)

  1. 位移操作符的应用
    场景1:控制IO引脚状态
    单片机中常用位移操作配置寄存器,例如设置某GPIO端口的第3位为高电平:

c
// 假设PORT寄存器为8位(0b00000000)
PORT |= (1 << 3); // 将第3位置1 → 0b00001000
场景2:组合多字节数据
从传感器读取的16位数据(如温度值)可能分为高8位和低8位,需合并:

c
uint8_t high_byte = 0x12; // 高字节
uint8_t low_byte = 0x34; // 低字节
uint16_t value = (high_byte << 8) | low_byte; // 0x1234
2. 映射操作示例
ADC数据转换为电压值
假设ADC为12位分辨率(0~4095),参考电压3.3V:

c
uint16_t adc_value = 2048; // ADC采样值
float voltage = (adc_value / 4095.0) * 3.3; // 映射到0~3.3V → 1.65V
三、上位机中的二进制操作(以Python为例)

  1. 位移操作符的应用
    场景1:解析通信协议
    从单片机接收的二进制数据包中提取字段(例如协议格式:[Header][DataHigh][DataLow][Checksum]):

python

接收数据示例:0xAA 0x12 0x34 0x55

header = data[0] # 0xAA
data_high = data[1] # 0x12
data_low = data[2] # 0x34
checksum = data[3] # 0x55

合并高/低字节数据

value = (data_high << 8) | data_low # 0x1234 → 4660
场景2:数据压缩与位掩码
使用位掩码提取特定比特位(例如RGB565颜色格式):

python

RGB565颜色值:0xF800(红色)

red = (color & 0xF800) >> 11 # 提取5位红色 → 0x1F (31)
green = (color & 0x07E0) >> 5 # 提取6位绿色 → 0x00 (0)
blue = color & 0x001F # 提取5位蓝色 → 0x00 (0)
2. 映射操作示例
传感器数据标准化
将原始数据(01000)映射到0100%的百分比:

python
raw_value = 750
percentage = (raw_value - 0) * (100 - 0) / (1000 - 0) + 0 # 75%
四、关键技巧与注意事项
位运算优先级

位移操作符(<</>>)优先级低于加减乘除,必要时需加括号:

c
uint8_t a = 1 << 3 + 2; // 等价于1 << (3+2) = 32,而非(1<<3)+2=10
有符号数的位移

右移有符号数时,C语言使用算术右移(补符号位),Python使用逻辑右移(补0):

python

Python中负数右移

(-8) >> 1 # -4 (二进制补码操作)
映射的精度问题

整数运算可能导致精度丢失,需使用浮点数:

c
int mapped_value = (x * out_max) / in_max; // 错误:可能截断小数
float mapped_value = (x * out_max) / (float)in_max; // 正确
五、实际项目案例
案例1:单片机控制LED矩阵
目标:通过位移操作实现LED流水灯效果。

代码:

c
for (int i = 0; i < 8; i++) {
PORT = (1 << i); // 依次点亮第0~7位LED
delay_ms(100);
}
案例2:上位机解析Modbus协议
目标:从Modbus RTU帧中提取数据。

代码片段:

python

接收帧:01 03 02 12 34 CRC

slave_id = frame[0] # 0x01
func_code = frame[1] # 0x03
data_length = frame[2] # 0x02
data = (frame[3] << 8) | frame[4] # 0x1234 → 4660
六、总结
位移操作符:用于快速位操作、数据合并与拆分,是硬件控制和协议解析的核心。

映射:将原始数据转换为有意义的物理量,提升系统可读性和兼容性。

应用场景:

单片机:GPIO控制、ADC/DAC数据处理、通信协议封装。

上位机:数据解析、图形化显示、算法实现。

掌握这些操作可以显著提升嵌入式系统和上位机软件的开发效率与性能。


相关文章:

  • 科学养生,解锁健康生活密码
  • 【信息系统项目管理师-论文真题】2023下半年论文详解(包括解题思路和写作要点)
  • 【DeepMLF】具有可学习标记的多模态语言模型,用于情感分析中的深度融合
  • npm命令介绍(Node Package Manager)
  • 2025五一杯数学建模竞赛B题 矿山数据处理 保姆级教程讲解|模型讲解
  • 2025五一杯数学建模ABC题赛题已出
  • SpringAI系列 - 升级1.0.0-M8
  • VBA数据库解决方案第二十讲:Select From Where条件表达式
  • CMake中的“包管理“模块FetchContent
  • 2025五一数学建模竞赛B题完整分析论文(共42页)(含模型、可运行代码、数据)
  • 【CV数据集】DIOR遥感目标检测数据集(含处理好的YOLO、COCO、VOC格式和相关配置文件下载链接)
  • 数字智慧方案5971丨智慧农业大数据平台解决方案(59页PPT)(文末有下载方式)
  • AM剪辑软件汉化版:简单易用,开启视频创作之旅
  • 实现Sentinel与Nacos的规则双向同步
  • 案例:自动化获取Web页面小说(没钱修什么仙)——selenium
  • C++之特殊类设计及类型转换
  • linux下安装ollama网不好怎么办?
  • 【分享】数据恢复大师6.10[特殊字符]恢复手机误删的数据[特殊字符]
  • 位运算题目:寻找重复数
  • Flutter PIP 插件 ---- 新增PipActivity,Android 11以下支持自动进入PIP Mode
  • 苹果第二财季营收增长5%,受关税政策影响预计下一财季新增9亿美元成本
  • 视频丨英伟达总裁黄仁勋:美勿幻想AI领域速胜中国
  • 居委业委居民群策群力,7位一级演员来到上海一小区唱戏
  • 首开股份:一季度净利润亏损约10.79亿元,签约金额63.9亿元
  • 深入贯彻中央八项规定精神学习教育中央指导组培训会议召开
  • 一位排球青训教练的20年时光:努力提高女排球员成才率