什么是Serial.begin(9600)?


Answers:


22

Serial.begin(9600)实际上不打印任何内容。为此,您需要使用Serial.print("Hello world!")打印文本“ Hello world!”。到串行控制台。而是以每秒9600位的速度初始化串行连接。

串行连接的两端(即Arduino和您的计算机)都需要设置为使用相同速度的串行连接,以获取各种可理解的数据。如果两个系统认为速度之间存在不匹配,则数据将出现乱码。

9600比特/秒是Arduino的默认设置,对大多数用户来说已经足够了,但是您可以将其更改为其他速度:Serial.begin(57600)将Arduino设置为每秒57600比特/秒。您需要将计算机上正在使用的任何软件(例如Arduino IDE的串行监视器)设置为相同的速度,以便查看正在发送的数据。


2
Baud和BPS是两个不同的东西……找不到我现在正在寻找的链接。
匿名企鹅2014年

如果我输入“ Serial.begin(0);”怎么办?或“ Serial.begin(4000);”。我的意思是我想知道数字之间的区别是什么?
shajib0o 2014年

3
Serial.begin用于设置通信速度,以每秒位数为单位。一个字节等于8位,但是串行连接发送一个开始和停止位,以标识接收系统特定字节的开始和结束。因此,发送一个字符需要10位。使用Serial.begin(0)告知Arduino,它应该以每秒0位的速度与串行通信。如您所料,这意味着Arduino将永远不会发送任何数据。 Serial.begin(4000)将导致Arduino以每秒4000位的速度发送数据。这是非标准的,但是可以。
heypete

2
简而言之:更改数字会更改速度。减小数字(例如Serial.begin(300))会使Arduino发送数据的速度变慢。增加到57600,可以更快地发送数据。发送系统和接收系统都需要就使用的速度达成共识:您的计算机的串行程序(例如Arduino Serial Monitor窗口)将让您设置计算机接收数据的速度,但您只能从通用速度:300、1200、2400、4800、9600、19200、38400、57600和11520位/秒。您不能输入其他速度,例如4000。9600通常很好。
heypete 2014年

Baud and BPS are two different things... can't find the link I was looking for now.-这是一种解释:附录C:“波特”与“ bps”
尼克·加蒙

21

图片价值1000字,所以他们说,(如果使用计算机,则为1024字),所以我会发布一些图片...

我将Uno设置为以9600波特发送“ Fab”,并在逻辑分析仪上捕获了结果。

串行通讯-3个字母

红色阴影部分是字节之间的“空闲”时间段。

从上面的图形中可以看出,Tx(发送)数据线通常为高电平(1),直到它变为低电平以指示字符(字节)的开始。这是开始位。然后以波特率(每秒9600个样本)出现8个数据位(由白点表示)。之后,线再次被拉高。这是停止位(红色部分)。然后,我们看到下一个字符的起始位,依此类推。“停止”部分可以无限长,但是必须至少为一位长。


有关第一个字符(字母“ F”或0x46或0b01000110)的更多详细信息,请参见此处:

串行通讯-一个字节

  • A-无数据(Tx高)

  • B-“起始位”。该行被拉低以告知接收器一个字符(字节)开始发送。接收器在对线路进行采样之前等待一个半时钟时间。

  • C-第一个字符到达(字母“ F”或0x46或0b01000110)。没有时钟位,输入数据仅以波特率(传输)进行采样。与SPI通信相反,数据首先到达最低有效位(如果您不每字节发送8位)。因此,我们看到的是01100010(而不是01000110)。

  • D-停止位。这始终很高,以确保我们可以区分此字节的末尾和下一个字节的开始。由于起始位为零,终止位为一,因此始终存在从一个字节到下一个字节的清晰过渡。

  • E-下一个字符的起始位。


您可以从逻辑分析仪捕获中看到T1 - T20.1041667 ms,恰好是1/9600:

1 / 9600 = 0.00010416666 seconds

因此,9600的速率可提供每秒位数,而倒数是位数之间时间间隔


其他注意事项

  • 串行通信不是自计时的(不同于SPI或I2C等),因此发送方和接收方都必须就时钟速率达成共识。

  • 时钟速率在Arduino上并不精确,因为硬件必须将系统时钟分频才能获得串行时钟,并且分频并不总是精确的。几乎总是有一个错误,此数量在数据表中给出(16 MHz系统时钟引用的数字,例如Uno上的数字):

    串行波特率错误

  • 您可以更改数据位数,而不必发送8位,实际上您可以发送5至9位。

  • 可以选择在数据位之后发送一个奇偶校验位。

    • 如果指定“奇数”奇偶校验,则奇偶校验位的设置方式是1位的总数为奇数。
    • 如果指定“偶数”奇偶校验,则将奇偶校验位设置为1位的总数为偶数。
    • 如果未指定奇偶校验,则忽略奇偶校验位。

    这可以帮助接收器检测数据是否正确到达。

  • 奇偶校验位在停止位之前发送。

  • 在9个数据位的情况下(如SeaTalk协议中所用),奇偶校验位被重新用作第9个数据位。因此,您不能同时拥有9个数据位和一个奇偶校验位。

  • 您也可以有两个停止位。这基本上只是延长了字节之间的时间。在过去,这样做是为了让慢速的机电设备可以处理前一个字节(例如打印出来)。


可能的腐败

如果您开始侦听流中间的串行数据,则很有可能将流中间的0位解释为起始位,然后接收器将不正确地解译所有内容。

从中恢复的唯一真实方法是不时地存在足够大的间隙(例如10位长),以防止这种情况发生。


倒逻辑

此处显示的位(逻辑级)未反转。即,1位为高,0位为低。如果您有RS232设备,则可能会发送-12 V表示1位,而+12 V表示0位。这是相反的,因为电压方向上的1小于0。

如果您有这样的设备,则需要进行电压转换和逻辑反相。像MAX232这样的芯片将为您完成这一切。它们还可以在一些用户提供的电容器的帮助下在内部生成设备,从而提供驱动此类设备所需的-12 V电压。


速度法则

由于有一个起始位,8个数据位和一个停止位,我们总共有10位,因此根据经验,您可以通过将比特率除以10 来计算每秒可传输的字节数。

例如。在9600 BPS下,您可以每秒发送960字节。


复制代码:

void setup() 
  { 
  Serial.begin(9600); 
  Serial.print("Fab"); 
  } 

void loop ()
  {
  }

1

; TLDR; 它初始化串行通信端口并设置波特率。您正在与之通信的设备(或Arduino IDE串行监视器)必须设置为匹配的波特率。初始化端口后,即可开始发送或接收字符。Arduino串行参考


不要减少或不尊重@ Nick-Gammon对这个主题的出色报道。
linhartr22

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.