Answers:
从Arduino网站获取Serial.write和Serial.print:
Serial.write()
将二进制数据写入串行端口。该数据以字节或一系列字节的形式发送;要发送代表数字数字的字符,请改用print()函数。
Serial.print()
将数据作为人类可读的ASCII文本打印到串行端口。
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");
串行输出:
Serial.write
将字节发送到串行端口,同时Serial.print
发送ASCII字符,以便人们轻松阅读。
一些设备使用字节来设置配置,通常使用数据包,并且您需要使用写功能与它们通信。最终,它们将通过串行接口发送字节,然后您可以通过遍历每个字节来进行解释。
上面的所有示例都是正确的,但也许更清楚...。通过串行端口发送的所有数据均以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位发送。
尽管这不是一个完整的描述,但我希望它能帮助您朝正确的方向思考...
解决此问题的另一种方法是声明Serial.write接受单个字符,而Serial.print接受字符串。可能会有一些差异,但这是主要的差异。