2016年5月22日 星期日

Arduino Uart 互傳字串 與 字串處理 依特定符號切割

Arduino Uart 互傳字串 與 字串處理 依特定符號切割

兩台arduino要互傳

兩台arduino要互傳字串的話這裡寫一個範例
注意
  • 兩台不要形成死循環,[A給B] [B再給A] [然後A再給B]…..
  • 會新建一個uart通道,而不是使用預設的
通道請參考程式碼頂端的宣告
已經盡量用不會混淆的方式註解
要表達兩台人稱問題其實有些困難XD
缺少的函式庫在這裡可以下載
https://mega.nz/#F!dhlUBaYD!J74z_wKIqvY2lRbjP7l9pA
到這邊兩台都直接用同一個代碼燒錄上去即可,然後把兩台 Arduino 的 RXTX 也就是
A 的 2 接到 B 的 3
A 的 3 接到 B 的 2
然後打開兩個 Arduino IED ,選好 USBport 個別打開 右上角放大鏡(serial port terminal)
再來A發送訊息B的視窗就可以收到了


字串切割

字串切割的話這裡也有一個範例,可以自訂格式
比如說你想要船 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是沒有結束點的,無限循環,
依照你的程式設計去選擇,這裡也不好舉例子說明
通常不放也不會造成問題,新手可以先暫時放置著
完成功能後再去想辦法解決這個問題。

5 則留言:

  1. 你好,我使用“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. 1. 如果是當指令用通常會知道那些字串那些數字格式是固定的,都先收字串再根據不同的位置轉成你要的型態;或者C++有函式可以判定是不是數字,不過儘量還是不要寫這麼複雜好簡單就好。

      2. 應該只是我有地方沒寫好;明天有空我再看一下,我應該會直接打掉重寫,回頭有更好的寫法XD

      刪除
    2. 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");
      }

      刪除
    3. 收穫良多,我先找看看有沒有其他板子來做交叉測試,感謝🙏

      刪除
    4. 後來給的那段代碼正常嗎~? 有問題可以再提出沒關係 互相成長

      刪除