Arduino上Serial和Stream有什么区别,Serial.write是如何实现的?

时间:2018-02-24 18:00:14

标签: c++ arduino

我在理解Serial和Stream这两个术语之间的区别时遇到了很多麻烦。 Serial不是Stream的一种类型吗?

我对家庭作业有疑问,我不明白。

计算机“读取”他们通过使用(Streams或Serial?)相互发送的数据来确定每个字节的含义?

另外,Serial.write()也让我很困惑。它返回一个字节的数据,对吗?一个字节是8位。因此,如果将一个int类型(16位)传递给Arduino上的Serial.write(),它将返回2个字节到串行流?

同样,如果变量是Arduino C中的无符号长整数,我们如何使用Serial.write()将此变量的最重要字节表示为串行流?

例如,我将变量x作为unsigned long。将Serial.write(x>>8)作为正确的答案,因为长是32位,所以无符号使它成为两倍大。由于Serial.write()以字节为单位返回,因此64/8将为8.

所有这些问题看起来都非常业余,但我真的想学习这些东西,而我的老师并不是最好的解释。如果有人能够在概念上更清楚地表达这一点,我将永远感激不尽。谢谢!

1 个答案:

答案 0 :(得分:4)

Stream是Serial继承的基类。 Serial是一种Stream,但还有其他类型的Stream。

写作与一种重要的印刷方式不同。 write将事物作为原始字节发送,并将print发送为ascii。所以我的Serial.print(255)arduino实际上会发送3个字节,所有三个数字的ascii代码。但是如果我Serial.write(255)那么Arduino将发送一个值为255(0b11111111)的单字节。

write返回的数字是写入的字节数。它返回调用者,而不是串行流。它告诉调用者写入了多少字节。

  

例如,我将变量x作为unsigned long。将Serial.write(x>> 8)作为正确的答案,因为long为32位,因此无符号使其成为两倍大。由于Serial.write()以字节为单位返回,因此64/8将为8

你在这里有一些非常根本的误解。无符号版本与签名版本的32位相同。它可以容纳两倍大的数字,因为它不需要符号位,但它具有相同的位数。要使MSB保持32位数量,您需要向右移动24位。 Bitshifts是位而不是字节。所以myLong>> 24