標籤:

Arduino 的 Serial.write() 和 Serial.print() 的區別在哪裡?

聽說Serial.print()自帶數字轉文本,然後按照文本傳輸,而Serial.write()直接是數據本身.我目前是想把ADC的轉換結果通過串口發出去,不過用Serial.print()這個函數太慢了.而
Serial.write()要自己寫轉換程序,而且要想辦法判斷數據的頭和尾,很複雜.


這個問題的答案其實大家都說對了,簡單來說分為兩點:

  • 在輸出字元或字元串時,沒有任何區別。

  • 在輸出數值時,write會直接輸出數據本身,而print會將其轉化為可顯示的ASCII字元。

======裝逼分割線======

下面就結合Arduino底層的實現詳細解釋一下。要讀懂下面的內容,你需要具有C++面向對象程序設計的基本知識。

Arduino設置這樣功能相似的兩組函數,究其原因是因為其採用了面向對象的設計。Arduino中有一個重要的虛基類,叫做Print,它還有一些派生的虛基類,其中之一叫做Stream,由Stream類派生出了Serial。write和print都有多個重載,write有一個非常重要的重載在Print類中被定義為了純虛函數,也就是輸出單個位元組的write函數。這就意味著Print的派生類必須要實現這些函數,否則就是虛基類,無法創建實例。這種設計的思想是,將更高層的、平台無關的東西放到抽象的基類中,而將具體的、硬體相關的東西放到派生類中,從而實現代碼的復用。

與聲明為純虛的write不同的是,print函數及其所有的重載均在最抽象的Print虛基類中進行了實現。隨著print重載實現的,還有另外一個函數,叫做printNumber,大家之所以沒見過這函數,是因為它是Print類的私有函數。printNumber函數的作用就是將整數值按照指定的進位轉換成ASCII碼。在print的某些重載(例如輸出int變數的重載)中,會調用printNumber來將整數變數變成ASCII字元輸出。而write函數是在最具體的Serial類中實現的,Serial類中的write直接進行了寄存器的操作。

綜上,write和print兩個函數在面向對象設計中不屬於一個層面,print函數是平台無關的,在最抽象的虛基類中實現的。而write函數是平台相關的,在最具體的派生類中實現的。

也許你已經猜到了,Arduino中所有可以print的類幾乎都繼承(或者間接繼承)了Print類,並自己實現了具體的write方法。除了Serial以外,還有乙太網、Wi-Fi、LCD等等。例如常用的LiquidCrystal類中的write函數,則實現了LCD讀寫的具體協議(時序邏輯)。這也就是為什麼LCD類可以像Serial一樣方便地調用print將信息輸出到LCD。


謝邀,我覺得print,printf是開發出來專門針對pc端顯示的,write則是用來與串口設備通信的,當然在老手眼裡怎麼用都行


看ide中print和write的實現代碼最好了。


為啥我感覺,之前的回答都錯了! 難道是因為Arduino編譯版本的原因嗎?

測試的結果應該是, 在輸出數值時:

1, print 出來的是真實數值,

2, write出來的是ascii碼錶對應的值(或者是說"對應的圖形").

比如 Serial.print(33)--&>顯示的結果就是33.

而Serial.write(33)--&>顯示的結果是ascii(33)對應的符號"!". 現在開始貼圖如下:

但是最高票答案裡面@況琪 ,說" 在輸出數值時,write會直接輸出數據本身,而print會將其轉化為可顯示的ASCII字元 ". 看在有11個贊的情況下,我非常困惑.

可能的原因:

1, 這11個贊自己都沒有試過真的寫一點代碼;

2, Arduino編譯的版本不一樣導致的;

3, 我自己出了問題.

如果是原因3, 希望各位朋友積極指正,真的,很重要.先謝謝

-----------------------------------我是認真的分割線------------------------------------------

我又去查了一下Arduino的官方解釋如下:

確實,官方解釋說: print會返回ASCII值(如圖中紅線標註), 但是,就如藍色線標註出來的命令行所說: Serial.print(78)--&>得到的是 78, 而不是 SCII(78)="N".

那好吧,我返回Arduino 再寫一遍,這次區分度比較高,而且是使用78作為賦值:

結果顯示: 使用print, 會得到原始數值78. 使用write, 會得到78對應的ascii碼.

這個,真的讓人十分費解.難道是我的理解有誤? 求解答.


實測實測,Serial.print 輸入給串口的是ASCII碼值,Serial.write輸入給串口的是真實數值,經過是錯得到,希望能對其他朋友有所幫助!


前面聲明省略,後面

Serial.println(eingabe);

Serial.write(eingabe);

Serial.println();

Serial.println(eingabe+6);

Serial.write(eingabe+6);

Serial.println();

Serial.println(eingabe-1);

Serial.write(eingabe-1);

Serial.println();

Serial.println(5*eingabe);

Serial.write (5*eingabe);

Serial.println();

如果你的eingabe是2的話,

出來的結果是

50

2

56

8

49

1

250

ú

print出來的是ascii碼,write是真實數字。


按照arduino官網reference的解釋,serial. print()是print data to the serial port as human-reading ASC II text ,serial. write()是write binary data to the serial port ,一個轉化為文本輸出,一個是數據輸出,樓主的理解是對的。不過print很慢嗎?我用的時候沒感覺到。write()的轉換程序很簡單,對照asc ii表,每個數字的asc ii 值只是在自身的基礎上偏移了一個常數。用write和write都要判斷數據的起始和終止吧?


推薦閱讀:

arduino與電腦利用wifi數據互通,是怎麼實現的?
如何通過顏色識別技術,將不同顏色輸出相應數值。可以用單片機,arduino或者樹莓派嗎?
arduino為什麼沒有arm晶元的控制板?
Arduino有什麼炫酷的作品?
arduino控制舵機所需電源,以及廉價的 flex sensor?

TAG:Arduino |