本帖最后由 z01228 于 2020-10-29 22:27 编辑
作用实现将一个 arduino 中的多个 String 类型变量准确地传到另一个 arduino 中对应的多个 String 类型变量
中。如果一个arduino 开发板不能满足目前的项目,就需要通过串口发送命令进行分步执行(即上下位机) ps:程序是参考网络 我这里只是搬运工 程序里可以添加校验的程序提高命令的稳定性。 接线图(注意 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);
- }
复制代码
试验例子:- //串口编解码程序--串口解码协议--编码是发送对应的字符串就可以
- //例如串口输入a12b16c18# 串口将数据分别分给指定变量(浮点数)(data4--12,data5--16,data6--18)
- //目前没有添加校验程序‘#’只有限位作用。
- float data4=0;//要接收的数据
- float data5=0;//要接收的数据
- float data6=0;//要接收的数据
- boolean b=0;
- String comdata1 = "";//存放接收到的原始字符串
- void setup()
- {
- Serial.begin(9600);//两机的波特率要求相同
- }
- void loop()
- {
- receive();//接收数据
- Serial.println(" ");//
- Serial.print("串口输入的原始数据:");
- Serial.println(comdata1);//显示接收到的数据
- Serial.println("解析出来的数据");//显示接收到的数据
- Serial.print("data4-A:");
- Serial.println(data4);//显示接收到的数据
- Serial.print("data5-B:");
- Serial.println(data5);//显示接收到的数据
- Serial.print("data6-C:");
- Serial.println(data6);//显示接收到的数据
- Serial.println("++");//显示接收到的数据
- delay(2000);
- }
- void receive(){
- String comdata = "";//存放接收到的原始字符串
- String buf1="";//存放解析出的第一个字符串
- String buf2="";//存放解析出的第二个字符串
- String buf3="";//存放解析出的第三个字符串
- while (Serial.available() > 0)
- {
- if (b==0){comdata1 = "";b=1;}
- comdata += char(Serial.read());
- delay(2);//一个一个接收数据,每次停顿2毫秒
- comdata1 = comdata;//存放接收到的原始字符串
- }
- b=0;
- 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();
- }
- }
复制代码
添加字符串长度计算: 主机命令发送
- //字符串的拼接,以及长度获取。comdata=a+数据+b+数据+c+数据长度+#(结束符)
- //命令字符串示例:a**b**c**#
- //数据长度进行后期校验使用
- /*试验结果:
-
- 原始数据:a211b4c
- 原始数据长度(加了“#”长度,上面没有显示“#”):8
- 最后的数据、长度a211b4c9#
- 完整命令字符串长度:9
- */
- String comdata = ""; //新建中间变量
- String id1="a"; //拼接数据1
- int id2=211; //拼接数据1
- String id3="b"; //拼接2
- int id4=4; //拼接数据1
- String id5="c"; //拼接2
- //
- String id6="#"; //结束符3
- void setup() {
- Serial.begin(9600); //硬串口
- int strLength=0;
- comdata += id1;
- comdata += id2;
- comdata += id3;
- comdata += id4;
- comdata += id5;
- strLength=comdata.length();//原始命令字符串的长度获取
- strLength=strLength+1; //提前补充一个"#"的长度
-
- Serial.print("原始数据:"); //换行
- Serial.println(comdata); //打印原始数据
- Serial.print("原始数据长度(加了“#”长度,上面没有显示“#”):"); //换行
- Serial.println(strLength); //打印原始数据长度
- Serial.println(""); //换行
- //下面的这个if函数是保证命令字符串在10位是正常的 总的长度不能超过99
- if(strLength>=9){strLength=strLength+2;//如果原始数据没有加长度命令的时候是大于等于9,长度就只需要+2
- } else{
- strLength=strLength+1; //如果原始数据没有加长度命令的时候是小于9,长度就只需要+1
- }
- comdata += strLength;//**在命令字符串里加入计算完毕的长度
- comdata += id6;//**在命令字符串里加入"#"
- strLength=comdata.length();
-
- Serial.print("最后的数据、长度"); //换行
- Serial.println(comdata); //打印完整命令字符串
- Serial.print("完整命令字符串长度:"); //换行
- Serial.println(strLength); //打印完整命令字符串长度
- Serial.println(""); //换行
-
- }
- void loop() {
- // put your main code here, to run repeatedly:
- }
复制代码
|