- 最后登录
- 2023-8-16
- 在线时间
- 3007 小时
- 阅读权限
- 100
- 注册时间
- 2007-12-3
- 积分
- 3923
- 帖子
- 2556
- 精华
- 6
- UID
- 15558
- 性别
- 保密
- WCA ID
- 2008CHEN27
- 兴趣爱好
- 理论
- 积分
- 3923
- 帖子
- 2556
- 精华
- 6
- UID
- 15558
- 性别
- 保密
- WCA ID
- 2008CHEN27
- 兴趣爱好
- 理论
|
当时暑假自己分析出来的,不过下面内容还是大部分转载自http://hackvalue.de/hv_atmel_stackmat
不多废话,直接切入主题。
1、StackMat的输出信号为2进制基带信号,所以如果把输出信号接到耳机,听起来会很不舒服(可类比用modem上网,虽然原理完全不同)
2、输出信号采用RS-232串行线的编码方式,每个数据帧一共10位,一个开始位,一个结束位,8位数据位。
2.1、StackMat不输出信号时,信道(即那个耳机线)处于“闲置”状态,电平为高(也许不同机器不一样,这里可以类比取反即可)
2.2、每个数据帧发送的第一位为“开始”位,与闲置电平相反。
2.3、数据帧的中间8位为数据位,低位先传。
---低位先传:比如我要传一个数字5,其2进制表示为00000101,则先传最低位的1,然后0,然后1,然后0......
2.4、每一帧的最后一位为“结束”位,与闲置电平相同。
3、StackMat会连续发送9个数据帧,总长90bit(也可以认为89bit),除去上述开始与结束位,总共传送9字节(72bit)数据,不妨按先后顺序记为A0~A8,则它们分别有以下意义:
A0:ascii码,详细意义如下:
‘I’:初始化,即计时器刚打开,两只手悬空
‘A’:计时器已经准备好开始计时,两只手都已放上直到绿灯亮
‘ ’:正在计时中,且两只手均悬空
‘S’:计时完毕,且两只手均悬空
‘L’:左手放在了计时器上
‘R’:右手放在了计时器上
‘C’:两只手都放在了计时器上(但是绿灯还没亮)
A1~A5:显示时间的ascii码,即计时器上当前显示的时间为:A1 : A2 A3 : A4 A5
A6:校验和,将A1~A5表示的数字加起来即为A6。更精确的,A6=‘A1’+‘A2’+‘A3’+‘A4’+‘A5’+64,其中'Ai'表示该位代表的数字,而非其ascii
A7,A8:两个固定的ascii“CR”“LF”(这两个连续的ascii在windows下表示回车)
举例:
“S02527P[LF][CR]”表示:
当前计时器已拍下,计时器上显示的时间为0:25:27。注:
其中S表示当前处于计时完毕状态,02527表示当前显示的时间,‘P’为该时间的校验和,‘P'=64+0+2+5+2+7
整体举例:
不妨设在某个时刻通过监听耳机端口,我们获得了一下二进制信号群(从左往右为收到信号的顺序):
...1111011001010101000110010001011001001001100100001110010100011001000001010100101000010101100001111...
则根据前面所述数据帧规则,可以将这一串信号做如下划分:
...1111|0110010101|0100011001|0001011001|0010011001|0000111001|0100011001|0000010101|0010100001|0101100001|111...
可以看到总共可以得到9个数据帧,每帧长10bit,0开始,1结束。由于最后一定是连续的1,所以有时候会忽略最后的1,认为信道已经处于悬空状态。
将这9个数据帧分别提取其中的数据:(注意是低位先传,所以要逆序)
01010011 => 'S'
00110001 => '1'
00110100 => '4'
00110010 => '2'
00111000 => '8'
00110001 => '1'
01010000 => 'P'(=64+1+4+2+8+1)
00001010 => 'LF'
00001101 => 'CR'
于是我们可以得到如下信息:
计时器处于停止计时状态,计时器显示1:42.81
先写这么多,可能有点乱- - |
-
总评分: 经验 + 40
查看全部评分
|