打印

[其它] ESP8266 arduino core的WiFiClient库问题

[复制链接]
110|1
跳转到指定楼层
楼主
本帖最后由 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,帮顶。
既然不同的版本,有的可以有的不可以,建议先对比下电路图和库的支持版本等情况
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

快速回复

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

论坛热帖

关闭

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

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