c - 解码二进制信号

标签 c binary protocols reverse-engineering gpio

我正在从 Raspberry Pi 上的 GPIO 引脚读取以下二进制信号(它是气象站的输出)。

第一列是二进制高位或二进制低位。第二列是它在该状态花费的时间(秒)。

如何将此信号转换为十六进制?!

...
0 14.929292
1 0.002127
0 0.006867
1 0.001393
0 0.005303
1 0.001274
0 0.006126
1 0.001361
0 0.007541
1 0.001417
0 0.005062
1 0.001474
0 0.005119
1 0.001565
0 0.004906
1 0.001587
0 0.004916
1 0.002031
0 0.006007
1 0.001479
0 0.003678
1 0.001485
0 0.000994
1 0.004142
0 0.000865
1 0.006277
0 0.003858
1 0.001288
0 0.001028
1 0.001468
0 0.000945
1 0.004138
0 0.003327
1 0.001303
0 0.001174
1 0.001318
0 0.001017
1 0.001510
0 0.001485
1 0.001080
0 0.001907
1 0.002782
0 0.001083
1 0.002012
0 0.000712
1 0.003984
0 0.001785
1 0.001291
0 0.003149
1 0.001185
0 0.001020
1 0.001719
0 0.000993
1 0.003965
0 0.001157
1 0.001346
0 0.001762
1 0.001353
0 0.003219
1 0.001090
0 0.001106
1 0.001475
0 0.001160
1 0.001079
0 0.003874
1 0.001387
0 0.001015
1 0.001168
0 0.001092
1 0.001336
0 0.002504
1 0.001466
0 0.006063
1 0.001391
0 0.001196
1 0.001460
0 0.001082
1 0.001237
0 0.005049
1 0.001654
0 0.004914
1 0.001410
0 0.002722
1 0.001601
0 47.818081
1 0.001452
0 0.007532
1 0.001438
0 0.007975
1 0.001494
0 0.003077
1 0.002131
0 0.003056
1 0.001254
0 0.002685
1 0.001372
0 0.005003
1 0.002051
0 0.006997
1 0.001608
0 0.004868
1 0.001524
0 0.002524
1 0.001397
0 0.003103
1 0.001211
0 0.002434
1 0.001328
0 0.003475
1 0.001469
0 0.003672
1 0.001384
0 0.003847
1 0.001101
0 0.001133
1 0.001352
0 0.003504
1 0.002133
0 0.003257
1 0.001070
0 0.001182
1 0.001511
0 0.003301
1 0.001482
0 0.003779
1 0.001210
0 0.001099
1 0.001396
0 0.001127
1 0.001433
0 0.001697
1 0.001434
0 0.003132
1 0.001175
0 0.001754
1 0.001520
0 0.002905
1 0.001425
0 0.003625
1 0.001155
0 0.001036
1 0.001469
0 0.001041
1 0.001422
0 0.001251
1 0.001275
0 0.003414
1 0.001446
0 0.001734
1 0.001653
0 0.000435
1 0.002349
0 0.000974
1 0.005346
0 0.003247
1 0.001265
0 0.001192
1 0.001213
0 0.001404
1 0.001349
0 0.000963
1 0.003732
0 0.001186
1 0.001220
0 0.002529
1 0.001357
0 0.002573
1 0.001700
0 0.001158
1 0.001058
0 0.002571
1 0.001314
0 0.001164
1 0.001364
0 0.124659
1 0.001485
0 0.007492
1 0.002176
0 0.006881
1 0.002083
0 0.005526
1 0.001351
0 0.005029
1 0.001528
0 0.001726
1 0.001366
0 0.002089
1 0.001258
0 0.002579
1 0.001463
0 0.001262
1 0.001487
0 0.000975
1 0.003736
0 0.002321
1 0.002073
0 0.004412
1 0.001433
0 0.002619
1 0.001390
0 0.002817
1 0.001201
0 0.003475
1 0.001512
0 0.000906
1 0.003958
0 0.003492
1 0.001581
0 0.000985
1 0.004103
0 0.001370
1 0.001046
0 0.001162
1 0.001534
0 0.001080
1 0.001510
0 0.003077
1 0.002124
0 0.003046
1 0.001293
0 0.003908
1 0.001406
0 0.001002
1 0.001109
0 0.001524
1 0.001009
0 0.001347
1 0.001448
0 0.000950
1 0.003651
0 0.001133
1 0.002038
0 0.002838
1 0.001991
0 0.002866
1 0.001291
0 0.003824
1 0.001191
0 0.001163
1 0.001447
0 0.000970
1 0.004059
0 0.000972
1 0.006388
0 0.001252
1 0.001262
0 0.001345
1 0.001329
0 0.004930
1 0.001273
0 0.003556
1 0.001570
0 0.003431
1 0.001550
0 0.001256
1 0.001461
0 0.001098
1 0.001005
0 0.002555
1 0.001503
0 0.005044
1 0.002070
0 0.004427
1 0.001499
...

正如您所看到的,它在大约 48 秒内为零,然后激发 1 和 0 的负载,然后再次回到零。

我需要弄清楚协议(protocol)。我不知道那是什么。我唯一掌握的信息是,当前温度为 21 摄氏度,风速为零,风向为零。非常感谢任何见解,

plot of binary data

上面是两个不同传输的一些二进制数据的图。

最佳答案

正如 @NikolaiNFetissov 所说,绘制您测量的周期。但从 48 秒休息后的第一个间隔开始,绘制了几个图,一个在另一个之上。

所以你将拥有:

A (21C) _____|----------|_____|-----|_____|-----

B (24C) ______|---------|_____|-----------|__________

Clock   _____|-----|_____|-----|_____|-----|_____|-----

etc

我会测量不同条件下的几个周期(例如不同的温度但相同的风/方向),将它们绘制出来,然后看看您是否可以看到模式的哪些部分发生了变化。如果您知道采样率并将其绘制出来,将会有所帮助。你说它是最快的,但我想你正在计算时钟滴答声或其他东西 - 或者你如何确定秒数?

编辑:

如何绘制它?我想象着一张方格纸和一支铅笔:-) 至于程序,我唯一的(简短的)经验是使用 gnuplot。为此,您必须根据间隔创建坐标列表,因此:

1 0.006
0 0.002
1 0.005
0 0.001

可能会变成:

x,     y
0.0,   1
0.006, 1
0.006, 0
0.008, 0
0.008, 1
0.013, 1
0.013, 0
0.014, 0

etc

我的猜测是,在安装和学习使用 gnuplot 以及创建坐标所需的时间里,您可以在纸上绘制数据并计算出代码。但对我来说,时钟频率是关键......(抱歉继续谈论它;-)

关于c - 解码二进制信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13591776/

相关文章:

python - 向 C 添加库

C语言递归控制

c - 如何将变量合并到位掩码中?

android - 交叉编译 - 用于 x86 的 tcpdump

objective-c - swift 协议(protocol) : what am i doing wrong?

c++ - 通过套接字多路复用数据

c++ - 从 C++ 程序构建 C 程序

c - (C) 能够取消和退出的整数计算器

c++ - 在二进制文件 C++ 中写入和加载结构 vector

ios - Swift4.2 : Why func gameDidEnd(_:) no need to use game parameter but still declare in the function?