• “龙江二号”微卫星传回地月合影 2019-04-18
  • 中国驻泰国大使考察合艾国光中学孔子课堂 2019-04-18
  • 【清园20年】感恩大回馈!半价!半价! 2019-04-18
  • 中央纪委紧盯节点 4年来通报曝光问题近4000起 2019-04-13
  • 2013环球企业领袖宁夏圆桌会议嘉宾云集 2019-04-13
  • 《魔兽世界》未解之谜 那些仍不能被玩家们踏足的领地 2019-04-11
  • 钱江潮评 让高质量发展插上人才的翅膀 2019-04-10
  • 习近平两会期间谈社会主义核心价值观 2019-04-02
  • 文脉颂中华——黄河新闻网 2019-04-02
  • 陈小林的专栏作者中国国家地理网 2019-03-29
  • 中英航母大战谁能赢歼151枚炸弹就能炸瘫女王 2019-03-22
  • 独特“光捕捉器”可控制分子生化性质 2019-03-22
  • 女性之声——全国妇联 2019-03-19
  • 【理上网来·辉煌十九大】德国北威州经济部长:十九大报告表明中国有能力为世界做出更多贡献 2019-03-11
  • 全国小麦收获进度过八成 2019-03-07
  • 打印

    12选5杀号公式大全: [其它] ESP8266 arduino core的WiFiClient库问题

    [复制链接]
    332|2
    跳转到指定楼层
    楼主
    本帖最后由 kingsing2 于 2019-3-10 11:38 编辑

    使用的是Arduino ESP8266 core,版本2.3.0。
    问题描述:
    在.ino文件中定义一个WiFiClient实例:WiFiClient serverClient

    在loop()函数中:
    1. size_t len = Serial.available();
    2. uint8_t sbuf[len];
    3. Serial.readBytes(sbuf, len);
    4. for (i = 0; i < MAX_SRV_CLIENTS; i++)
    5. {
    6.    if (serverClient && serverClient.connected())
    7.     {
    8.          serverClient.write(sbuf, len);
    9.          delay(1);
    10.     }
    11. }
    复制代码
    注意到这里sbuf是个变长度的数组。这段代码的编译不会有问题,即WiFiClient类型的serverClient可以调用write往sbuf里写东西。
    但如果将sbuf定义为定长度的,如下:
    1. size_t len = Serial.available();
    2. uint8_t sbuf[100];
    3. Serial.readBytes(sbuf, len);
    4. for (i = 0; i < MAX_SRV_CLIENTS; i++)
    5. {
    6.   if (serverClient && serverClient.connected())
    7.   {
    8.       serverClient.write(sbuf, len);
    9.      delay(1);
    10.   }
    11. }
    复制代码
    编译不通过,WiFiClient类型的serverClient在调用.write()方法时就会有问题。
    而如果改成常量的const uint8_t sbuf[100],那么编译就会通过。
    问题出在WiFiClient::write(),查看源代码:
    1. template <typename T>
    2. inline size_t WiFiClient::write(T& source, size_t unitSize) {
    3.   std::unique_ptr<uint8_t[]> buffer(new uint8_t[unitSize]);
    4.   size_t size_sent = 0;
    5.   while(true) {
    6.     size_t left = source.available();
    7.     if (!left)
    8.       break;
    9.     size_t will_send = (left < unitSize) ? left : unitSize;
    10.     source.read(buffer.get(), will_send);
    11.     size_t cb = write(buffer.get(), will_send);
    12.     size_sent += cb;
    13.     if (cb != will_send) {
    14.       break;
    15.     }
    16.   }
    17.   return size_sent;
    18. }
    复制代码
    发现使用的是模板,代码中有要求使用source.available(),而.available()方法是Stream类型才有的。那么问题来了,为何使用uint8_t sbuf[len] 和 const uint8_t sbuf[100]作为实参传入就没有问题,他们不应该有available()方法呀?
    是不是我错过了模板的什么诡异用法?

    当然,如果换用Arduino Esp8266 core 2.5.0版本是没有问题的,因为这个版本里不再使用模板来写write()方法。


    沙发
    | 2019-3-10 22:14 | 只看该作者
    没用过Arduino ESP8266 core,帮顶。
    既然不同的版本,有的可以有的不可以,建议先对比下电路图和库的支持版本等情况
    板凳
    | 2019-4-2 15:09 | 只看该作者
    1.         //wifi数据输出到 串口;
    2.         size_t                len_buf                =client.available()                ;
    3.                 uint8_t                wifi_buf        [len_buf]                                ;
    4.                 client                .readBytes        (wifi_buf,len_buf)                ;
    5.                 for (int i=0;i<len_buf;i++)        {
    6.                         Serial        .write                (wifi_buf[i])                        ;
    7.                 }
    复制代码


    hi,你好,通过历遍,可以实现数据的输出;
    扫描二维码,随时随地手机跟帖
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    我要发帖 投诉建议 创建版块 申请版主

    快速回复

    您需要登录后才可以回帖
    登录 | 注册
    高级模式

    论坛热帖

    关闭

    热门推荐上一条 /4 下一条

    快速回复 广东快乐十分走势图 返回列表
  • “龙江二号”微卫星传回地月合影 2019-04-18
  • 中国驻泰国大使考察合艾国光中学孔子课堂 2019-04-18
  • 【清园20年】感恩大回馈!半价!半价! 2019-04-18
  • 中央纪委紧盯节点 4年来通报曝光问题近4000起 2019-04-13
  • 2013环球企业领袖宁夏圆桌会议嘉宾云集 2019-04-13
  • 《魔兽世界》未解之谜 那些仍不能被玩家们踏足的领地 2019-04-11
  • 钱江潮评 让高质量发展插上人才的翅膀 2019-04-10
  • 习近平两会期间谈社会主义核心价值观 2019-04-02
  • 文脉颂中华——黄河新闻网 2019-04-02
  • 陈小林的专栏作者中国国家地理网 2019-03-29
  • 中英航母大战谁能赢歼151枚炸弹就能炸瘫女王 2019-03-22
  • 独特“光捕捉器”可控制分子生化性质 2019-03-22
  • 女性之声——全国妇联 2019-03-19
  • 【理上网来·辉煌十九大】德国北威州经济部长:十九大报告表明中国有能力为世界做出更多贡献 2019-03-11
  • 全国小麦收获进度过八成 2019-03-07
  • 广东福彩官方微信 体彩浙江飞鱼开奖 河南快赢481玩法介绍 北京赛车改单软件 澳洲幸运10哪里下载app 11选5技巧 超级大乐透开奖规则 163老时时彩 时时彩规律教学 竞彩总进球奖金计算器 排列三走势图 双色球预测 新疆时时彩开奖视频 北京赛车pk10app 时时彩购买正式网站 北京pk10软件平刷王