amazing814 发表于 2017-3-7 21:49:23

串口Serial.print() 和Serial.write()的区别

print 和write的区别,其实不难理解, 我自己也写了一个小程序来测试(结果如图1所示).
1, Serial.print(78) --> 结果得到的是: 78
2, Serial.write(78) --> 结果得到的是78对应的ascii码值:N


但是,问题来了, 从各种回答帖子还有官网上,我得到了一个非常矛盾的解释:"Prints data to the serial port as human-readable ASCII text. "(如图二所示). 这句解释让我非常困惑....Serial.print(78) 明明显示了 78 这个数值,并非 ascii码值 N. 那为什么官方解释还有所有回答贴上,都注明了"在输出数值时,write会直接输出数据本身,而print会将其转化为可显示的ASCII字符"呢?
会不会是我对于这些回答/官方解释,的字面意思,理解错了? 请求各位大牛解答~ 先谢谢了.

Be1ieve 发表于 2017-3-8 12:04:54

write()所有内容以byte形式打印
Writes binary data to the serial port. This data is sent as a byte or series of bytes

print()会分辨数字跟文字
This command can take many forms

Super169 发表于 2017-3-8 18:04:50

你的兩個 "78", 意義上有很大的分別.

第一個 "78", 是一個字串的 "78", 這就是 human-readable 既 "78", 它背後佔用 2 個 byte, 分別是 0x37 及 0x38.
而第二個 78 (顯示為 "N"), 它只佔用 1個 byte,數值是 10進 的 78, 亦即是 0x4e.

所謂 human-readable, 就是人類可以直接讀取的吧.這裡假設了人類是以十進看數字, 所以用了 10進制把 78 顯示出來了.但人類看的有時會比較混亂, 你可以試試:

Serial.print(78);
Serial.print("78");

看看兩者有什麼分別?在電腦中, 78 跟 "78" 是完全不同的, 但用 human-readable 的表現時, 就變成一樣了.所以, print 的結果, 主要用於"給人看"的地方.電腦內部通訊, 如果不需要用人眼再檢查, 用 write 會比較好, 直接快捷.

其實 print 也不一定要顯示為 "78" 的, 你可以選用 HEX 去輸出, 就會是 "4E".

Be1ieve 发表于 2017-3-9 18:33:52

感觉现在写程序的渐渐对资料结构不是很注重了。你的问题其实参杂了三个格式:int, byte, char
print就是特别用于输出到监视窗口,会把数字转成可读型式,预设十进位
int(78) -> char('7')+char('8') -> 窗口 -> char('7' '8')
write只会输出最原始的资料,也就是byte型式
int(78) -> byte(0x4E) -> 窗口 -> char(78)=char('N')

164335413 发表于 2017-3-11 13:24:12

print属于格式化输出,如果不加条件,输出的都是字符型。
print有点类似于把write又封装了一下,可以控制输出格式以及字符串的输出。
页: [1]
查看完整版本: 串口Serial.print() 和Serial.write()的区别