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


21

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

这是两张图片,第一张是微控制器向PC发送“ 0”时,第二张是它发送“ 255”时。正在使用9600 buad传输数据,我可以在PC终端上接收它们。

第一张图片 在此处输入图片说明

第二张照片 在此处输入图片说明

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

谢谢。


3
串行线在逻辑“ 1”状态下处于空闲状态,因此请注意,此处的底部是1,顶部是0。我知道人们已经锁定了这一点。我的评论是为了指导将来的串行数据范围。您可以进行探测,以使空闲状态为高。
JustJeff 2011年

Answers:


14

奥林首先也注意到了一些:电平与微控制器通常输出的相反:

在此处输入图片说明

不用担心,我们也会看到我们也可以这样阅读。我们只需要记住,示波器上的起始位为a 1,终止位为0

接下来,您有错误的时基来正确阅读此内容。每秒9600位(比波特更合适的单位,尽管后者在每sé上都没错)是每秒钟104 s,这是当前设置的1/10分度。放大,然后在第一条边上设置垂直光标。那是您开始的起点。将第二个光标移动到每个下一个边缘。光标之间的差应为104 s的倍数。每104 s是一个比特,第一起始位(),则8个数据位,总时间832 S,和一个停止位()。 μ μ μμμμ1μ0

屏幕数据看起来与发送的数据不匹配0x00。你应该看到一个窄1位(起始位),其次是一个较长的低级别(936秒,8个零数据位+停止位)。 与您发送的邮件相同;您应该会看到一个较长的高电平(再次是936 μs,这次是起始位+ 8个数据位)。所以这应该是您当前设置的近1格,但这不是我所看到的。 它看起来更像是在第一个屏幕截图中发送两个字节,在后四个屏幕中发送第二个和第三个相同的值。 μμ
0xFFμ

猜测:

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位高,中间为低位。我也看不到比这更狭窄的东西,所以我想这只是一点点。那是我们的参考。
然后,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中的数字模式。


感谢您的提示,我将尝试捕获正确的波形并更新我的问题。
Sean87

谢谢,您是否可以像标记这些数据一样标记图片?
Sean87

1
@ Sean87-这已经是一个很长的故事了,我将其添加到了答案中。它说明了我这样做的方式,其他人可能会走不同的道路。如果您认为自己不会看一半,请不要担心。其中大部分只是经验和想象力。没有特别的情报。
stevenvh 2011年

很好的答案和问题,但是我想知道为什么您说示波器显示的是与实际相反的东西。我知道空闲线几乎总是很高,但是示波器不是应该捕获真实物体的精确图像吗?除非用户更改了示波器设置的参数。
Nikos

7

事情没有加起来。您的信号似乎是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”更多的字符),以及为什么两个都以同一字节结尾。最后一个字节可能是某种行尾字符,通常是回车符或换行符。

无论如何,扩大时间范围,我们可以准确地解码它所发送的内容。


1
停止位(与开始位相反)也迫使新传输开始时出现边沿。
stevenvh 2011年

@steven:是的,我意识到我在重新阅读答案后将其遗漏了,并在编辑中添加了它,大概是在您写评论的同时。
奥林·拉斯洛普

4
尽管发送ASCII是“低效的”,但仍然是一个很好的选择。我的大多数嵌入式系统不仅发送ASCII,而且还接收ASCII命令,从而可以通过从终端程序中与它们“进行对话”来进行手动实验。SCPI标准(对GPIB的一种改进,已扩展到其他电子接口)是一种非常正式的方法,可以遵循这些原则。
克里斯·斯特拉顿

4
坚决反对。Ascii只需极少量的代码,甚至可以在一个8比特的裸机上运行裸机。当然,您可以编写一个自定义程序,但是从现在起10年后,如果丢失了该程序,即使可以找到它,也将需要虚拟机来运行它?可以肯定的是,任何一个精疲力尽的程序员都可以破解二进制终端来反向工程。但是,在大多数情况下,但对于内存限制非常严格且对性能至关重要的系统,人类可读的接口却值得付出很小的开销。另外,如果您有内存,则可以打开/关闭嵌入调试输出。
克里斯·斯特拉顿

2
我应该提到,我是从ASCII接口开始的,因为这是客户的要求...但是我保留它们是因为它们很有用。我可以将一个想法作为命令添加到固件中,然后在设备中的任何位置对其进行测试。没有不必每次更新部署到客户端的配置我贴有额外的实验固件版本为寻找到一个复杂的系统,它是一个模块出现问题有人拥有。在与客户的电话上,我可以让他们启动一个终端并使用未发布的工厂测试功能来引导他们。
克里斯·斯特拉顿

1

您需要了解所有详细信息:速度,是否有起始位,数据位数,是否有停止位以及奇偶校验位。这应该取决于微控制器中UART的配置方式。

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


总是有一个起始位,总是有至少一个停止位。可能有额外的停止位,但与字节之间的死区时间没有区别。旧的机械解码器有时需要两个停止位,以留出时间使机制复位。如今,几乎总是有8个数据位,而没有奇偶校验位,但是正如您所说,这可能有所不同。
奥林·拉斯洛普
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.