| 
最后登录2023-8-16在线时间3007 小时阅读权限100注册时间2007-12-3积分3923帖子2556精华6UID15558性别保密WCA ID2008CHEN27兴趣爱好理论
 
   
 积分3923帖子2556精华6UID15558性别保密WCA ID2008CHEN27兴趣爱好理论
 
      | 
| 当时暑假自己分析出来的,不过下面内容还是大部分转载自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 
 查看全部评分
 |