使用串口進行調(diào)試的基本技巧

Arduino IDE相比Visual C++ 6.0等開發(fā)環(huán)境在調(diào)試支持上顯得非常簡陋,而調(diào)試是編程必備技能,不會調(diào)試,編程就變?yōu)榱说托У摹霸囌`”,同時也失去了深入理解一些程序運行細節(jié)的機會。
在Arduino編程中,利用串口輸出一些程序運行過程的信息,是調(diào)試和監(jiān)控程序運行的最基本手段。
Arduino的Serial庫中,可用于輸出的方法主要有write()println()print(),后兩者的區(qū)別只是println()在輸出之后自動加一個換行,下次輸出的位置從下一行開始。
write()的用法如下:

  1. Serial.write(val)val可為整型或字符型變量,在串口監(jiān)視器中輸出val對應(yīng)ASCII碼的字符,如val=65,則串口監(jiān)視器輸出大寫字母A。若val的值超出了ASCII碼范圍,或者對應(yīng)到如“回車”(ASCII碼為13)這樣的不可打印字符,則會在串口監(jiān)視器中看到亂碼或無顯示。
  2. Serial.write("string"),在程序中需要原樣輸出一些字符串的時候,可以用這種方式。

綜上,write()可接受字符型和整型參數(shù),但輸出將自動轉(zhuǎn)化為字符形式。

由于編程調(diào)試時,我們所監(jiān)控的一些變量,很多是整型(如循環(huán)變量),我們希望直接在串口監(jiān)視器中看到它們的值(而非對應(yīng)的ASCII字符),這種情況下用write()就不那么方便了。

相比write()print()println()的優(yōu)勢就在于方便直接輸出整型數(shù)據(jù)。

void setup() {
   
   Serial.begin(9600);

}

void loop() 
{
    int c=1; //定義一個整型變量(模擬調(diào)試過程中要監(jiān)視的變量)

    Serial.write("Serial.write() output:");
    Serial.write(c);  //以write方式輸出測試
    Serial.println(); //換行
    Serial.write("Serial.println() output:");
    Serial.println(c); //以println方式輸出測試

   delay(1000);
}

上面這個示例代碼的運行結(jié)果如下:

上述代碼輸出結(jié)果

我們可以看到,由于write()輸出的是變量c的值(1)對應(yīng)ASCII碼,由于這是個非可見字符,所以在串口監(jiān)視器中表現(xiàn)為空白,而println()是直接輸出變量c的值,因而我們看到了“1”。
此外,println()還支持第二個參數(shù),可以指定輸出的數(shù)制。可用的參數(shù)包括DEC(十進制)、HEX(十六進制)、OCT(八進制)和BIN(二進制)。

小結(jié):調(diào)試過程中,需要監(jiān)控的變量為字符類型并且希望以字符的形式觀察變量,可用write(),如果希望以數(shù)值(整型)的形式觀察變量,則用println()

小試牛刀

Arduino的串口監(jiān)視器不僅能夠輸出,還能夠接受輸入。在有些情況下,為了方便程序識別輸入數(shù)據(jù)的結(jié)束,可以在輸入序列之后添加“結(jié)束符”。串口監(jiān)視器下方有這樣一個關(guān)于結(jié)束符的選項:分別是沒有結(jié)束符換行符回車符NL和CR(換行和回車符),它們有什么區(qū)別呢? 我們可以用println()來檢測一下:

void setup() {
   
   Serial.begin(9600);

}

void loop() {
    char c;  
    if(Serial.available())  {
    c=Serial.read(); //讀取串口監(jiān)視器中輸入的數(shù)據(jù)
    Serial.println(c, DEC); //將讀取數(shù)據(jù)的ASCII碼以十進制的形式顯示
    }
   delay(1000);
}

運行這段代碼,分別在串口監(jiān)視器中輸入一個字符A,然后設(shè)置不同的結(jié)束符,看到println()顯示的接收字符的數(shù)量及ASCII碼的不同。

無結(jié)束符.png
回車符.png
換行符.png
回車加換行符.png

其中,第一個數(shù)65,是‘A’的ASCII碼。在設(shè)置了結(jié)束符后,10是換行符(‘\n’)的ASCII碼,13是回車符('\r')的ASCII碼。

因為Serial.read()這個操作,每執(zhí)行一次,就從串行通信接收緩沖區(qū)中讀取一個字節(jié)的數(shù)據(jù),因為這個操作放在了loop()函數(shù)中,所以就會自動讀取下一個字符,直到所有數(shù)據(jù)讀取完畢,即Serial.available()==0

這就提示我們,如果是在循環(huán)結(jié)構(gòu)中讀取串口數(shù)據(jù),要特別注意輸入時有沒有自動添加結(jié)束符,最好在代碼中進行判斷,以此來達到不管用戶有沒有添加結(jié)束符,都能夠正確運行的目的。

利用上面這個代碼,我們還可以做另外一個實驗:有時候我們做串口輸入的時候,不寫if ( Serial.available() )直接用Serial.read()似乎也能得到正確結(jié)果,那么是否還要“多此一舉”呢?
我們可以把if ( Serial.available() )這個if結(jié)構(gòu)注釋掉,然后運行程序看看。這時你會發(fā)現(xiàn),沒有了這個判斷,不管串行通信緩沖區(qū)中有沒有收到數(shù)據(jù),程序都會去讀,在沒有數(shù)據(jù)的情況下,“讀到”的當(dāng)然是非法數(shù)據(jù)。所以,為了程序的可靠性,在做串口讀操作的時候,還是要加上if ( Serial.available() )這個結(jié)構(gòu)的。另外,Serial.available()能夠返回當(dāng)前從串口輸入數(shù)據(jù)的字節(jié)數(shù),這對于我們判斷輸入的情況及“讀取前幾個字節(jié)”這種需求是非常有用的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,844評論 2 372