[其它]

ESP8266 arduino core的WiFiClient库问题

[复制链接]
1951|2
手机看帖
扫描二维码
随时随地手机跟帖
kingsing2|  楼主 | 2019-3-10 11:36 | 显示全部楼层 |阅读模式
本帖最后由 kingsing2 于 2019-3-10 11:38 编辑

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

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

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


相关帖子

dirtwillfly| | 2019-3-10 22:14 | 显示全部楼层
没用过Arduino ESP8266 core,帮顶。
既然不同的版本,有的可以有的不可以,建议先对比下电路图和库的支持版本等情况

使用特权

评论回复
wsdxyz| | 2019-4-2 15:09 | 显示全部楼层
        //wifi数据输出到 串口; 
        size_t                len_buf                =client.available()                ;
                uint8_t                wifi_buf        [len_buf]                                ;
                client                .readBytes        (wifi_buf,len_buf)                ;
                for (int i=0;i<len_buf;i++)        {
                        Serial        .write                (wifi_buf[i])                        ;
                }


hi,你好,通过历遍,可以实现数据的输出;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

269

帖子

1

粉丝