关于Arduino与Nodecu软串口通信的问题-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 466|回复: 7

[未解决] 关于Arduino与Nodecu软串口通信的问题

[复制链接]
发表于 2022-1-10 10:54 | 显示全部楼层 |阅读模式
所用的板子是Arduino UNO R3,Nodemcu。我想用Nodemcu从服务器用GET方法获取数据 然后Nodemcu通过软串口把接收到的数据发给UNO。
UNO接收到信息后进行Json解析 然后来控制被控元件。
Nodemcu GET到的数据是正常的,但是经过软串口传输后,数据里出现了乱码。
求问各位大佬解决方法!感激不尽
发表于 2022-1-11 09:18 | 显示全部楼层
1. 在while循环后加一行:
while (mySerial.available()) //当发现缓存中有数据时,将数据送至字符数组data中
{
。。。
}
control[i] = 0;

2. 把Serial.println(control); 移到if 块的第一行. deserializeJson(Control_SerialCheck_Json,control); 当control不是const char*时, control值被改变。
  if(strlen(control))
    {
       Serial.println(control);
      deserializeJson(Control_SerialCheck_Json,control);
      Cn = Control_SerialCheck_Json["data"]["Curtain"];
      // Serial.println(control);
    }
 楼主| 发表于 2022-1-10 10:55 | 显示全部楼层
Nodemcu端发送数据的代码如下:
void loop()
{
char Send_data[150] = ""; //定义字符数组,接受来自上位机的数据
  int i = 0;

   
//    num++;
//    mySerial.print(num);
//    Serial.println(num);
     getrequest();//请求数据  

      String control = getrequest() ;
      Serial.print("control:");
      Serial.println(control);
      
        if(control.length()>0)
        {
          mySerial.print(control);
        }
         delay(1000);
  
}
 楼主| 发表于 2022-1-10 10:56 | 显示全部楼层
Arduino端软串口接收的代码如下:

void loop()
{

  char control[150] = ""; //定义字符数组,接受来自上位机的数据
  int i = 0;

  delay(500);
  while (mySerial.available()) //当发现缓存中有数据时,将数据送至字符数组data中
  {
    control[i] = mySerial.read();
    i++;
    delay(15);
  }  
  while(Serial.read() >= 0){}

  if(strlen(control))
    {
      deserializeJson(Control_SerialCheck_Json,control);
     Cn = Control_SerialCheck_Json["data"]["Curtain"];
       Serial.println(control);
    }

//   if(Cn == 1)
//   {
//    Serial.println("open");
//   }
//   else
//   {
//    Serial.println("close");
//    }
   delay(1000);

}
 楼主| 发表于 2022-1-10 10:57 | 显示全部楼层
Nodemcu串口监视器打印如下:

10:45:41.290 -> HTTP Response code: 200
10:45:41.290 -> HTTP_control_string: {"Curtain":true,"open_LED1":true,"goHome":false}
10:45:41.395 -> HTTP Response code: 200
10:45:41.395 -> HTTP_control_string: {"goHome":false,"open_LED1":true,"Curtain":true}
10:45:41.498 -> control:{"Code":200,"data":{"goHome":false,"open_LED1":true,"Curtain":true}}

是正常没问题的
 楼主| 发表于 2022-1-10 10:58 | 显示全部楼层
Arduino 端传感器内容如下:

1046:28702 -> @"Code":20,"data":{"goHome&:false4open_LED1":true":t
10:46:31.448 -> z"Code":200,"data":{"goHome":fahse,"open_|ED1":true,"Curtain":t`"Code":200,"data"eHt
10:46:34.156 -> p "代码":200,"数据":{"ooHome":false,"?pen_LED1":true,"窗帘":t
10:46:39.601 -> x"代码":200,"⸮ata":{" ooH?me":false,"open_LED1":true,"Curtain":tp"Code":200,"deLr
10:46:42.244 -> @"Codg":200,"data":{"go?o⸮ e":false,"open_LED1":true,"Curtain?:tx"Code":20HeC
10:46:44.924 ->z"Code":200,"da<a":{"goHome":false,"open_LED1":true,?⸮urtain":tx"Code":200xeC
10:46:47.620 -> x"CoDe":200 ,"data":{"goHome":false,"open_LED1":true,"Curtain":t@"Code":200,d: Di

是有乱码的
 楼主| 发表于 2022-1-10 11:01 | 显示全部楼层
即Arduino端应该接收的内容是:
{"Code":200,"data":{"goHome":false,"open_LED1":true,"Curtain":true}}

但实际接收的是:
z"Code":200,"da<a":{"goHome":false,"open_LED1":true,?⸮urtain":tx"Code":200xeC

想问问各位大佬是出来什么问题。
杜邦线已经换过 波特率也降低到过1200 问题也仍未解决
 楼主| 发表于 2022-1-11 15:49 | 显示全部楼层
ifeue 发表于 2022-1-11 09:18
1. 在while循环后加一行:
while (mySerial.available()) //当发现缓存中有数据时,将数据送至字符数组data ...

您好,感谢您的回答。我已找到问题所在,我把Nodemcu的波特率和UNO的波特率共同设为115200后并且把UNO的缓冲区大小修改后 就有所改善很多。
个人猜测是UNO软串口接收缓冲区溢出并且因为是Nodemcu在软串口主动发送数据,所以设置波特率跟着Nodemcu的默认波特率设置比较好。
现在情况是也偶有乱码,基本是1/20的概率,尚能接受。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 17:57 , Processed in 0.184243 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表