如何从示波器​​读取串行数据

电器工程 串行 示波器 海浪
2022-01-22 05:44:26

我有一个微控制器(PICAXE 20X2)和一个电位计。我对微控制器进行了编程,以便它将电位计的任何变化发送到 PC 的串行端口。显然它是一个 8 位 ADC。现在对我来说有趣的是能够在示波器上解码这些串行数据。

这里有两张图片,第一张是当微发送“0”到PC时,下一张是当它发送“255”时。数据正在使用 9600 buad 传输,我可以在 PC 终端接收它们。

第一张照片 在此处输入图像描述

第二张照片 在此处输入图像描述

所以我的问题是,我是否在示波器上捕获了正确的数据,其次是如何读取这些脉冲并将其解码为十六进制或 ascii 格式。我的意思是如何读取这个上升和下降脉冲(0/1)。

谢谢。

3个回答

首先,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 中数字的模式。

有些东西没有加起来。您的信号似乎是 3.3V 峰峰值,这意味着它们直接来自微信号。然而,微控制器 UART 电平(几乎)总是处于高电平空闲和低电平有效。您的信号与此相反,这是没有意义的。

为了最终将这些数据输入 PC,必须将其转换为 RS-232 电平。这是 PC COM 端口期望看到的。RS-232 为低电平空闲和高电平有效,但低电平低于-5V,高电平高于+5V。幸运的是,有一些芯片可以轻松地在典型的微控制器逻辑电平 UART 信号和 RS-232 之间进行转换。这些芯片包含电荷泵,可从您的 3.3V 电源产生 RS-232 电压。有时这些芯片通常被称为“MAX232”,因为这是该类型早期流行芯片的部件号。您需要不同的变体,因为您显然使用的是 3.3V 电源,而不是 5V。我们制造的产品基本上是带有连接器的板上的这些芯片之一。访问http://www.embedinc.com/products/rslink2并查看原理图以了解如何连接此类芯片的一个示例。

另一件没有加起来的事情是两个序列似乎都超过一个字节,即使您说您只发送 0 和 255。这种类型的串行数据先发送一个起始位,然后是 8 个数据位,然后是停止位。起始位始终处于与线路空闲电平相反的极性。在大多数描述中,线路空闲级别被称为“空间”,相反的被称为“标记”。所以起始位总是在标记处。起始位的目的是为其余位提供时间同步。由于双方都知道一个位有多长,唯一的问题是一个字节的开始时间。起始位提供此信息。接收器本质上是在起始位的前沿启动一个时钟,并使用它来了解数据位何时到来。

数据位按最低到最高有效顺序发送,标记为 1,空格为 0。在空格级别添加一个停止位,以便下一个起始位的开始是一个新的边沿,并留出一点时间字节之间。这允许发送者和接收者之间出现一点错误。如果接收者比发送者慢一点,否则它将错过下一个起始位的开始。接收器在每个新的起始位重置并重新启动其时钟,以防止计时错误累积。

所以从所有这些你应该能够看到第一个跟踪似乎正在发送至少两个字节,最后一个看起来可能是 5。

如果您扩大跟踪的时间范围,这将有所帮助。这样你就可以测量真正的一点时间。这将允许您验证您是否真的有 9600 波特(104 µs/位),并让您解码捕获的各个位。就像现在一样,没有足够的分辨率来查看位在哪里,因此实际上解码正在发送的内容。

添加:

我突然想到,您的系统可能正在以 ASCII 格式而不是二进制格式发送数据。这不是通常的做法,因为在小系统中转换为 ASCII 会占用更多有限的资源,使用带宽很差,而且如果你想向用户显示数据,很容易在 PC 上进行转换。但是,如果您的传输是 ASCII 字符,这将解释为什么序列超过一个字节,为什么第二个更长(“255”比“0”字符多),以及为什么两者看起来都以相同的字节结尾。最后一个字节可能是某种行尾字符,通常是回车或换行。

无论如何,扩大时间尺度,我们就可以准确解码它发送的内容。

您需要了解全部细节:速度、是否有起始位、数据位数、是否有停止位以及是否有奇偶校验位。这应该是如何配置微控制器中的 UART 的功能。

如果 Rigol 示波器没有串行解码选项(许多 DSO 有),您可以使用 X 光标来帮助解码。将第一个光标放在数据的前沿,然后将第二个光标移过比特流。光标之间的增量可用于通过简单的算术确定您当前悬停在哪个“位”上。显然,忽略开始/停止/奇偶校验位。