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