查看: 959|回复: 14

[未解决] 如何通过esp8266向arduino发送数据(字符串)

[复制链接]
  • TA的每日心情
    奋斗
    2020-12-15 09:03
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    发表于 2020-11-29 23:13 | 显示全部楼层 |阅读模式
    主要有两个问题,请求大佬解答:一:我给esp8266编程使其连接到了onenet并读取数据(汉字),数据我本准备存在streaml中,结果如图所示打印出来是0,请问是什么原因?我的streaml确实是String类型的,这是我从网上找的代码修改过的,原来的代码是需要从onenet读取数字,所以我直接把int改成了String,难道改的不够吗?
    二:之后我需要把数据传给arduino,然后给arduino编译使oled显示屏上能显示esp8266传过来的汉字,我知道esp8266可通过软串口给arduino传数据的,但究竟怎么传送汉字?大佬能教一教我吗?网上找的代码一点儿注释都没有,而且一般传的也不是汉字。如果能给我推荐的详细的教程也好啊,谢谢。
    DQKR(`2P765V1%JY7CZ7EF9.png
    JV6@AP7V8R3IOF@0B4XP(EL.png
    J%3KAP6%{~$N_2]S8[)`4CC.png

    该用户从未签到

    发表于 2020-11-30 08:30 | 显示全部楼层
    汉字对于计算机来说,就是一串数字,一般分两种,一种是utf8编码的,一种是gbk编码的,utf8的汉字占3个字节,gbk占2个字节,一个字节就是一个char ,用串口传的就是这种数字
  • TA的每日心情
    奋斗
    2020-12-15 09:03
  • 签到天数: 6 天

    [LV.2]偶尔看看I

     楼主| 发表于 2020-11-30 09:06 | 显示全部楼层
    98765kof 发表于 2020-11-30 08:30
    汉字对于计算机来说,就是一串数字,一般分两种,一种是utf8编码的,一种是gbk编码的,utf8的汉字占3个字节 ...

    也就是说esp8266通过软串口需要传输的不是汉字本身,而是汉字的编码吗?如果之后用u8g2的库函数把汉字输出到显示屏上,应该要求什么编码类型的汉字呢?
  • TA的每日心情
    奋斗
    2020-12-15 09:03
  • 签到天数: 6 天

    [LV.2]偶尔看看I

     楼主| 发表于 2020-11-30 10:38 | 显示全部楼层
    还有就是我尝试把代码中received-val改成String类型,结果出现了我看不懂的报错
    G%FS{T6SH4L3AXV[R0QTTSP.png

    该用户从未签到

    发表于 2020-11-30 10:40 | 显示全部楼层
    主要看你调用的是哪个接口,drawUtf8就用utf8的码
  • TA的每日心情
    奋斗
    2020-12-15 09:03
  • 签到天数: 6 天

    [LV.2]偶尔看看I

     楼主| 发表于 2020-12-4 20:04 | 显示全部楼层
    还是没有听懂,我只是想知道esp8266如何从onenet接受汉字,对应的recieved-value究竟应该是什么类型才可以存储汉字?
  • TA的每日心情
    无聊
    2020-8-1 21:53
  • 签到天数: 11 天

    [LV.3]偶尔看看II

    发表于 2020-12-4 20:19 | 显示全部楼层
    把你的程序发出来,包含库文件,帮你调试一下。
  • TA的每日心情
    奋斗
    2020-12-15 09:03
  • 签到天数: 6 天

    [LV.2]偶尔看看I

     楼主| 发表于 2020-12-4 20:38 | 显示全部楼层
    sangshu 发表于 2020-12-4 20:19
    把你的程序发出来,包含库文件,帮你调试一下。

    请问库文件,是包括我项目最前面几行的ESP8266WiFi.h,ArduinoJson.h,U8g2lib.h吗
  • TA的每日心情
    奋斗
    2020-12-15 09:03
  • 签到天数: 6 天

    [LV.2]偶尔看看I

     楼主| 发表于 2020-12-4 20:46 | 显示全部楼层
    1. #include <ESP8266WiFi.h>
    2. #include <ArduinoJson.h>
    3. #define DEBUG 1
    4. #include <U8g2lib.h>
    5. U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2(U8G2_R0,SCL,SDA); //配置构造函数
    6. #define INTERVAL_LCD             20             //定义OLED刷新时间间隔  
    7. unsigned long lcd_time = millis();                 //OLED刷新时间计时器
    8. const char ssid[]     = "";         // 使用时请修改为当前你的 wifi 名称 -- Please use your own wifi ssid
    9. const char password[] = "";     //  使用时请修改为当前你的 wifi 密码 -- Please use your own wifi password
    10. const char OneNetServer[] = "api.heclouds.com";
    11. const char APIKEY[] = "";    // 使用时请修改为你的API KEY -- Please use your own API KEY
    12. int32_t DeviceId = 651641648;                             // 使用时请修改为你的设备ID -- Please use your own device ID
    13. char DataStreams[] = "result";              
    14. const size_t MAX_CONTENT_SIZE = 1024;                  // 最大内容长度 -- Maximum content size
    15. const unsigned long HTTP_TIMEOUT = 2100;                // 超时时间 -- Timeout
    16. String  streaml;
    17. WiFiClient client;
    18. const int tcpPort = 80;
    19. struct UserData
    20. {
    21.     int errno_val;                // 错误返回值 -- Return error code
    22.     char error[32];               // 错误返回信息 -- Return error information
    23.     int recived_val;             // 接收数据值 -- Recived data
    24.     char udate_at[32];            // 最后更新时间及日期 -- Last time for update
    25. };

    26. //跳过 HTTP 头,使我们在响应正文的开头 -- Skip HTTP headers so that we are at the beginning of the response's body
    27. bool skipResponseHeaders()
    28. {
    29.     char endOfHeaders[] = "\r\n\r\n";
    30.     client.setTimeout(HTTP_TIMEOUT);
    31.     bool ok = client.find(endOfHeaders);
    32.     if (!ok)
    33.     {
    34.       Serial.println("No response or invalid response!"); //未响应 -- No response
    35.     }
    36.     return ok;
    37. }
    38. //从HTTP服务器响应中读取正文 -- Read the body of the response from the HTTP server
    39. void readReponseContent(char* content, size_t maxSize)
    40. {
    41.     //  size_t length = client.peekBytes(content, maxSize);
    42.     size_t length = client.readBytes(content, maxSize);
    43.     delay(20);
    44.     Serial.println(length);
    45.     Serial.println("Get the data from Internet!"); //获取到数据 -- Get the data
    46.     content[length] = 0;
    47.     Serial.println(content);
    48.     Serial.println("Read Over!");
    49. }
    50. // 解析数据存储到传入的结构体中 -- Save data to userData struct
    51. bool parseUserData_test(char* content, struct UserData* userData)
    52. {
    53.     // 根据我们需要解析的数据来计算JSON缓冲区最佳大小 -- Compute optimal size of the JSON buffer according to what we need to parse.
    54.     // 如果你使用StaticJsonBuffer时才需要 -- This is only required if you use StaticJsonBuffer.
    55.     const size_t BUFFER_SIZE = 1024;
    56.     // 在堆栈上分配一个临时内存池 -- Allocate a temporary memory pool on the stack
    57.     StaticJsonBuffer<BUFFER_SIZE> jsonBuffer;
    58.     // 如果堆栈的内存池太大,使用 DynamicJsonBuffer jsonBuffer 代替
    59.     // --If the memory pool is too big for the stack, use this instead:
    60.     //  --DynamicJsonBuffer jsonBuffer;
    61.     JsonObject& root = jsonBuffer.parseObject(content);
    62.     if (!root.success())
    63.     {
    64.       Serial.println("JSON parsing failed!");
    65.       return false;
    66.     }
    67.     // 复制需要的信息到userData结构体中 -- Here were copy the strings we're interested in
    68.     userData->errno_val = root["errno"];
    69.     strcpy(userData->error, root["error"]);
    70.     // 成功返回0 -- Number 0 represents successful
    71.     if ( userData->errno_val == 0 )
    72.     {
    73.       userData->recived_val = root["data"]["datastreams"][0]["datapoints"][0]["value"];
    74.       strcpy(userData->udate_at, root["data"]["datastreams"][0]["datapoints"][0]["at"]);
    75.       Serial.print("Recived Value : ");
    76.       Serial.print(userData->recived_val);
    77.       Serial.print("\t The last update time : ");
    78.       Serial.println(userData->udate_at);
    79.     }
    80.     Serial.print("errno : ");
    81.     Serial.print(userData->errno_val);
    82.     Serial.print("\t error : ");
    83.     Serial.println(userData->error);
    84.   
    85.     return true;
    86. }
    87. //读取数据 -- Read data
    88. int readData(int dId, char dataStream[])
    89. {
    90.     // 创建发送请求的URL -- We now create a URI for the request
    91.     String url = "/devices/";
    92.     url += String(dId);
    93.     url += "/datapoints?datastream_id=";
    94.     url += dataStream;

    95.     // 创建发送指令 -- We now combine the request to the server
    96.     String send_data = String("GET ") + url + " HTTP/1.1\r\n" +
    97.                      "api-key:" + APIKEY + "\r\n" +
    98.                      "Host:" + OneNetServer + "\r\n" +
    99.                      "Connection: close\r\n\r\n";
    100.     // 发送指令 -- This will send the request to server
    101.     client.print(send_data);
    102.     // 调试模式串口打印发送的指令 -- The request will be printed if we choose the DEBUG mode
    103.     if (DEBUG)
    104.     {
    105.       Serial.println(send_data);
    106.     }
    107.     unsigned long timeout = millis();
    108.     while (client.available() == 0)
    109.     {
    110.       if (millis() - timeout > 2000)
    111.       {
    112.         Serial.println(">>> Client Timeout !");
    113.         client.stop();
    114.         break;
    115.       }      
    116.     }

    117.     if (skipResponseHeaders())  
    118.     {
    119.       char response[MAX_CONTENT_SIZE];
    120.       // 从服务器读取信息后解析 -- We now parse the information after we recived the data
    121.       readReponseContent(response, sizeof(response));
    122.       UserData userData_LEDstatus;
    123.       if (parseUserData_test(response, &userData_LEDstatus))
    124.       {
    125.         Serial.println("Data parse OK!");
    126.         return userData_LEDstatus.recived_val;
    127.       }
    128.      }
    129. }
    130. void setup() {
    131.   u8g2.begin();
    132.   
    133.   WiFi.mode(WIFI_AP_STA);               //设置工作模式 -- set work mode:  WIFI_AP /WIFI_STA /WIFI_AP_STA
    134.     Serial.begin(115200);
    135.     delay(10);

    136.     Serial.println("");
    137.     Serial.print("Trying to connect to ");
    138.     Serial.println(ssid);
    139.     // 连接到wifi -- We start by connecting to a wifi network
    140.     WiFi.begin(ssid, password);
    141.     while (WiFi.status() != WL_CONNECTED)
    142.     {
    143.       delay(500);
    144.       Serial.print(".");
    145.     }
    146.   
    147.     Serial.println("");
    148.     Serial.println("WiFi connected");
    149.     Serial.print("IP address: ");
    150.     Serial.println(WiFi.localIP());
    151. }
    152. void loop() {
    153.   // put your main code here, to run repeatedly:

    154.   //建立连接并判断 -- Connecting to server
    155.     if (!client.connect(OneNetServer, tcpPort))
    156.     {
    157.       Serial.println("connection failed");
    158.       return;
    159.     }
    160.     //从云端获取值并存于streaml -- get data from server
    161.     streaml=readData(651641648, DataStreams);
    162.     Serial.println(streaml);
    163.     Serial.println("closing connection");
    164.       delay(10000);
    165. }
    复制代码
  • TA的每日心情
    奋斗
    2020-12-15 09:03
  • 签到天数: 6 天

    [LV.2]偶尔看看I

     楼主| 发表于 2020-12-4 20:47 | 显示全部楼层

    我想达到的效果就是,streaml中能存入onenet发过来的汉字。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    制作番茄计时器 提高学习效率        番茄钟   计时器
    制作番茄计时器 提高学习
    *学业重,本贴在未来几个月内无法及时维护 #视频介绍(推荐) https://www.bilibili.co
    关于arduino开发的工程方面的一些探索
    关于arduino开发的工程方
    刚开始用Arduino IDE写代码,连个代码提示都没有,后来发现在vscode上有arduino的插件
    雄霸Arduino中文开发平台
    雄霸Arduino中文开发平台
    雄霸Arduino中文开发平台适合于小白学习,中英文无缝切换。由于文件较大无法上传,请
    点灯·blinker esp8266加上DHT_11温度传感器
    点灯·blinker esp8266加
    #定义 BLINKER_WIFI #定义 BLINKER_MIOT_SENSOR //小爱同学定义为传感器设备
    【花雕动手做】太搞笑啦,一支胶管制成二只蠕动机器人
    【花雕动手做】太搞笑啦,
    装修屋子,用完了一筒千里马密封胶,偶然脑洞大开,想要试试看......
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表