你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用 ustruct 进行字节数值重组,潘多拉开发板陀螺仪

[复制链接]
我夏了夏天 发布时间:2019-8-22 16:20

8 H' X5 ]3 W1 R2 C* M9 Y
最近在用 RT-Thread MicroPython 操作潘多拉开发板读取 icm20608 传感器中的加速度和角速度,可算是费了一番功夫。- ]) O4 H2 ~! q/ D5 c& P  ~

9 \8 K) o6 ]* J( ?/ g* ^7 ]我想要将从寄存器中读取来的字节数据拼接成十六位的整形,然后打印出来。但是想要把每次读取出来的无符号单字节数据拼成十六位的整形遇到了困难。
1 l2 W, ?! v/ ?4 y# F
  l5 N: n: [5 B* R- |! [3 n最开始的思路是使用位运算,对读出的数据进行移位操作,然后拼接在一起,最终赋值给一个变量。最终发现无论如何使用位运算进行操作,都无法获得一个十六位的有符号整形数据,因为 python 总是会用一个更大的数据结构来存放拼接后的数值,导致最终的打印结果永远是一个无符号的正数。最终发现想要解决这个问题,必须要使用 struct 模块。$ M; U5 J: Q4 D& ^

+ m: c  n8 c) l9 K5 [使用这个模块进行数据拼接前,还要搞清楚数据的大小端问题,也就是先读出来的字节数据是高位还是低位问题,如果搞反了,最终得到的结果肯定是混乱的。大概率会看到各种莫名其妙的负数。  R+ m# ]6 ^3 n7 D* k$ G

  V7 m& o* d. `1 N话不多说,直接上代码了,一下代码实现了将两个字节合成一个十六位的有符号整形数据.5 B- x1 x7 r7 ?# K( Y

' Q. r9 Z8 Q6 V! C/ Q) @7 I4 }buf=bytearray(2)& Z/ p- i. d& {( q* P! b/ W
buf[0] = xyz[1]7 \  M) U7 \9 T/ l" q) H* P
buf[1] = xyz[0]
) j( B% ^/ c5 t* g4 p# i( Mgyro_x = struct.unpack("<h", buf)
1 A$ \4 K' _$ q6 w# e0 ?/ J) d, I7 s$ v* Z% W8 n
需要注意的是 buf[0] 和 buf[1] 里面存放的数据位置,也就是高低位要搞清楚,这样才能在后面 unpack 之后获得正确的数据。
/ |. Q6 I4 q2 C
: \& _* d) u' T- e5 f" ^下面附上各种数据的代号:
, j: [/ {" s+ l! W( C) B5 k* W8 a5 w* z4 J! F; Z! d  |* S
    - fmt:数据类型
- G# |8 ?% X9 y7 m, p    -     b — 字节型
1 {/ u0 V* }- H; {0 f) S1 Z    -     B — 无符号字节型  \) b" Y7 Y1 k# P, K% {+ ~
    -     h — 短整型  b7 h  h4 A, Q* G
    -     H — 无符号短整型1 u8 `4 Q! F0 w3 ?" r! R
    -     i — 整型, \. D1 {  p. }4 Q2 o5 H7 n  h
    -     I — 无符号整型
. z+ r5 @4 u- f, N. g7 q7 z1 D    -     l — 整型
  A& H; m. |1 q% D    -     L — 无符号整型
) r6 ]6 j5 u% t; v6 A# `3 r    -     q — 长整型
9 x& T9 Q0 F% N. s  f9 v3 q' f    -     Q — 无符号长整型; a+ {; W3 {3 ^9 @8 j
    -     f — 浮点型
; f4 m1 C5 ^2 G1 \* K7 y) `    -     d — 双精度浮点型
3 `. Z3 [9 w# N- M" J  d1 q4 v# Y. n    -     P — 无符号型
收藏 评论0 发布时间:2019-8-22 16:20

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版