arduino双机通信 (解决引脚不够用)
Posted anandexuechengzhangzhilu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arduino双机通信 (解决引脚不够用)相关的知识,希望对你有一定的参考价值。
作用
实现将一个 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);
}
}
以上是关于arduino双机通信 (解决引脚不够用)的主要内容,如果未能解决你的问题,请参考以下文章
通过 CDC COM 端口与 Arduino 进行 Windows COM 通信