A megszakítások használhatók az ESP8266-on, de óvatosan kell őket használni, és számos korlátozásuk van:
A megszakítási visszahívási funkcióknak az IRAM-ban kell lenniük, mert előfordulhat, hogy a flash más műveletek közepén van. Ehhez adja hozzá az IRAM_ATTR
attribútumot a függvénydefinícióhoz. Ha ez az attribútum nem található meg, a vázlat összeomlik, amikor hibaüzenettel kísérel meg attachInterrupt
-ot.
IRAM_ATTR void gpio_change_handler(void *data) {...
A megszakítások nem hívhatják meg a delay()
vagy a yield()
függvényt, és nem hívhatnak meg olyan rutinokat, amelyek belsőleg a delay()
-t vagy a yield()
-et használják.
A hosszan futó (>1 ms) feladatok megszakításokban instabilitást vagy összeomlást okoznak. A WiFi és a mag más részei instabillá válhatnak, ha a megszakításokat egy hosszú ideig tartó megszakítás blokkolja. Ha sok tennivalója van, beállíthat egy változékony globális jelzőt, amellyel a fő loop()
minden lépését ellenőrizheti, vagy használhat ütemezett függvényt (amely a megszakítási kontextuson kívül kerül meghívásra, ha biztonságos) a hosszú távú munka elvégzéséhez.
A memóriaműveletek veszélyesek lehetnek, és ezeket kerülni kell megszakítások esetén. A new
vagy malloc
hívásokat minimálisra kell csökkenteni, mert ezek hosszú futási időt igényelhetnek, ha a memória töredezett. A realloc
és free
hívásokat SOHA nem szabad hívni. Ugyanebből az okból kifolyólag tilos olyan rutinok vagy objektumok használata, amelyek maguk hívják a free
-t vagy a realloc
-ot. Ez azt jelenti, hogy a String
, std::string
, std::vector
és más olyan osztályokat, amelyek összefüggő memóriát használnak, és amely átméretezhető, rendkívül óvatosan kell használni (annak biztosítása, hogy a karakterláncok ne változzanak, vektorelemek ne legyenek hozzáadva stb.).
Az Arduino kivezetések számozása közvetlenül megfelel az ESP8266 GPIO kivezetések számozásának. A pinMode
, digitalRead
és digitalWrite
funkciók a megszokott módon működnek, tehát a GPIO2 olvasásához hívja meg a digitalRead(2)
-t.
A 0–15 digitális kivezetések lehetnek INPUT
, OUTPUT
vagy INPUT_PULLUP
. A 16. kivezetés lehet INPUT
, OUTPUT
vagy INPUT_PULLDOWN_16
. Indításkor a kivezetések INPUT-ként vannak konfigurálva.
A kivezetések más funkciókat is szolgálhatnak, például soros, I2C, SPI. Ezeket a funkciókat általában a megfelelő könyvtár aktiválja. Az alábbi diagram a népszerű ESP-12 modul kivezetés-leképezését mutatja be.
A kivezetések funkciói
A 6-11 digitális kivezetések nem láthatók ezen az ábrán, mert a legtöbb modul flash memória chip csatlakoztatására szolgál. Ha ezeket a kivezetéseket IO-ként próbálja használni, valószínűleg a program összeomlik.
Vegye figyelembe, hogy egyes kártyák és modulok (ESP-12ED, NodeMCU 1.0) a 9-es és 11-es érintkezőket is kitörik. Ezeket IO-ként lehet használni, ha a flash chip DIO módban működik (szemben a QIO-val, amely az alapértelmezett).
A pin-megszakításokat az attachInterrupt
, detachInterrupt
funkciók támogatják. A megszakítások bármely GPIO kivezetéshez csatolhatók, kivéve a GPIO16-ot. A szabványos Arduino megszakítási típusok támogatottak: CHANGE
, RISING
, FALLING
. Az ISR-eknek IRAM_ATTR
-nek kell lenniük a függvénydefiníció előtt.
MEGJEGYZÉS: Az analogRead()
túl gyakori hívása a WiFi leállását okozza. Ha a WiFi üzemel, az analogRead()
eredménye legalább 5 ms-ig gyorsítótárban maradhat a hatékony hívások között.
Az ESP8266 egyetlen ADC csatornával rendelkezik a felhasználók számára. Használható az ADC érintkező feszültségének vagy a modul tápfeszültségének (VCC) olvasására.
Az ADC érintkezőre adott külső feszültség olvasásához használja az analogRead(A0)
-t. A csupasz ESP8266 bemeneti feszültségtartománya 0–1,0 V, azonban egyes kártyák feszültségosztókat is alkalmazhatnak. A biztonság kedvéért <1.0V tesztelhető. Ha pl. A 0,5 V ~512 körüli értékeket ad, akkor a maximális feszültség nagy valószínűséggel 1,0 V, a 3,3 V pedig károsíthatja az ESP8266-ot. A ~150 körüli értékek azonban azt jelzik, hogy a maximális feszültség valószínűleg 3,3 V.
A VCC feszültség leolvasásához használja az ESP.getVcc()
-et, és az ADC kivezetést nem kell csatlakoztatni. Ezenkívül a következő sort kell hozzáadni a vázlathoz:
ADC_MODE(ADC_VCC);
Ennek a sornak minden függvényen kívül kell megjelennie, például közvetlenül a vázlat #include
sorai után.
Az analogWrite(pin, value)
engedélyezi a szoftveres PWM-et az adott kivezetésen. A PWM a 0-tól 16-ig terjedő kivezetéseken használható. Hívja az analogWrite(pin, 0)
parancsot a PWM letiltásához a kivezetésen.
A value
0 és 255 között lehet (ami az Arduino alapértelmezése). A PWM tartomány megváltoztatható az analogWriteRange(new_range
) vagy az analogWriteResolution(bits)
meghívásával. A new_range
lehet 15…65535 vagy a bits
4…16.
Az analogWriteMode(pin, value, openDrain)
függvény lehetővé teszi, hogy a pinmódot OUTPUT_OPEN_DRAIN
értékre állítsa az OUTPUT
helyett.
MEGJEGYZÉS: Az alapértelmezett analogWrite
tartomány 1023 volt a 3.0 előtti kiadásokban, de ez a külső könyvtárakkal való összeférhetetlenséghez vezetett, ami az Arduino mag alapértelmezett 256-os értékétől függ. Azok a meglévő alkalmazások, amelyek az előző 1023-as értékre támaszkodnak, hozzáadhatják az analogWriteRange(1023)
hívását a setup()
rutinjukhoz, hogy visszatérjenek régi viselkedésükhöz. Azon alkalmazásokon, amelyek már hívták az analogWriteRange
-et, nem kell változtatni.
A PWM frekvencia alapértelmezés szerint 1 kHz. Hívja az analogWriteFreq(new_frequency)
függvényt a frekvencia megváltoztatásához. Az érvényes értékek 100 Hz-től 40 000 Hz-ig terjednek.
Az ESP-nek nincs hardveres PWM-je, így a megvalósítás szoftveresen történik. Egy 40 kHz-es PWM kimenettel a CPU már meglehetősen terhelt. Minél több PWM-kimenetet használunk, és minél magasabb a frekvenciájuk, annál közelebb kerülünk a CPU-korlátokhoz, és annál kevesebb CPU-ciklus áll rendelkezésre a vázlat-végrehajtáshoz.
A millis()
és a micros()
az alaphelyzetbe állítás után eltelt ezred-, illetve mikromásodpercek számát adja vissza.
A delay(ms)
egy adott számú ezredmásodpercig szünetelteti a vázlatot, és lehetővé teszi a WiFi és TCP/IP feladatok futtatását. delayMicroseconds(us)
szünetet tart adott számú mikroszekundumra.
Ne feledje, hogy a vázlaton kívül sok kódnak futnia kell a chipen, amikor a WiFi csatlakozik. A WiFi és TCP/IP könyvtárak lehetőséget kapnak a függőben lévő események kezelésére minden alkalommal, amikor a loop()
függvény befejeződik, VAGY a delay
meghívásakor. Ha a vázlatban van valahol egy ciklus, amely sok időt vesz igénybe (>50 ms) a delay
hívása nélkül, érdemes lehet egy delay
hívási funkcióval kiegészíteni, hogy a WiFi verem zökkenőmentesen működjön.
Van egy yield()
függvény is, amely egyenértékű a delay(0)
-val. A delayMicroseconds
funkció viszont nem enged más feladatoknak, így 20 ezredmásodpercnél nagyobb késleltetés esetén nem javasolt a használata.
A Serial
objektum ugyanúgy működik, mint egy hagyományos Arduino esetében. A hardveres FIFO-n kívül (128 bájt TX és RX esetén), a Serial
további testreszabható 256 bájtos RX pufferrel rendelkezik. Ennek a szoftveres puffernek a méretét a felhasználó módosíthatja. Nagyobb vételi sebességnél nagyobb méret használata javasolt.
A ::setRxBufferSize(size_t size)
metódus szükség szerint módosítja az RX puffer méretét. Ezt a ::begin()
előtt kell meghívni. A méret argumentumnak legalább elég nagynak kell lennie ahhoz, hogy az olvasás előtt kapott összes adatot tartalmazza.
Csak átvitel esetén a 256 bájtos RX puffer kikapcsolható a RAM megtakarítása érdekében a SERIAL_TX_ONLY mód átadásával a Serial.begin()-nek. Egyéb módok a SERIAL_RX_ONLY és SERIAL_FULL (az alapértelmezett).
A fogadás megszakítás-vezérelt, de lekérdezéseket és foglalt várakozásokat küld. A blokkolási viselkedés a következő: A ::write()
hívás nem blokkol, ha a bájtok száma belefér a TX FIFO-ban rendelkezésre álló aktuális helyre. A hívás blokkolja, ha a TX FIFO megtelt, és megvárja, amíg van hely, mielőtt további bájtokat írna bele, amíg az összes bájt meg nem íródik. Más szóval, amikor a hívás visszatér, az összes bájt beírásra került a TX FIFO-ba, de ez még nem jelenti azt, hogy az összes bájt ki lett küldve a soros vonalon. A ::read()
hívás nem blokkol, még akkor sem, ha nem állnak rendelkezésre bájtok az olvasáshoz. A ::readBytes()
hívás addig blokkol, amíg az olvasott bájtok száma el nem éri a bevitt argumentum által megkívánt bájtok számát. A ::flush()
hívásblokkok arra várnak, hogy a TX FIFO üres legyen, mielőtt visszatérne. Javasoljuk, hogy ezt hívja meg, hogy megbizonyosodjon arról, hogy az összes bájt el lett küldve, mielőtt konfigurációt módosítana a soros porton (pl. az átviteli sebesség megváltoztatása) vagy a kártya alaphelyzetbe állítása előtt.
A Serial
az UART0-t használja, amely a GPIO1 (TX) és GPIO3 (RX) érintkezőkhöz van leképezve. A Serial újra leképezhető GPIO15 (TX) és GPIO13 (RX) formátumra a Serial.swap()
meghívásával a Serial.begin
után. A swap
ismételt hívása az UART0-t visszaképezi a GPIO1-re és a GPIO3-ra.
A Serial1
UART1-et használ, a TX pin GPIO2. Az UART1 nem használható adatfogadásra, mert általában az RX érintkezője van lefoglalva a flash chip csatlakozáshoz. A Serial1
használatához hívja a Serial1.begin(baudrate)
parancsot.
Ha a Serial1
nincs használva, és a Serial
nincs felcserélve - az UART0 TX-je leképezhető GPIO2-re a Serial.begin
utáni Serial.set_tx(2)
meghívásával vagy közvetlenül a Serial.begin(baud, config, mode, 2)
paranccsal.
A Serial.begin
meghívásakor a WiFi-könyvtárak diagnosztikai kimenete alapértelmezés szerint le van tiltva. A hibakeresési kimenet ismételt engedélyezéséhez hívja a Serial.setDebugOutput(true)
parancsot. A hibakeresési kimenet Serial1
-re való átirányításához hívja a Serial1.setDebugOutput(true)
parancsot.
A printf()
függvény kimenetének engedélyezéséhez a Serial.setDebugOutput(true)
-t is használnia kell.
Mind a Serial
, mind a Serial1
objektumok támogatják az 5, 6, 7, 8 adatbitet, páratlan (O), páros (E) és nem (N) paritást, valamint 1 vagy 2 stopbitet. A kívánt mód beállításához hívja a Serial.begin(baudrate, SERIAL_8N1)
, a Serial.begin(baudrate, SERIAL_6E2)
stb. parancsot. Az alapértelmezett konfigurációs mód a SERIAL_8N1. A lehetőségek a következők: SERIAL_[5678][NEO][12]. Példa: a SERIAL_8N1
azt jelenti, hogy 8 bit, nincs paritás és 1 stopbit.
Mind a Serial
, mind a Serial1
esetében új módszert alkalmaztak az aktuális adatátviteli sebesség beállításához. Az aktuális adatátviteli sebesség megtekintéséhez hívja a Serial.baudRate()
, a Serial1.baudRate()
parancsot. A visszatérési érték int
, az aktuális sebesség. Például
// Állítsa az adatátviteli sebességet 57600-ra
Serial.begin(57600);
// Az aktuális adatátviteli sebesség lekérése
int br = Serial.baudRate();
// Kinyomtatja, hogy "Serial is 57600 bps"
Serial.printf("Serial is %d bps", br);
A Serial
és Serial1
objektumok egyaránt a HardwareSerial
osztály példányai.
Ez a hivatalos ESP8266 Software Serial könyvtár esetében is megtörténik, lásd ezt a lekérési kérelmet.
Vegye figyelembe, hogy ez a megvalósítás csak ESP8266 alapú kártyákra vonatkozik, és nem működik más Arduino kártyákkal.
A Serial-ra érkező adatok ismeretlen átviteli sebességét a Serial.detectBaudrate(time_t timeoutMillis)
használatával észlelheti. Ez a módszer megpróbálja észlelni az adatátviteli sebességet maximum timeoutMillis ms-ig. Nullát ad vissza, ha nem észlelt átviteli sebességet, vagy egyébként az észlelt átviteli sebességet. A detectBaudrate()
függvény a Serial.begin()
meghívása előtt hívható meg, mert nincs szüksége sem a fogadópufferre, sem a SerialConfig paraméterekre.
Az uart nem tud más paramétereket észlelni, mint például a start- vagy stopbitek száma, az adatbitek száma vagy a paritás.
Maga az észlelés nem változtat az átviteli sebességen, észlelés után a szokásos módon be kell állítani a Serial.begin(detectedBaudrate)
segítségével.
Az észlelés nagyon gyors, mindössze néhány bejövő bájtot vesz igénybe.
A SerialDetectBaudirate.ino a felhasználás teljes példája.
A Program memória funkciói ugyanúgy működnek, mint egy hagyományos Arduino esetében; csak olvasható adatok és karakterláncok elhelyezése a csak olvasható memóriában, és heap felszabadítása az alkalmazás számára.
A 2.7 előtti alapverziókban a fontos különbség az, hogy az ESP8266-on a literális karakterláncok nincsenek összevonva. Ez azt jelenti, hogy ugyanaz az F("")
és/vagy PSTR("")
karakterláncban definiált karakterlánc fog helyet foglalni a kód minden példányához. Tehát magának kell kezelnie az ismétlődő karakterláncokat.
A 2.7-es verziótól kezdve ez már nem igaz: az r/o memórián belüli ismétlődő literális karakterláncok kezelése már megtörténik.
Van egy további segítő makró, amely megkönnyíti a const PROGMEM
karakterláncok átadását olyan metódusoknak, amelyek egy FPSTR()
nevű __FlashStringHelper
-t vesznek igénybe. Ennek használata megkönnyíti a karakterláncok összegyűjtését. Nem egyesíti a karakterláncokat…
String response1;
response1 += F("http:");
...
String response2;
response2 += F("http:");
Az FPSTR használata…
const char HTTP[] PROGMEM = "http:";
...
{
String response1;
response1 += FPSTR(HTTP);
...
String response2;
response2 += FPSTR(HTTP);
}
A C++ kivételekről, a new operátor
ról és a Kivételek menüpontról
A C++ szabvány a következőket mondja az új operátor viselkedéséről heap összeakadás esetén (memória megtelt):
std::bad_alloc
C++ kivételt kell dobnia, ha engedélyezve vannak
ellenkező esetben abort()
A fenti első pontnak több oka is van, köztük a következők:
garantálja, hogy az új visszaadása soha nem nullptr
garantálja a legfelső szintű objektum és az összes tag alobjektum teljes felépítését
garantálja, hogy a részben megépített részobjektumok megsemmisülnek, és a megfelelő sorrendben, ha az oom az építés felénél találkozik
Ha a C++ kivételek le vannak tiltva, vagy a new(nothrow)
használatakor, a fenti garanciák nem tarthatók fenn, így a fenti második pont (abort()
) az egyetlen életképes std::c++
megoldás.
Történelmileg az Arduino környezetekben a new
túlterhelt, hogy egyszerűen visszaadja az egyenértékű malloc()
-ot, amely viszont visszaadhatja a nullptr
-t.
Ez a viselkedés nem C++ szabvány, és ennek jó oka van: vannak rejtett és nagyon rossz mellékhatások. Az osztály- és tagkonstruktorok mindig meghívásra kerülnek, még akkor is, ha a memória megtelt (this == nullptr
). Ezenkívül a felső objektum memóriafoglalása sikeres lehet, de egyes tagobjektumokhoz szükséges lefoglalás meghiúsulhat, így az építés meghatározatlan állapotban marad. Tehát Ardudino new
történeti viselkedése, amikor az elégtelen memóriával szembesül, előbb-utóbb rossz összeomláshoz vezet, néha megmagyarázhatatlan, általában a memória sérülése miatt, még akkor is, ha a visszaadott értéket ellenőrizzük és kezeljük. Szerencsére az esp8266-on a RAM 0-s cím közelében történő frissítése azonnal hardveres kivételt jelent, ellentétben az olyan uC-k esetében, mint az avr, amelyen ez a memória elérhető.
A core 2.6.0-tól kezdve 3 lehetőség van: örökölt (alapértelmezett) és két egyértelmű eset, amikor új oom-mal találkozik:
a new
nullptr
-t ad vissza, lehetséges rossz hatásokkal vagy azonnali összeomlással, amikor a konstruktorok (amúgy hívják) inicializálják a tagokat (ebben az esetben a kivételek le vannak tiltva)
A C++ kivételek le vannak tiltva: a new
abort()
hívások "tisztán" összeomlanak, mert nincs mód a memóriafoglalás tiszteletben tartására vagy a kecses helyreállításra.
A C++ kivételek engedélyezve vannak: a new
std::bad_alloc
C++ kivételt dob, amely elkapható és kecsesen kezelhető. Ez biztosítja a helyes viselkedést, beleértve az összes részobjektum kezelését, ami garantálja a stabilitást.
A Stream az Arduino API egyik alapvető osztálya. A vezetékes, soros, hálózati és fájlrendszerek olyan adatfolyamok, amelyekből adatokat olvasnak vagy írnak.
A streamekkel való átvitel meglehetősen gyakori, mint például a történelmi WiFiSerial vázlat:
//ellenőrizze a kliensek adatait
//lekérni az adatokat a telnet klienstől és továbbítja az UART-hoz
while (serverClient.available()) {
Serial.write(serverClient.read());
}
//ellenőrizze az UART adatokat
if (Serial.available()) {
size_t len = Serial.available();
uint8_t sbuf[len];
Serial.readBytes(sbuf, len);
//UART adatok küldése az összes csatlakoztatott telnet kliensnek
if (serverClient && serverClient.connected()) {
serverClient.write(sbuf, len);
}
}
Észrevehető, hogy a hálózatban a soros irányban az adatok bájtonként kerülnek átvitelre, miközben az adatok rendelkezésre állnak. A másik irányban egy ideiglenes puffer jön létre a veremben, feltöltődik az elérhető soros adatokkal, majd átkerül a hálózatra.
A readBytes(puffer, long)
metódus időtúllépést tartalmaz annak biztosítására, hogy az összes szükséges bájt megérkezzen. A write(puffer, hossz)
(a Print::
) függvény is általában blokkol, amíg a teljes puffer el nem kerül. Mindkét függvény az átvitt bájtok számát adja vissza.
A Stream osztály így működik és általánosan használatos.
A Stream::
-ből származtatott osztályok általában bevezetik a read(buffer, len)
metódust is, ami hasonló a readBytes(buffer, len)
timeout-hoz: a visszaadott érték kisebb is lehet, mint a kért méret, ezért erre fokozottan ügyelni kell. funkció, amelyet az Arduino Client::
osztályban vezettek be (vö. AVR referencia implementáció). Ezt a funkciót más olyan osztályokban is bevezették, amelyek nem a Client::
-ből származnak, pl. HardverSerial::
.
Az Stream-bővítményeket úgy tervezték, hogy kompatibilisek legyenek az Arduino API-val, és további módszereket kínálnak az átvitel hatékonyabbá és egyszerűbbé tételéhez.
A fenti soros hálózati átvitel a következőképpen írható fel:
serverClient.sendAvailable(Serial); // darabonként
Serial.sendAvailable(serverClient); // darabonként
Egy visszhangszolgáltatás így írható:
serverClient.sendAvailable(serverClient); // tcp echo szolgáltatás
Serial.sendAvailable(Serial); // soros szoftveres visszacsatolás
A kódolási idő csökkentése mellett ezek a módszerek optimalizálják az átvitelt azáltal, hogy lehetőség szerint elkerülik a puffermásolatokat.
Felhasználói API: Stream::send()
A streamek célja az adatátvitel a gyártók és a fogyasztók között, mint a fenti telnet/soros példa. Négy módszer áll rendelkezésre, amelyek mindegyike visszaadja az átvitt bájtok számát:
Stream::sendSize(dest, size [, timeout])
Ez a metódus a megadott vagy alapértelmezett időtúllépésig vár a size
byte-ok átviteléhez a dest
adatfolyamba.
Stream::sendUntil(dest, delim [, timeout])
Ez a módszer a megadott vagy alapértelmezett időtúllépésig vár az adatok átviteléhez, amíg a delim
teljesül. Megjegyzés: A határoló beolvasásra kerül, de nem kerül átvitelre (például readBytesUntil
)
Stream::sendAvailable(dest)
Ez a módszer minden már rendelkezésre álló adatot továbbít a célállomásra. Nincs időtúllépés, és a visszaadott érték 0, ha nincs mit átvinni, vagy nincs hely a célállomáson.
Stream::sendAll(dest [, timeout])
Ez a módszer a megadott vagy alapértelmezett időtúllépésig vár az összes elérhető adat átviteléhez. Hasznos, ha a forrás meg tudja mondani, hogy nem lesz több adat elérhető ehhez a híváshoz, vagy ha a célállomás meg tudja mondani, hogy többé nem fog tudni fogadni.
Például egy forráskarakterlánc nem növekszik az átvitel során, vagy egy adott hálózati kapcsolatnak meghatározott mennyiségű adatot kell küldenie a bezárás előtt. A ::sendAll()
az összes bájtot megkapja. Az időtúllépés akkor hasznos, ha a célállomásnak feldolgozási időre van szüksége (pl. a hálózat vagy a soros bemeneti puffer megtelt = kérjük, várjon egy kicsit).
Két további osztály biztosított.
StreamConstPtr::
állandó puffer tárolására szolgál (RAM-ban vagy flash-ben).
Ezzel az osztállyal egy Stream::
készíthető const char*
, F("néhány szó flashben")
vagy PROGMEM
karakterláncokból. Ez az osztály nem készít másolatot, még flash adatok esetén sem. Flash-tartalom esetén a bájtonkénti átvitel következménye, ha a „memcpy_P” nem használható. Más tartalmak lehetőség szerint azonnal átvihetők.
StreamConstPtr css(F("my long css data")); // A CSS-adatok nem másolhatók a RAM-ba
server.sendAll(css);
Az S2Stream::
arra készült, hogy egy String::
Stream::
-t készítsen másolat nélkül.
String helloString("hello");
S2Stream hello(helloString);
hello.reset(0); // megakadályozza, hogy a ::read() felhasználja a karakterláncot
hello.sendAll(Serial); // azt mutatja, hogy "hello"
hello.sendAll(Serial); // semmit nem mutat, a tartalmat már elolvasták
hello.reset(); // tartalommutató visszaállítása
hello.sendAll(Serial); // azt mutatja, hogy "hello"
hello.reset(3); // állítsa vissza a tartalommutatót egy adott pozícióba
hello.sendAll(Serial); // azt mutatja, hogy "lo"
hello.setConsume(); // A ::read() pusztítani fog, ez az alapértelmezett
Serial.println(helloString.length()); // azt mutatja, hogy 5
hello.sendAll(Serial); // azt mutatja, hogy "hello"
Serial.println(helloString.length()); // azt mutatja, hogy 0, a string elpusztítva
StreamString::
az S2Stream
ből származik
StreamString contentStream;
client.sendSize(contentStream, SOME_SIZE); // legfeljebb SOME_SIZE bájtot fogad
// egyenértékű:
String content;
S2Stream contentStream(content);
client.sendSize(contentStream, SOME_SIZE); // legfeljebb SOME_SIZE bájtot fogad
// a tartalom tartalmazza az adatokat
Belső Stream API: peekBuffer
Íme a módszerek listája és azok jelentése. Jelenleg a HardwareSerial
, a WiFiClient
és a WiFiClientSecure
verziókban valósulnak meg.
virtual bool hasPeekBufferAPI()
true
-t ad vissza, ha az API jelen van az osztályban
virtual size_t peekAvailable()
az elérhető bájtok számát adja vissza
A virtual const char* peekBuffer()
visszaadja a mutatót ezekre a bájtokra
Ez az API megköveteli, hogy a peekBuffer()
után és a peekConsume()
meghívásáig semmilyen "read" függvényt ne hívjanak meg.
virtual void peekConsume (size_t consume)
azt mondja, hogy dobja el ezt a számú bájtot
virtual bool inputCanTimeout()
A StringStream
false értéket ad vissza. A zárt hálózati kapcsolat false értéket ad vissza. Ez a függvény lehetővé teszi, hogy a Stream::sendAll()
korábban visszatérjen.
virtual bool outputCanTimeout()
A zárt hálózati kapcsolat false értéket ad vissza. Ez a függvény lehetővé teszi, hogy a Stream::sendAll()
korábban visszatérjen.
virtual ssize_t streamRemaining()
-1-et ad vissza, ha az adatfolyam hátralévő mérete ismeretlen, a megvalósítástól függően (karakterláncméret, fájlméret...).