python - 为什么在写入 I2C 之前对值使用位移位?
问题描述
我最近从 arducam 购买了 PTZ-Camera-controller,并在 github ( https://github.com/ArduCAM/PTZ-Camera-Controller ) 上找到了一种 API/Controller 软件。该模块与 I2C 集成,并在不同的寄存器上具有多种功能。我试图理解python程序,但我被程序中多次出现的一行代码弄糊涂了:
def read(self, I2C_address, register_address):
value = self.bus.read_word_data(I2C_address, register_address)
value = ((value & 0x00FF) << 8) | ((value & 0xFF00) >> 8) #This one
return value
def write(self, I2C_address, register_address, value):
if value < 0:
value = 0
value = ((value & 0x00FF) << 8) | ((value & 0xFF00) >> 8) #And this one
return self.bus.write_word_data(I2C_address, register_address, value)
例如,这些可用于读取或写入相机变焦电机。电机有 2317 步,缩放值的默认跨度为 0-18000。我想这是有道理的,因为如果你尝试写 18000 = 0x4650,你会得到:
值 = ((0x4650 & 0x00FF) << 8 | (0x4650 & 0xFF00) >> 8))
据我估计,这应该等于 2400。相当接近 2317。但是:
他们为什么要这样做,而不仅仅是输入范围从 0 到 2317?
解决方案
看起来这是在翻转 16 位整数中两个字节的顺序。这可能是从大端转换为小端,这是表示整数的两种不同方式。我认为控制器使用大端,PC 使用小端。(https://en.wikipedia.org/wiki/Endianness)
推荐阅读
- php - PHP - 最大的三重产品解决方案
- spring-integration - 使用 Java DSL 的消息传递网关的回复通道
- mongodb - 如何在没有 objectid 的情况下获得 mongodb 执行结果?
- sql - 在 Oracle 中用 JOIN 替换 IN 子句
- php - 为什么 URL 不能使用 XAMPP 转到其他文件夹目录?
- flutter - 如何解决移动应用程序中的“被 CORS 策略阻止”?不是网络应用程序
- angular - ViewEncapsulation 中的 None 选项不起作用
- arrays - 子进程无法访问 MPI 中的数组
- kustomize - Kustomize - 4.1 版本忽略了一项部署
- mongodb - 根据条件查询某个字段