arduino的双机通信+类型转换
1.作用
以主问从答的方式,实现将一个arduino中的多个String类型变量准确地传到另一个arduino中对应的多个String类型变量中。
2.接线图
(注意TX接另一个arduino的RX!可以忽略图中的LED)
3.代码
先说说单向的通信
主机代码(接收端的arduino):
int tr=0;//询问计数器
String tem="";//待接收的数据
String hum="";
String tu="";
void setup() {
Serial.begin(9600);//波特率要保持一致
}
void loop() {//主循环
getdata();//获取数据的函数
Serial.println( ' ');//打印出来验证是否正确
Serial.println(tem);
Serial.println(hum);
Serial.println(tu);
delay(100);//必须延时100毫秒及以上
}
void getdata(){
String te="";
if (tr <1000) {//循环1000次,保证收到数据
tr=tr+1;
Serial.print("a");//向从机发出指令a
te=commandstring();//接收从机返回的数据
if(te!=""){//当返回的数据不为空时
tem=te;//将数据放入指定变量中
}
}
tr=0;
te="";
//以下套路相同,可以根据个人喜好添加多个指令与数据
if (tr < 1000) {
tr=tr+1;
Serial.print("b");
te=commandstring();
if(te!=""){
hum=te;
}
}
tr=0;
te="";
if (tr < 1000) {
tr=tr+1;
Serial.print("c");
te=commandstring();
if(te!=""){
tu=te;
}
}
tr=0;
te="";
}
String commandstring(){//接收串口收到的字符串,并返回此字符串
String r;
String hu="";
for(int i=0;r==""&&i<1000;i++){
for(int j=0;Serial.available()&&j<1000;j++) {
hu+=char(Serial.read());
delay(5);
}
if(hu.indexOf("")!=-1) { r=hu.substring(0); }
}
return r;
}
从机代码(发送端的arduino):
String tem="666";//要发送的数据
String hum="777";
String tu="888";
long last = 0;//计时器1
void setup() {
Serial.begin(9600);//波特率要保持一致
}
void loop (){//主循环
answer();//发送数据的函数
}
String commandstring(){//接收串口收到的字符串,并返回此字符串
String r;
String hu="";
for(int i=0;r==""&&i<1000;i++){
for(int j=0;Serial.available()&&j<1000;j++) {
hu+=char(Serial.read());
delay(5);
}
if(hu.indexOf("")!=-1) { r=hu.substring(0); }
}
return r;
}
void answer(){
long nownow=millis();//计时器2
last = millis();
while (nownow - last <1000) {//每次循环1秒钟
nownow=millis();
String op= commandstring();//接收主机的指令
if(op=="a"){//如果指令时a
Serial.print(tem);//就发送tem变量的值
}
if(op=="b"){//如果指令时b
Serial.print(hum);//就发送hum变量的值
}
if(op=="c"){//如果指令时c
Serial.print(tu);//就发送tu变量的值
}
if(op=="d"){//可继续添加其他指令
Serial.print("null");
}
}
}
再讲讲双向的通信(既发送数据,又接收数据),原理和单向通信完全一样,就不再注释了。
1号机:
int tr=0;//询问计数器
String tem="";//待接收的数据
String hum="";
String tu="";
String q="111.11";//要发送的数据
String w="222.22";
String e="333.33";
long last = 0;//计算时间的变量
void setup() {
Serial.begin(9600);
}
void loop() {
answer();
getdata();
Serial.println( ' ');
Serial.println(tem);
Serial.println(hum);
Serial.println(tu);
delay(100);
}
void getdata(){
String te="";
if (tr <1000) {
tr=tr+1;
Serial.print("a");
te=commandstring();
if(te!=""){
tem=te;
}
}
tr=0;
te="";
if (tr < 1000) {
tr=tr+1;
Serial.print("b");
te=commandstring();
if(te!=""){
hum=te;
}
}
tr=0;
te="";
if (tr < 1000) {
tr=tr+1;
Serial.print("c");
te=commandstring();
if(te!=""){
tu=te;
}
}
tr=0;
te="";
}
String commandstring(){
String r;
String hu="";
for(int i=0;r==""&&i<1000;i++){
for(int j=0;Serial.available()&&j<1000;j++) {
hu+=char(Serial.read());
delay(5);
}
if(hu.indexOf("")!=-1) { r=hu.substring(0); }
}
return r;
}
void answer(){
long nownow=millis();
last = millis();
while (nownow - last <1000) {
nownow=millis();
String op= commandstring();
if(op=="z"){
Serial.print(q);
}
if(op=="y"){
Serial.print(w);
}
if(op=="x"){
Serial.print(e);
}
if(op=="w"){
Serial.print("null");
}
}
}
2号机:
String tem="666.66";//要发送的数据
String hum="777.77";
String tu="888.88";
int tr=0;//询问计数器
String q="";//待接收的数据
String w="";
String e="";
long last = 0;//时间变量
void setup() {
Serial.begin(9600);
}
void loop (){
answer();
getdata();
Serial.println( ' ');
Serial.println(q);
Serial.println(w);
Serial.println(e);
delay(100);
}
String commandstring(){
String r;
String hu="";
for(int i=0;r==""&&i<1000;i++){
for(int j=0;Serial.available()&&j<1000;j++) {
hu+=char(Serial.read());
delay(5);
}
if(hu.indexOf("")!=-1) { r=hu.substring(0); }
}
return r;
}
void answer(){
long nownow=millis();
last = millis();
while (nownow - last <1000) {
nownow=millis();
String op= commandstring();
if(op=="a"){
Serial.print(tem);
}
if(op=="b"){
Serial.print(hum);
}
if(op=="c"){
Serial.print(tu);
}
}
}
void getdata(){
String te="";
if (tr <1000) {
tr=tr+1;
Serial.print("z");
te=commandstring();
if(te!=""){
q=te;
}
}
tr=0;
te="";
if (tr < 1000) {
tr=tr+1;
Serial.print("y");
te=commandstring();
if(te!=""){
w=te;
}
}
tr=0;
te="";
if (tr < 1000) {
tr=tr+1;
Serial.print("x");
te=commandstring();
if(te!=""){
e=te;
}
}
tr=0;
te="";
}
4.类型转换
由于以上双机通信传的是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);
}