作用
實現將一個 arduino 中的多個 String 類型變量准確地傳到另一個 arduino 中對應的多個 String 類型變量
中。
接線圖
注意 TX 接另一個arduino的 RX !可以忽略圖中的 LED )
代碼
1 號機器
float data1=18.98;//要發送的數據
float data2=56.73;//要發送的數據
float data3=104.27;//要發送的數據
float data2=56.73;//要發送的數據
float data3=104.27;//要發送的數據
float data4=0;//要接收的數據
float data5=0;//要接收的數據
float data6=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);//顯示接收到的數據
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="";//存放解析出的第三個字符串
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;//存放收到的字符串中標志字母的下標
{
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;}
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++)
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();
buf3+=char(comdata[k]);
}//根據約定字母所在的位置依次解析出各個數據
data4=buf1.toFloat();//將解析得到的字符串轉換為float類型
data5=buf2.toFloat();
data6=buf3.toFloat();
}
float data4=22.23;//要發送的數據
float data5=49.18;//要發送的數據
float data6=347.59;//要發送的數據
float data5=49.18;//要發送的數據
float data6=347.59;//要發送的數據
float data1=0;//要接收的數據
float data2=0;//要接收的數據
float data3=0;//要接收的數據
float data2=0;//要接收的數據
float data3=0;//要接收的數據
void setup()
{
Serial.begin(9600);//兩機的波特率要求相同
}
{
Serial.begin(9600);//兩機的波特率要求相同
}
void loop()
{
transmit();//發送數據
receive();//接收數據
Serial.println(data1);//顯示接收到的數據
Serial.println(data2);//顯示接收到的數據
Serial.println(data3);//顯示接收到的數據
}
{
transmit();//發送數據
receive();//接收數據
Serial.println(data1);//顯示接收到的數據
Serial.println(data2);//顯示接收到的數據
Serial.println(data3);//顯示接收到的數據
}
void receive(){
String comdata = "";//存放接收到的原始字符串
String buf1="";//存放解析出的第一個字符串
String buf2="";//存放解析出的第二個字符串
String buf3="";//存放解析出的第三個字符串
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;//存放收到的字符串中標志字母的下標
{
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;}
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();
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毫秒
}
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];
char ic[20];
void setup() {
Serial.begin(9600);
}
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);
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);
}
}