你好,我是愛吃魚香ROS的小魚。這一節(jié)我們正式在MicroROS開發(fā)板上編寫代碼,輸出HelloWorld到電腦上。在正式開始編寫代碼前,我們先了解下開發(fā)流程。
一、Arduino開發(fā)流程
Arduino和其他單片機(jī)開發(fā),一共分為四步。
- 編寫代碼,根據(jù)相關(guān)的API和SDK進(jìn)行代碼的編寫。
- 編譯工程,將工程的代碼文件編譯成二進(jìn)制文件。
- 燒錄二進(jìn)制文件,將上一步生成的二進(jìn)制文件通過(guò)工具燒錄到開發(fā)板中。
- 運(yùn)行測(cè)試,重啟開發(fā)板,觀察硬件執(zhí)行情況(數(shù)據(jù)打印一般通過(guò)串口查看)
接下來(lái)小魚就按照上面總結(jié)的幾個(gè)步驟來(lái)嘗試編寫HelloWorld!
二、編寫代碼
2.1 Arduino函數(shù)介紹
前面有介紹,Ardunio平臺(tái)的一大特點(diǎn)就是簡(jiǎn)單易用,而Ardunio使用的開發(fā)語(yǔ)言是C/C++,從工程生成的默認(rèn)代碼就可以看出來(lái)。
#include < Arduino.h >
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
整個(gè)代碼可以分為三個(gè)部分
- 頭文件
#include
setup()
函數(shù),該函數(shù)只會(huì)在啟動(dòng)時(shí)被系統(tǒng)調(diào)用一次loop()
函數(shù),該函數(shù)會(huì)被系統(tǒng)循環(huán)調(diào)用,直到重啟或者斷電
2.2 為什么沒有入口函數(shù)main函數(shù)?
在學(xué)習(xí)C語(yǔ)言和C++時(shí)你應(yīng)該學(xué)過(guò),程序的入口文件是main函數(shù),但在這個(gè)Arduino中卻沒有main函數(shù)的存在,這是為什么?
Arduino其實(shí)是有main函數(shù)的,Arduino的main函數(shù)長(zhǎng)這樣(ESP32-Arduino庫(kù)有所不同,但原理一樣:https://github.com/espressif/arduino-esp32/blob/master/cores/esp32/main.cpp)
#include < Arduino.h >
// Declared weak in Arduino.h to allow user redefinitions.
int atexit(void (* /*func*/ )()) { return 0; }
// Weak empty variant initialization function.
// May be redefined by variant files.
void initVariant() __attribute__((weak));
void initVariant() { }
void setupUSB() __attribute__((weak));
void setupUSB() { }
int main(void)
{
init();
initVariant();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
核心的代碼就這一段
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
從這里就可以看出來(lái),setup和loop函數(shù)之間的關(guān)系,在main函數(shù)中先調(diào)用一次setup函數(shù),再使用for死循環(huán)調(diào)用loop函數(shù)。
2.3 串口輸出HelloWorld
要實(shí)現(xiàn)將HelloWorld!
從開發(fā)板輸出到電腦上,我們需要了解一個(gè)常用的通信協(xié)議Serial
,常稱串口通信。
關(guān)于串口通信的原理可以到B站搜索相關(guān)視頻,但在這里使用時(shí)你只需要了解如何使用即可。
這里我們了解三個(gè)函數(shù),串口初始化、串口打印、串口讀取。
函數(shù)原型 | 參數(shù) | 返回值 | 描述 |
---|---|---|---|
void begin(unsigned long baud) | baud:串口波特率 | void | 該函數(shù)用于初始化串口,主要配置串口波特率,波特率類似于頻道號(hào),串口收發(fā)雙方保持相同的波特率才能進(jìn)行正常通信。常見的波特率有9600,115200等,波特率其實(shí)代表每秒數(shù)據(jù)收發(fā)的頻率,波特率越高,速度越快。 |
size_t printf(const char *format, ...) | format:格式化字符串 | size_t 打印的字符數(shù)量 | 該函數(shù)和我們常見的printf函數(shù)一致,eg:Serial.printf("Hello World!"); |
int read(void) | void | int 讀取的字符值,ASSIC表示 | 該函數(shù)用于讀取一個(gè)字節(jié)的數(shù)據(jù),返回值就是這個(gè)字節(jié)的值,如果沒有數(shù)據(jù)則返回-1 |
基于上面的函數(shù),我們可以這樣輸出HelloWorld!
#include < Arduino.h >
void setup() {
Serial.begin(115200);
}
void loop() {
Serial.printf("Hello World!\\n");
}
在setup()函數(shù)里進(jìn)行串口的初始化, 波特率設(shè)置成了115200 ,在loop函數(shù)中不斷的輸出Hello World!
。
三、編譯代碼
點(diǎn)擊對(duì)號(hào),或者使用快捷鍵Ctrl+Alt+B
,即可編譯。
看到Building .pio/build/featheresp32/firmware.bin
和Successfully created esp32 image.
就代表已經(jīng)成功生成了二進(jìn)制文件,下一步我們就開始燒錄二進(jìn)制文件。
四、燒錄二進(jìn)制文件
4.1 連接開發(fā)板到電腦
MicroROS學(xué)習(xí)板采用TypeC接口,你需要一個(gè)USB數(shù)據(jù)線將開發(fā)板連接到你的電腦。連接電腦后,Linux系統(tǒng)驅(qū)動(dòng)會(huì)被自動(dòng)搜索和加載,查看是否有正確驅(qū)動(dòng),可以使用lsusb進(jìn)行測(cè)試。
lsusb
輸入后,如果可以看到CP210x這個(gè)設(shè)備,就代表驅(qū)動(dòng)加載成功了
驅(qū)動(dòng)加載成功后在/dev目錄下會(huì)多出一個(gè)ttyUSBx的設(shè)備,比如小魚這里就是/dev/ttyUSB0
使用ls /dev/ttyUSB*
指令可以將其列出
4.2 設(shè)置設(shè)備權(quán)限
我們想讓開發(fā)板和電腦通過(guò)串口進(jìn)行通信,電腦端只需對(duì)這個(gè)串口進(jìn)行讀寫就行了。因?yàn)樵O(shè)備默認(rèn)的生成目錄是在/dev目錄下,普通用戶是沒有讀寫權(quán)限的,所以在使用之前我們可以修改下該設(shè)備的權(quán)限。
臨時(shí)修改
sudo chmod 666 /dev/ttyUSBx
也可以永久修改,將用戶添加到dialout和plugdev組(重啟后方生效)
sudo usermod -a -G dialout $USER
sudo usermod -a -G plugdev $USER
4.3 燒錄二進(jìn)制文件
點(diǎn)擊左下角的上傳燒錄按鈕,或者使用快捷鍵Ctrl+Alt+U
進(jìn)行燒錄。
看到上面四部分打印代表燒錄成功,可以看到PIO可以自動(dòng)檢測(cè)串口并進(jìn)行連接,接著上傳文件到開發(fā)板,最后自動(dòng)重啟。
五、運(yùn)行測(cè)試
因?yàn)樵谙螺d完成后,下載程序幫我們自動(dòng)重啟了,所以這里我們不需要進(jìn)行重啟。接著我們使用串口Monitor打開串口看看有沒有數(shù)據(jù)。
點(diǎn)擊Serial Monitor按鈕,或者使用快捷鍵Ctrl+Alt+S
,如果沒有出錯(cuò),你將看到下面的亂碼。
原因是終端的波特率不對(duì),開發(fā)板發(fā)送給電腦數(shù)據(jù)的波特率是115200,而電腦接收的波特率是9600,不匹配就會(huì)造成亂碼。
通過(guò)修改配置文件,可以修改Serial Monitor的默認(rèn)波特率。
在platformio.ini
中添加一行代碼
monitor_speed = 115200
接著關(guān)閉剛剛的終端,再重新打開,接著我們就可以看到嗖嗖嗖的Hello World!
六、總結(jié)
本節(jié)我們成功將自己的代碼上傳到開發(fā)板上了,然后通過(guò)串口成功的和單片機(jī)建立了單向連接(開發(fā)板向電腦發(fā)送數(shù)據(jù)),下一節(jié)我們學(xué)習(xí)下電腦向單片機(jī)發(fā)送消息。
最后還有幾個(gè)小作業(yè)
1.上面我們輸出Hello World!
在不斷的輸出,如果想要改成只輸出一次,代碼該怎么寫?
答案:
#include < Arduino.h >
void setup() {
Serial.begin(115200);
Serial.printf("Hello World!\\n");
}
void loop() {
}
2.上面我們輸出Hello World!
在快速的輸出,如果想要改成每秒輸出一次,代碼該怎么寫?
提示函數(shù):void delay(uint32_t ms)
延時(shí)指定ms。
答案:
#include < Arduino.h >
void setup() {
Serial.begin(115200);
}
void loop() {
delay(1000);
Serial.printf("Hello World!\\n");
}
-
單片機(jī)
+關(guān)注
關(guān)注
6071文章
45256瀏覽量
660079 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5999瀏覽量
110061 -
代碼
+關(guān)注
關(guān)注
30文章
4922瀏覽量
72235 -
Arduino
+關(guān)注
關(guān)注
190文章
6509瀏覽量
194749 -
ROS
+關(guān)注
關(guān)注
1文章
290瀏覽量
18250
發(fā)布評(píng)論請(qǐng)先 登錄
makefile交叉編譯helloword.bin然后在開發(fā)板上運(yùn)行怎么操作?
helloword測(cè)試程序下載到開發(fā)板里出現(xiàn)錯(cuò)誤如何去解決呢
helloword測(cè)試程序下載到開發(fā)板里面出現(xiàn)這種情況Segmentation fault是為什么?
LINUX在TE2410開發(fā)板上的移植
華清遠(yuǎn)見FPGA代碼-在Xilinx的FPGA開發(fā)板上運(yùn)行第一個(gè)
華清遠(yuǎn)見FPGA代碼-在Altera的FPGA開發(fā)板上運(yùn)行第一個(gè)
基于Xilinx FPGA的開發(fā)板及代碼
通過(guò)編寫verilog代碼實(shí)現(xiàn)OLED驅(qū)動(dòng)和內(nèi)容顯示的解決方案
移植FreeRTOS到STM32開發(fā)板上的工程文件和源代碼免費(fèi)下載

如何使用代碼控制開發(fā)板
在AI愛克斯開發(fā)板上用OpenVINO?加速YOLOv8目標(biāo)檢測(cè)模型

如何微控制器上新建MicroROS節(jié)點(diǎn)

在TI開發(fā)板上啟用Android Automotive

評(píng)論