arduino雙機通信 (解決引腳不夠用)


作用

實現將一個 arduino 中的多個 String 類型變量准確地傳到另一個 arduino 中對應的多個 String 類型變量
中。

接線圖

注意 TX 接另一個arduino的 RX !可以忽略圖中的 LED )

代碼

1 號機器

 float data1=18.98;//要發送的數據
 float data2=56.73;//要發送的數據
 float data3=104.27;//要發送的數據
 float data4=0;//要接收的數據
 float data5=0;//要接收的數據
 float data6=0;//要接收的數據
void setup()
{
  Serial.begin(9600);//兩機的波特率要求相同
}

void loop()
{
 transmit();//發送數據
 receive();//接收數據
     Serial.println(data4);//顯示接收到的數據
      Serial.println(data5);//顯示接收到的數據
      Serial.println(data6);//顯示接收到的數據
}
void transmit(){

        Serial.print('a');
        Serial.print(data1);
        Serial.print('b');
        Serial.print(data2);
        Serial.print('c');
        Serial.print(data3);
        Serial.println('#');
        delay(100);
        //發送"a數據1b數據2c數據3#"的字符串必須停頓100毫秒
  }
void receive(){
  String comdata = "";//存放接收到的原始字符串
  String buf1="";//存放解析出的第一個字符串
  String buf2="";//存放解析出的第二個字符串
  String buf3="";//存放解析出的第三個字符串
    while (Serial.available() > 0) 
    {
        comdata += char(Serial.read());
        delay(2);//一個一個接收數據,每次停頓2毫秒
    }
    if (comdata.length() > 0)//如果有數據收到
    {
      int ja,jb,jc,jd;//存放收到的字符串中標志字母的下標
for(int i = 0; i < comdata.length(); i++){
  if(comdata[i]=='a'){ja=i;}
  if(comdata[i]=='b'){jb=i;}
  if(comdata[i]=='c'){jc=i;}
  if(comdata[i]=='#'){jd=i;}
  }//找到約定標志字母的下標
 for(int k=ja+1;k<jb;k++){
  buf1+=char(comdata[k]);
  }
  for(int k=jb+1;k<jc;k++){
  buf2+=char(comdata[k]);
  }
  for(int k=jc+1;k<jd;k++)
{
  buf3+=char(comdata[k]);
  }//根據約定字母所在的位置依次解析出各個數據
         data4=buf1.toFloat();//將解析得到的字符串轉換為float類型
         data5=buf2.toFloat();
         data6=buf3.toFloat();

    }
2 號機器
float data4=22.23;//要發送的數據
 float data5=49.18;//要發送的數據
 float data6=347.59;//要發送的數據
float data1=0;//要接收的數據
float data2=0;//要接收的數據
float data3=0;//要接收的數據
void setup()
{
    Serial.begin(9600);//兩機的波特率要求相同
}
void loop()
{
   transmit();//發送數據
   receive();//接收數據
      Serial.println(data1);//顯示接收到的數據
      Serial.println(data2);//顯示接收到的數據
      Serial.println(data3);//顯示接收到的數據
}
 
void receive(){
  String comdata = "";//存放接收到的原始字符串
  String buf1="";//存放解析出的第一個字符串
  String buf2="";//存放解析出的第二個字符串
  String buf3="";//存放解析出的第三個字符串
    while (Serial.available() > 0) 
    {
        comdata += char(Serial.read());
        delay(2);//一個一個接收數據,每次停頓2毫秒
    }
    if (comdata.length() > 0)//如果有數據收到
    {
      int ja,jb,jc,jd;//存放收到的字符串中標志字母的下標
for(int i = 0; i < comdata.length(); i++){
  if(comdata[i]=='a'){ja=i;}
  if(comdata[i]=='b'){jb=i;}
  if(comdata[i]=='c'){jc=i;}
  if(comdata[i]=='#'){jd=i;}
  }//找到約定標志字母的下標
 for(int k=ja+1;k<jb;k++){
  buf1+=char(comdata[k]);
  }
  for(int k=jb+1;k<jc;k++){
  buf2+=char(comdata[k]);
  }
  for(int k=jc+1;k<jd;k++){
  buf3+=char(comdata[k]);
  }//根據約定字母所在的位置依次解析出各個數據
         data1=buf1.toFloat();//將解析得到的字符串轉換為float類型
         data2=buf2.toFloat();
         data3=buf3.toFloat();

    }
  }
void transmit(){
        Serial.print('a');
        Serial.print(data4);
        Serial.print('b');
        Serial.print(data5);
        Serial.print('c');
        Serial.print(data6);
        Serial.println('#');
        delay(100);
//發送"a數據1b數據2c數據3#"的字符串必須停頓100毫秒
  }

類型轉換

由於以上雙機通信傳的是String類型,真正使用時肯定需要類型轉換,所以特地收集了以下的轉碼大合集,總有幾款適合你。

char fc[50];
char ic[20];
void setup() {
  Serial.begin(9600);
}
void loop() {
String s="123.43212";//從一個String開始
float f=s.toFloat();//String轉float
int i=s.toInt();//String轉int
dtostrf(f,1,5,fc);//將float轉為char的數組,其中第三個傳入值(5)是保留的位數(5位)
snprintf (ic, 75, "%d", i);//將int轉為char的數組.
//以下為串口打印驗證
Serial.println(f,5);//打印保留float變量后五位的數
delay(1000);
Serial.println(i);//打印int變量
delay(1000);
Serial.println(fc);//打印float轉成的char的數組
delay(1000);
Serial.println(ic);//打印int轉成的char的數組
delay(1000);

}
  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM