实际二进制值与示波器值之间的差异


14

我试图在示波器上看到ASCII“ A”字符,但实际的二进制值和示波器值却不同,为什么?ASCII“ A”二进制值-01000001

示波器显示以下图形:

ASCII A

ASCII A

我使用Arduino Uno使用以下代码发送ASCII值:

void setup() {  
  Serial.begin(9600);  
}  

void loop() {  
  Serial.println("A");  
  delay(1000);  
}

Answers:


35

读取示波器波形的方法如下。我花了一些时间编辑您的波形图片,并对其进行注释以显示哪个位。微控制器每个字符发送10位。START始终为0,8个数据位,STOP始终为1。该行也停留在1,因此第一个START下降沿将向接收器通知字节即将到来。这些位首先发送给LSB,因此,如果您想通过语法来“看一下”它们,则需要水平镜像它们以使它们有意义。每个位的宽度由波特率决定,发送器和接收器必须都知道波特率是什么。

从下面的图片中,您可以看到它发送了三个字符:ASCII字符“ A”,回车符和换行符。

在此处输入图片说明


如果是串行通讯,则波给这样。对?什么是CR和LF?CR或LF还能得到什么其他数据?
user38701 2015年

1
CR是回车,LF是换行。它们一起形成换行符,例如,光标移至下一行的开头。它们是“ ASCII”标准(“美国信息交换标准代码”),google“ ASCII图表”或其他内容的一部分。
PkP

@ user38701:按Enter键时将发生CRLF。从技术上讲,CR应该是返回键,而LF应该是Enter键,但是串行控制台将Enter键解释为CRLF(有时只是LF)。在大多数编程语言中,CR为“ \ r”,LF为“ \ n”,但某些编译器/语言为“ \ n”输出CRLF
slebetman 2015年

1
回车很简单。他使用了一个println命令,这意味着打印字符串以及一个“ \ r \ n”。所以三个字符
ps95

1
值得注意的是线路终端是特定于系统的.CRLF主要是Windows和Arduino线路终端。如果您使用Linux上的终端作为“ A”的源重复进行相同的测试,则只会看到LF。
Nicolas Holthaus

13

如果您查看Arduino println()文档,您会发现它在末尾附加了回车符和换行符。因此,以十进制表示的结果将是65(A),13(CR)和10(LF),二进制表示为:

01000001 00001101 00001010

异步串行数据首先发送到LSB,因此变为:

10000010 10110000 01010000

您的信号处于高电平空闲状态,因此起始位将为0,终止位将为1,因此将其添加到每个字节中,最终得到:

0100000101 0101100001 0010100001

从图表中确定确切的时间有点困难,但这似乎至少可以大致匹配,并且应该让您知道一些额外的位来自何处以及它们为什么要重新排序。Kvegaoro提供的Wikipedia链接提供了许多有关异步串行数据的良好背景信息。


1

如果您显示的是异步串行流,则示波器将显示相应的起始位,停止位和奇偶校验位。还要考虑到您的信号是否反转,并且天气是最高有效位优先或最低有效位优先。如果您添加有关图片中表示的串行流的更多详细信息,我们可以为您提供更好的详细答案,否则,这只是有根据的猜测

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.