題:
Arduino:如何在代碼中獲取板子類型
Elmue
2016-02-27 04:53:40 UTC
view on stackexchange narkive permalink

我想寫一個可以在不同的Arduino板上編譯的草圖。我想在PC上顯示當前連接的板。

這意味著用戶通過USB電纜將PC連接到Arduino / Teensy開發板,其中運行我的草圖,我的草圖通過串行告訴PC連接了哪個板。在PC上運行我的C#應用程序,該應用程序接收此數據並顯示它。

因此,我需要在編譯草圖時已選擇的電路板:

Arduino Board selector

我在 https://github.com/backupbrain/ArduinoBoardManager上找到了代碼,但是沒有給出正確的結果(除了幾個板的事實)

下面是代碼段:

  static const uint8_t BOARD_MICRO = 0x04; ... Micro,Leonardo,Esplora靜態常量uint8_t BOARD = 0x04;靜態常量uint8_t NUM_BITS = 8;靜態常量uint16_t CPU = __AVR_Atmega32U4__;靜態const unsigned long SRAM_SIZE = 2500;靜態const unsigned long EEPROM_SIZE = 1000; static const unsigned long FLASH_SIZE = 32000; #elif定義(.....  

因此,對於Yun 16MHz,Micro,Leonardo y,此代碼給出相同的結果(BOARD = 0x04 = Micro) Esplora。

有什麼方法可以準確地將用戶在Arduino編譯器菜單中選擇的字符串輸入我的C代碼中?

如果您使用的是arduino IDE來構建固件,除了F_CPU ARDUINO和__AVR_whatever__之外,沒有任何條款可以將項目級別的#define傳遞給編譯器。您可能需要使用makefile而不是arduinio IDE進行構建。檢查arduino.SE網站,Nick和Ignatio都有一些很好的例子。
我在Arduino.SE上找不到任何有趣的東西。 (那是瑞典語嗎?)
@Elmue arduino.StackExchange.com是Arduino SE。
啊好。但是arduino.se存在!
所謂“我想在PC上顯示當前連接的板”,是指在運行已編譯並上傳的草圖時顯示它,還是在編譯草圖時顯示該圖,或者IDE僅在特定位置坐在那裡時顯示它。附板嗎? (在後兩種情況下,電路板選擇顯示在1.6.3 IDE的最低行中,但是如果您使用的是較舊或不同的IDE,則可能沒有。)(如果適用第一種情況,您是否希望它出現在串行監視器中? ?)
我更新了我的問題以使其更清楚。我想要的是沒有IDE和串行監視器。只是我的草圖通過Serial告訴PC:“我是誰”。
五 答案:
Elmue
2016-03-01 11:24:53 UTC
view on stackexchange narkive permalink

多虧了Charlie Hanson和jantje的幫助,我找到了通用解決方案!

由於每個Arduino程序員都必須經歷同樣的痛苦才能弄清楚如何獲得板名,這是一個遺憾。 ,我將向公眾公開我的代碼,以便所有人都可以復制並粘貼。

在這裡是:

  #if defined(TEENSYDUINO)//- ------------ Teensy -----------------#如果已定義(__AVR_ATmega32U4__)#定義了板“ Teensy 2.0” #elif已定義(__AVR_AT90USB1286__)#定義板“ Teensy ++ 2.0” #elif定義(__MK20DX128__)#define板“ Teensy 3.0” #elif定義(__MK20DX256__)#define板“ Teensy 3.2” //和Teensy 3.1(作廢)#elif定義(__MKL26Z64__)#deif板“ Teensy LC“ #elif定義(__MK64FX512__)#define板” Teensy 3.5“ #elif定義(__MK66FX1M0__)#deif BOARD” Teensy 3.6“ #else #error”未知板“#endif#else // ------- -------- Ardui否------------------ #if defined(ARDUINO_AVR_ADK)#define BOARD“ Mega Adk” #elif defined(ARDUINO_AVR_BT)//藍牙#define BOARD“ Bt” #elif已定義(ARDUINO_AVR_DUEMILANOVE)#define BOARD“ Duemilanove” #elif定義(ARDUINO_AVR_ESPLORA)#define BOARD“ Esplora” #elif已定義(ARDUINO_AVR_ETHERNET)#define BOARD“以太網” #elif已定義(ARDUINO_AVR_FIF“ #deif BOARD )#define BOARD“ Gemma” #elif定義(ARDUINO_AVR_LEONARDO)#define BOARD“ Leonardo” #elif定義(ARDUINO_AVR_LILYPAD)#define BOARD“ Lilypad” #elif定義(ARDUINO_AVR_LILYPAD_USB)#define BOARD“ NOif_Ab(VRUI) #define棋盤“ Mega” #elif定義(ARDUINO_AVR_MEGA2560)#define棋盤“ Mega 2560” #elif定義(ARDUINO_AVR_MICRO)#define棋盤“ Micro”
#elif定義(ARDUINO_AVR_MINI)#define定義板“ Mini” #elif定義(ARDUINO_AVR_NANO)#define定義板“ Nano” #elif定義(ARDUINO_AVR_NG)#define定義板“ NG” #elif定義(ARDUINO_AVR_PRO)#define定義板“ Pro”定義(ARDUINO_AVR_ROBOT_CONTROL)#定義板“機器人Ctrl” #elif定義(ARDUINO_AVR_ROBOT_MOTOR)#定義板“機器人馬達” #elif定義(ARDUINO_AVR_UNO)#定義板“ Uno” #elif定義(ARDUINO_AVR_YUN“ #define這些板必須單獨安裝:#elif定義(ARDUINO_SAM_DUE)#define板“到期” #elif定義(ARDUINO_SAMD_ZERO)#define板“零” #elif定義(ARDUINO_ARC32_TOOLS)#define板“ 101” #else #error“未知板“#endif#endif  

您甚至可以將此代碼放入新的頭文件中,並將其#include到您的項目中。

PD如果您還想了解主板的CPU型號,請搜索文件avr_cpunames.h

另一件事。而不是使用“ return”?“;”當您不知道使用#pragma警告板名稱時
1.)我已替換為“?”帶有#錯誤。 2.)我認為字符串確實不是問題。您確實知道最後只會編譯一個字符串嗎?請參閱我的更新,上面對此進行了解釋。最長的字符串是11個字節。如果您需要優化代碼以至於只關心11個字節,那麼我建議定義一個枚舉並返回它而不是字符串。然後您的函數將返回一個字節而不是11。
3.)與可維護性有關的問題:可悲的是我不得不編寫這樣的函數。這應該已經是與編譯器一起安裝的頭文件的一部分,並且應該由開發人員維護並隨每個新版本進行更新。
2)在尺寸上寫備註時我弄錯了。我在5個小時前發表了評論。抱歉3)可維護性是一個問題。我過去寫過非常相似的代碼。我相信還有很多其他人。這就是為什麼我更喜歡“更好的IDE解決方案”的可維護性。我很確定所有“更好的IDE”都將具有與我在回答中提到的解決方案相似的解決方案。補充一下:您已經不再是Arduino IDE。
如果您輸入了錯誤的評論,最好將其刪除。
我喜歡這個解決方案,這裡是ESP8266的建議添加。 #elif定義(ESP8266)#定義板“ ESP8266”
jantje
2016-02-27 18:42:47 UTC
view on stackexchange narkive permalink

請注意,這是Windows Mod,Linux上必須存在類似的東西。

第一個快速簡便。只需按照以下說明修改正在使用的platform.txt文件即可。缺點是您需要在每個發行版中更改platform.txt文件。

在配方中添加-DBOARD = \“ $ {build.board} \”。這將允許

  const char boardName [] = BOARD;  

在boardName中為您提供字符串“ ARDUINO_AVR_LEONARDO”(對於萊昂納多)。

第二種方法是切換到更好的IDE(就像其他人已經提出的那樣)。作為arduino eclipse插件的創建者,我建議使用arduino eclipse插件。在arduino eclipse插件中,您可以執行以下操作:右鍵單擊project-> properties-> arduino-> tab的“ compile options”,將

  -DBOARD = \“ $ {A.BUILD .BOARD} \“  

附加到C和C ++字段。

這將使上面的代碼編譯

附錄

我不知道您想要“好名字”。我不確定可以在arduino IDE中的platform.txt中修復此問題。在arduino eclipse插件中,將上面的修復程序更改為

  -DBOARD = \“ $ {A.NAME} \”  

以獲取漂亮的名稱(定義板上的leonardo“ Arduino Leonardo”)。

請拒絕者或其他任何人請客,以說明為什麼答案需要拒絕嗎?
1.)是的,StackExchange應該強迫每個投票否決的人寫一個解釋。 (這不是我的不贊成意見)2.)無需使用Eclipse即可解決此問題。 3.)在這裡查看我的答案。
Elmue,1)感謝您同意:-)。 2)我同意。答案的第一部分是如何修改平台txt以使其在Arduino IDE中正常工作。您的答案將更詳細地說明如何解決此問題,無需Eclipse或任何更好的IDE。提到了更好的ide解決方案,因為Arduino ide需要解析boards.txt,因此它可能在某處具有此信息,並且無需修改platform.txt就可以工作。當我非常了解arduino eclipse插件時,我舉了一個如何使用此工具的示例。 3)查看我的編輯
Eclipse也可以與Teensy一起使用嗎? Eclipse還有什麼其他優點?
是的,arduino eclipse插件支持teensy,但是您必須修改platform.txt(應該在teensyduino 1.28中修復)
優點:太多了,很難說。我個人喜歡單擊查看代碼(當您按ctrl單擊某個方法時,您跳到該功能/變量的實現/聲明;即使它是arduino核心代碼)。調用樹(在哪裡使用?)是一個非常強大的視圖。自動完成,範圍,將多個項目(=草圖)集中在一個位置,集成的版本控制...
P.W.
2016-02-27 05:40:43 UTC
view on stackexchange narkive permalink

菜單中的確切名稱來自Arduino IDE中的board.txt文件(Arduino \ hardware \ arduino \ avr \ boards.txt)。我認為您必須自己解析文件,然後在此處找到檢測到的電路板。

解析文件我怎麼知道在菜單中選擇了哪一個呢?
CharlieHanson
2016-03-01 02:25:41 UTC
view on stackexchange narkive permalink

我不久前問了一個相關問題

存在一個內部* .h文件,該文件由IDE創建,並在其中保存具有被選中。鏈接的問題中給出了可能的選項列表,但僅適用於AVR板。我認為非AVR列表會短得多。

只需添加一些條件語句即可向PC發送正確的信息。一個簡單的示例:

  // ...在您的代碼中,可能在setup()期間...#ifdef ARDUINO_AVR_UNO serial.println(“ UNO”);#endif#ifdef ARDUINO_AVR_LEONARDO serial。 println(“ LEONARDO”);#endif //等...  

如果您需要在草圖中多次引用電路板類型,請使用以下格式:

  // ......在setup()之前,或在全局命名空間中...#ifdef ARDUINO_AVR_UNO #define __BOARD_TYPE“ UNO”#endif#ifdef ARDUINO_AVR_LEONARDO #define __BOARD_TYPE“ LEONARDO”#endif //等... //在您的代碼中,只要有必要:serial.println(__ BOARD_TYPE);  

後者即使您只需要 __ BOARD_TYPE 一次,因為它從您的功能中刪除了麻煩的 #ifdef 塊。

您當然必須為您希望最終用戶可以擁有的每塊板編寫一個,並且您可能需要在出現新模型時更新此列表。

感謝您的回答。這對我很有幫助。 (請在此處查看我的答案)但是您的代碼中有錯誤。必須是ARDUINO_AVR_UNO,而不是AVR_UNO。
您可能希望在#define的末尾刪除分號;它們不是C語句,不需要分隔符;實際上,分隔符將插入到使用宏的位置,並鏈接到println()函數的括號內。 (如果刪除分號,則此註釋對以後的讀者將無意義)。
Jason Crocker
2018-10-16 22:00:17 UTC
view on stackexchange narkive permalink

由於添加了新板,原始答案已過時。基本測試是正確的,但不清楚板列表來自何處。

如果找到 boards.txt 文件並進行瀏覽(例如,在Mac上是〜\ Library \ Arduino \ hardware \ arduino \ avr \ boards.txt ),則每個開發板都有一個沿 <BOARD>.build.board = <NAME> 的行的條目例如,MKR1000會有一行:

mkr1000.build.board = SAMD_MKR1000

相應的#define可以通過在 <NAME> ARDUINO _ ,因此在此示例中,以下代碼對於MKR1000板將出錯...

#如果已定義(ARDUINO_SAMD_MKR1000)#error

這個答案就是bla bla。您為什麼不簡單地發布所有帶有所有定義的新板的完整列表?


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...