Arduino Uart 互傳字串 與 字串處理 依特定符號切割
兩台arduino要互傳
兩台arduino要互傳字串的話這裡寫一個範例
注意
- 兩台不要形成死循環,[A給B] [B再給A] [然後A再給B]…..
- 會新建一個uart通道,而不是使用預設的
通道請參考程式碼頂端的宣告
已經盡量用不會混淆的方式註解
要表達兩台人稱問題其實有些困難XD
要表達兩台人稱問題其實有些困難XD
缺少的函式庫在這裡可以下載
https://mega.nz/#F!dhlUBaYD!J74z_wKIqvY2lRbjP7l9pA
https://mega.nz/#F!dhlUBaYD!J74z_wKIqvY2lRbjP7l9pA
到這邊兩台都直接用同一個代碼燒錄上去即可,然後把兩台 Arduino 的 RXTX 也就是
A 的 2 接到 B 的 3
A 的 3 接到 B 的 2
A 的 2 接到 B 的 3
A 的 3 接到 B 的 2
然後打開兩個 Arduino IED ,選好 USBport 個別打開 右上角放大鏡(serial port terminal)
再來A發送訊息B的視窗就可以收到了
再來A發送訊息B的視窗就可以收到了
字串切割
字串切割的話這裡也有一個範例,可以自訂格式
比如說你想要船 0,1,2,3 你想把他們依照逗號存到陣列內
也可以依照其他符號,由你自己設定
比如說你想要船 0,1,2,3 你想把他們依照逗號存到陣列內
也可以依照其他符號,由你自己設定
裡面忘記放使用範例了
大致來說是這樣的
(第一個放字串,第二個放符號)
大致來說是這樣的
(第一個放字串,第二個放符號)
str_split(const char* str, const char* sp)
char str="1,2,3";
int *ptr=0; //注意星號
ptr=str_split(str,","); //逗號可以任意修改成你要的形式
println(ptr[0]); //返回為一個陣列的指標,可以直接使用下標[]呼叫
釋放記憶體
因為是動態陣列,結束時要釋放記憶體
(動態陣列意思就是回便你字串都常都可以適應)
(動態陣列意思就是回便你字串都常都可以適應)
free(ptr);
不過arduino是沒有結束點的,無限循環,
依照你的程式設計去選擇,這裡也不好舉例子說明
通常不放也不會造成問題,新手可以先暫時放置著
完成功能後再去想辦法解決這個問題。
依照你的程式設計去選擇,這裡也不好舉例子說明
通常不放也不會造成問題,新手可以先暫時放置著
完成功能後再去想辦法解決這個問題。
你好,我使用“Arduino輸入字串切割成陣列”的範例時發生的狀況 如下:
回覆刪除1.文字、數字混用時,有沒有多種型態解法?
Arduino Input :a,100,50
[3],[0,100,500]
2.輸入比較長的數字時,這是roll-over嗎?但單數字並未超出int範圍。
Arduino Input :9999,5000,12345,4000
[4],[9999,5000,12345,-25531]
以上可以用什麼方式解呢?謝謝
1. 如果是當指令用通常會知道那些字串那些數字格式是固定的,都先收字串再根據不同的位置轉成你要的型態;或者C++有函式可以判定是不是數字,不過儘量還是不要寫這麼複雜好簡單就好。
刪除2. 應該只是我有地方沒寫好;明天有空我再看一下,我應該會直接打掉重寫,回頭有更好的寫法XD
mega2560 測試輸入
刪除9999,5000,12345,4000是正常的
縮短一點的寫法
void str_split2(String str, const char* delim){
int arr[100];
char temp[100];
strcpy(temp, str.c_str());
size_t idx=0;
for(char* pch=strtok(temp,delim); pch; pch=strtok(NULL, delim))
arr[idx++] = atoi(pch);
for(unsigned i = 0; i < idx; ++i) {
Serial.print(arr[i]);
Serial.print(", ");
}Serial.print("\n");
}
收穫良多,我先找看看有沒有其他板子來做交叉測試,感謝🙏
刪除後來給的那段代碼正常嗎~? 有問題可以再提出沒關係 互相成長
刪除