Serial.write和Serial.print有什么区别?何时使用它们?


26

Serial.write和Serial.print有什么区别?何时使用它们?
两者都已用于在串行监视器上打印,它们的实际区别是什么?


极好的解释bpinhosilva!您帮助我非常清楚地了解了我一直在努力解决的问题。
罗里

Answers:


19

从Arduino网站获取Serial.writeSerial.print

Serial.write()

将二进制数据写入串行端口。该数据以字节或一系列字节的形式发送;要发送代表数字数字的字符,请改用print()函数。

Serial.print()

将数据作为人类可读的ASCII文本打印到串行端口。


17

Serial.write更加扎根,它简单而又快速,它是一次与一个二进制字节进行对话。例:

Serial.write(0x45);   // will write 0100 0101 to the cable

另一方面,Serial.print具有更多用途,它将为您完成从ASCII到二进制的转换,也可以转换为BIN / HEX / OCT / DEC,但是您需要像这样指定第二个参数

Serial.print(76, BIN) gives "0100 1100"
Serial.print(76, OCT) gives "114"
Serial.print("L", DEC) gives "76"
Serial.print(76, HEX) gives "4C" 

带有可视串行输出的更多示例:

码:

  Serial.write(0x48);   // H
  Serial.write(0x45);   // E
  Serial.write(0x4C);   // L
  Serial.write(0x4C);   // L
  Serial.write(0x4F);   // O

串行输出: 在此处输入图片说明

码:

  Serial.print("HELLO");

串行输出: 在此处输入图片说明

另一方面,如您在框架中看到的,Serial.println()将在行2的末尾添加字节0x0D和0x0A

码:

  Serial.println("HELLO");

串行输出:

在此处输入图片说明


7

Serial.write将字节发送到串行端口,同时Serial.print发送ASCII字符,以便人们轻松阅读。

一些设备使用字节来设置配置,通常使用数据包,并且您需要使用写功能与它们通信。最终,它们将通过串行接口发送字节,然后您可以通过遍历每个字节来进行解释。


5

上面的所有示例都是正确的,但也许更清楚...。通过串行端口发送的所有数据均以1和0发送。(很明显。。我希望)...这两个命令的不同之处在于,实际上是如何将发送的内容与这些1和0相互转换/解释。最清楚的例子是传输数字。

假设您需要发送数字217。此数字的二进制(1和0)表示为11011001。使用该命令Serial.write(217)实际上只会在整个行中发送11011001。相同数字的十六进制表示形式是0xD9,该命令Serial.write(0xD9)将发送相同的东西... 11011001。

这是有趣的地方...如果您使用该命令Serial.write("217"),则会得到以下信息:00110010 00110001 00110111 ...什么?!?!?
当将字符串作为参数传递时,它被分解为单个字符,转换为ASCII,然后作为每个字符的字节发送。如果使用以下命令,则将获得完全相同的输出:

Serial.write(50);
Serial.write(51);
Serial.write(55);

(00110010 00110001 00110111)

现在让我们看一下Serial.print()。这两个命令Serial.print(217)Serial.print("217")将打印相同的内容:00110010 0011000100110111。这是因为print命令首先将任何数字转换为字符串表示形式,然后使用该命令Serial.write()将每个字符作为单独的ASCII位发送。

尽管这不是一个完整的描述,但我希望它能帮助您朝正确的方向思考...


3

解决此问题的另一种方法是声明Serial.write接受单个字符,而Serial.print接受字符串。可能会有一些差异,但这是主要的差异。

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.