首先,Olin 也注意到了一点:电平与微控制器通常输出的相反:
不用担心,我们会看到我们也可以这样阅读。我们只需要记住,在示波器上,起始位将是 a1
和停止位0
。
接下来,您有错误的时间基准来正确阅读此内容。每秒 9600 位(比波特更合适的单位,尽管后者每个 sé 没有错)是每位 104\$\mu\$s,这是您当前设置的 1/10 分度。放大,并在第一条边上设置一个垂直光标。那是你开始位的开始。将第二个光标移动到每个下一个边缘。游标之间的差异应该是 104\$\mu\$s 的倍数。每个 104\$\mu\$s 为一个位,首先是起始位(1
),然后是 8 个数据位,总时间 832\$\mu\$s,以及一个停止位(0
)。
屏幕数据看起来与发送的不匹配0x00
。您应该看到一个窄1
位(起始位),然后是一个较长的低电平(936\$\mu\$s,8 个零数据位 + 一个停止位)。您发送
的内容相同;0xFF
您应该看到一个长高电平(同样是 936\$\mu\$s,这次是起始位 + 8 个数据位)。所以这应该是您当前设置的近 1 个师,但这不是我所看到的。
在第一个屏幕截图中看起来更像是您发送了两个字节,而在第二个屏幕截图中,第二个和第三个字节的值相同。
猜测:
0b11001111 = 0xCF
0b11110010 = 0xF2
0b11001101 = 0xCD
0b11001010 = 0xCA
0b11001010 = 0xCA
0b11110010 = 0xF2
编辑
Olin 是绝对正确的,这有点像 ASCII。事实上,它是 ASCII 的1 的补码。
0xCF ~ 0x30 = '0'
0xCE ~ 0x31 = '1'
0xCD ~ 0x32 = '2'
0xCC ~ 0x33 = '3'
0xCB ~ 0x34 = '4'
0xCA ~ 0x35 = '5'
0xF2 ~ 0x0D = [CR]
这证实了我对截图的解释是正确的。
编辑2(我如何解释数据,应大众要求:-))
警告:这是一个很长的故事,因为它是当我尝试解码这样的事情时我脑海中发生的事情的记录。仅当您想学习一种解决方法时才阅读它。
示例:第一个屏幕截图上的第二个字节,从 2 个窄脉冲开始。我故意从第二个字节开始,因为边缘比第一个字节多,所以更容易正确处理。每个窄脉冲大约是一个格的 1/10,因此每个脉冲可能高 1 位,中间有一个低位。我也没有看到比这更窄的东西,所以我猜它只是一点点。那是我们的参考。
然后,经过101
一段较长时间的低位。看起来大约是以前的两倍宽,所以可能是00
. 高跟随又是两倍宽,所以这将是1111
。我们现在有 9 位:一个起始位 ( 1
) 加上 8 个数据位。所以下一位将是停止位,但因为它是0
它不是立即可见的。所以把它们放在一起,我们就有了1010011110
,包括开始位和停止位。如果停止位不为零,我会在某个地方做出错误的假设!
请记住,UART 首先发送 LSB(最低有效位),因此我们必须反转 8 个数据位:11110010
= 0xF2
。
我们现在知道了一个位、一个双位和一个 4 位序列的宽度,我们来看看第一个字节。第一个高周期(宽脉冲)比第二个字节稍宽1111
,因此将是 5 位宽。其后的低周期和高周期都与另一个字节中的双位一样宽,所以我们得到111110011
. 还是 9 位,所以下一个应该是低位,即停止位。没关系,所以如果我们的猜测是正确的,我们可以再次反转数据位:11001111
= 0xCF
。
然后我们得到了奥林的提示。第一次通信长 2 个字节,比第二次短 2 个字节。而“0”也比“255”短2个字节。所以它可能有点像 ASCII,虽然不完全一样。我还注意到“255”的第二个和第三个字节是相同的。太好了,那将是双“5”。我们做得很好!(你必须不时鼓励自己。)解码“0”、“2”和“5”后,我注意到前两个代码之间的差异为 2,最后一个代码之间的差异为 3二。最后我注意到这0xC_
是 的补码0x3_
,它是 ASCII 中数字的模式。