Fórum témák
- • Gázkazán vezérlő hibák
- • Erősítő építése elejétől a végéig
- • Felajánlás, azaz ingyen elvihető
- • Folyamatábrás mikrokontroller programozás Flowcode-dal
- • Indukciós főzőlap javítása
- • Radiosonde
- • HDMI bekötés
- • Muzeális készülékek-alkatrészek restaurálása
- • Westen 240 Fi gázkazán hiba
- • Szünetmentes táp javítása, élesztése
- • TV hiba, mi a megoldás?
- • Háromfázisú aggregátor
- • Kávéfőzőgép hiba
- • Klíma szervizelés, javítás
- • Nyomtató probléma
- • Kombikazán működési hiba
- • Napelem alkalmazása a lakás energia ellátásában
- • Szobatermosztát bekötése
- • Tina
- • Érdekességek
- • Erősítő mindig és mindig
- • Lemezjátszó beállítása, javítása
- • Rádióamatőrök topikja
- • Padlófűtés vezérlés
- • Li-Po - Li-ion akkumulátor és töltője
- • Labortápegység készítése
- • Tápegységgel kapcsolatos kérdések
- • Autórádió (fejegység) problémák, kérdések, válaszok
- • Sonoff kapcsolók informatikai háttere (rendszer topológia)
- • Kapcsolási rajzot keresek
- • EAGLE NYÁK tervező
- • Telefon és LAN hálózat kialakítása
- • Vásárlás, hol kapható?
- • SONY TA-F 590ES MOSFET végfok átalakítása
- • Villanypásztor
- • Elektronikus szulfátoldó (Akku aktivátor)
- • Akkumulátor töltő
- • Klíma beszerelése, fűtés-hűtés házilag
- • Autóelektronika
- • SMD forrasztás profin
- • LCD TV probléma
- • Számítógép hiba, de mi a probléma?
- • Vicces - mókás történetek
- • Parkside akkuk javìtása
- • Videoton EA 6383 s (tuning)
- • Arduino
- • Elfogadnám, ha ingyen elvihető
- • Ultrahangos párásító
- • Hangsugárzó építés, javítás - miértek, hogyanok
- • PIC - Miértek, hogyanok haladóknak
- • RFID Miértek és hogyanok
- • Elektromos távirányítós kapunyitó
- • Leválasztó transzformátor
- • Codefon kaputelefon
- • Mosógép vezérlők és általános problémáik
» Több friss téma
|
Fórum » Espressif mikrokontrollerek
Sziasztok,
Van egy kodom (arduino) elég nagy. Az ESP32 v2.0.3 -an simán müködik, de a v2.0.4 es a v2.0.5 -ön a következő hibát adja forditás közbe:
Hogy lehetne ettől megszabadulni? void onWsEvent(AsyncWebSocket*, AsyncWebSocketClient*, AwsEventType, void*, uint8_t*, size_t)':
error: 'sprintf' writing a terminating nul past the end of the destination [-Werror=format-overflow=]
for(size_t i=0; i < info->len; i++){ sprintf(buff, "%02x ", (uint8_t) data[i]);
note: 'sprintf' output 4 bytes into a destination of size 3
for(size_t i=0; i < info->len; i++){ sprintf(buff, "%02x ", (uint8_t) data[i]);
error: 'sprintf' writing a terminating nul past the end of the destination [-Werror=format-overflow=]
for(size_t i=0; i < len; i++){ sprintf(buff, "%02x ", (uint8_t) data[i]);
note: 'sprintf' output 4 bytes into a destination of size 3
for(size_t i=0; i < len; i++){ sprintf(buff, "%02x ", (uint8_t) data[i]);
minek ez a nagy felhajtás a bejelentkezésnél ? kell fizessem az SMS -eket (nem vagyok Magyarország-i) A hozzászólás módosítva: Nov 16, 2022
Nem látszik elég a kódból ahhoz, hogy biztosat lehessen mondani, de szerintem ez a probléma nálad is, amiről ezen a blogoldalon írnak: https://pascal-bergeron.com/en/posts/sprintf-terminating-nul/
A buff nevű cél buffer túl rövid, legalább egy bájttal nagyobbat kell foglalni neki. Ha igaza van a fordítónak, akkor eddig is rossz volt a kód, de ez egy új figyelmeztetés az új fordítóban, hogy megpróbálja kitalálni, hogy mekkora a célbuffer, és mekkora lesz amit kiírsz és ez alapján warningot ad.
A legjobb az volna, ha sprintf helyett snprintf-et használnál, aminek át kell adni a buffer méretét is. Ez garantáltan nem fog túlírni a bufferen.
A bufferen túlírás azért nagyon kellemetlen, mert sokszor nagyon nehezen debuggolható hibát okoz, ami teljesen más funkcióban jön elő, mint ahol a programban a hiba van. Úgyhogy ezzel nem érdemes viccelni, snprintf-et kell használni és rigorózusan követni, hogy mekkor a buffer.
Nem akarom tölteni az oldalt, ITTEN az első függvény: „void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len)”
Teljesen egyértelműen hibás, és ügyesen kifogta a fordító! 3 bájt van allokálva, és 4 bájtot ír bele (hét hexa számjegy plusz space, plusz záró nulla!).
Ha megy az angol, akkor olvasd el a fentebb linkelt posztot, pontosan erről szól, kezdőknek való ahogy belenéztem.
A megoldás az, hogy a buff[3]-at átírod buff[4]-re.
Az elvi hibás program valódi hibát szerintem azért nem okozott a hibás változatában sem, mert a fordító mindenképpen 4-es határra igazítja a változókat 32 bites rendszereken, és így valójában volt ott egy negyedik bájt is, és ezért nem írt felül semmit a hibás megoldás.
De még egyszer mondom, hogy inkább írd át az összes sprintf-et snprintf-re, az a biztos és jó gyakorlat. Még mindig jobb ujjgyakorlatként átírni 100-at, mint napokig debuggolni egy ebből adódó hibát. A hozzászólás módosítva: Nov 17, 2022
char buff[3];
for(size_t i=0; i < len; i++) {
sprintf(buff, "%02x ", (uint8_t) data[i]);
msg += buff ;
}
Kijavitva a buff[3], buff[4] -re, vagy a "%02x " -ből kitörölve a szoközt már nem ad vissza hibát.
Az „snprintf” és „fprintf” nem muködik.
De most az OneWire könyvtár nem tetszik neki
Időközbe újbol letöltöttem az OneWire -t, ami már nem teljesen ugyanaz és azzal már megy.
Sziasztok! Egy esp32-vel hajtok meg egy GY-PCM5102-es DAC-ot Arduinó idét használva. A problémám az, hogy olyan mintha csak 8 bites módban menne. Tehát van hangja, de olyan, mint egy régi dallamcsengőnek, nagyon sok felharmonikussal...
A kód ami meghajtja: void i2s_install() {
// Set up I2S Processor configuration
const i2s_config_t i2s_config = {
.mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_TX),
.sample_rate = 48000,
.bits_per_sample = i2s_bits_per_sample_t(16),
.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
// .communication_format = ( i2s_comm_format_t )( I2S_COMM_FORMAT_STAND_MSB ),
.communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S_MSB | I2S_COMM_FORMAT_I2S_LSB),
//.communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S),
.intr_alloc_flags = 0,
.dma_buf_count = 32,
.dma_buf_len = bufferLen,
.use_apll = false
};
i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL);
}
illetve az audió bufferemet ezzel a kóddal írom ki:
i2s_write(I2S_PORT, &buffer, buffermeret, &i2s_bytes_write, portMAX_DELAY);
A buffer short típusú.
Több kommunikációs módot is googléztam, olyan érzésem van, mintha csak MSB, vagy LSB módban működne, a kettő együtt nem.
Ez is ugyanazt tudja, talán halkabb:
.communication_format = ( i2s_comm_format_t )(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB)
Mellékelek egy képet a jelalakról.
Segítségeteket előre is köszönöm! A hozzászólás módosítva: Dec 23, 2022
Sin jel helyett adj neki monoton növekvő/csökkenő adatfolyamot. Ott szépen kibukik minden hiba....
Köszi már majdnem jó, a felbontás már tökéletes!
Sajnos még mindig van cserélgetés.
Megvan! Bufferméret feléig kell elmennem a for ciklussal! Tehát fele akkora bufferrel kell dolgoznom, mint amit a DAC használ!
for (int i = 0; i < bufferLen/2-1; i+=2) {
// sBuffer[i] = random(1, 10000);
sBuffer[i]=sinusfg[freqmutato>>22];
sBuffer[i+1]=sinusfg[freqmutato>>22];
freqmutato+=pich+tune;
}
A hozzászólás módosítva: Dec 24, 2022
Duplázd meg a DMA tömböd méretét, mivel 2 Bytes az adat hosszod:
.dma_buf_count = 2,
.dma_buf_len = bufferLen*2, //<<<< Itt Byte-ben kel megadni a méretet 16 bit az 2 Byte
És akkor bele fér az egész tömb, végig játszhatod! Nem kel felezned. A hozzászólás módosítva: Dec 24, 2022
És rakjál sortöréseket az 1024 szám ki íratásába, hogy lássál is valamit:
void sinusinit() {
Serial.print("{");
for (int i = 0; i < FG_SIZE; i++)
{
// sinusfg[i] = sin(i * 4*PI / 2048) * 32767;
sinusfg[i] = sin(i * PI / 512) * 32767;
Serial.print(sinusfg[i]);
Serial.print(", ");
if(i%20) Serial.println(""); // kb. 20 szám elfér egy sorban
}
Serial.println("};");
}
Ezt javítani kell, ha nincs maradék az osztásba:
if((i%20)==0) Serial.println(""); // kb. 20 szám elfér egy sorban
A struktúra létrehozásánál ez el is van magyarázva:
/**
* @brief I2S driver configuration parameters
*
*/
typedef struct {
i2s_mode_t mode; /*!< I2S work mode */
uint32_t sample_rate; /*!< I2S sample rate */
i2s_bits_per_sample_t bits_per_sample; /*!< I2S sample bits in one channel */
i2s_channel_fmt_t channel_format; /*!< I2S channel format.*/
i2s_comm_format_t communication_format; /*!< I2S communication format */
int intr_alloc_flags; /*!< Flags used to allocate the interrupt. One or multiple (ORred) ESP_INTR_FLAG_* values. See esp_intr_alloc.h for more info */
int dma_buf_count; /**< The total number of DMA buffers to receive/transmit data.
* A descriptor includes some information such as buffer address,
* the address of the next descriptor, and the buffer length.
* Since one descriptor points to one buffer, therefore, 'dma_desc_num' can be interpreted as the total number of DMA buffers used to store data from DMA interrupt.
* Notice that these buffers are internal to'i2s_read' and descriptors are created automatically inside of the I2S driver.
* Users only need to set the buffer number while the length is derived from the parameter described below.
*/
int dma_buf_len; /**< Number of frames in a DMA buffer.
* A frame means the data of all channels in a WS cycle.
* The real_dma_buf_size = dma_buf_len * chan_num * bits_per_chan / 8.
* For example, if two channels in stereo mode (i.e., 'channel_format' is set to 'I2S_CHANNEL_FMT_RIGHT_LEFT') are active,
* and each channel transfers 32 bits (i.e., 'bits_per_sample' is set to 'I2S_BITS_PER_CHAN_32BIT'),
* then the total number of bytes of a frame is 'channel_format' * 'bits_per_sample' = 2 * 32 / 8 = 8 bytes.
* We assume that the current 'dma_buf_len' is 100, then the real length of the DMA buffer is 8 * 100 = 800 bytes.
* Note that the length of an internal real DMA buffer shouldn't be greater than 4092.
*/
bool use_apll; /*!< I2S using APLL as main I2S clock, enable it to get accurate clock */
bool tx_desc_auto_clear; /*!< I2S auto clear tx descriptor if there is underflow condition (helps in avoiding noise in case of data unavailability) */
int fixed_mclk; /*!< I2S using fixed MCLK output. If use_apll = true and fixed_mclk > 0, then the clock output for i2s is fixed and equal to the fixed_mclk value. If fixed_mclk set, mclk_multiple won't take effect */
i2s_mclk_multiple_t mclk_multiple; /*!< The multiple of I2S master clock(MCLK) to sample rate */
i2s_bits_per_chan_t bits_per_chan; /*!< I2S total bits in one channel, only take effect when larger than 'bits_per_sample', default '0' means equal to 'bits_per_sample' */
#if SOC_I2S_SUPPORTS_TDM
i2s_channel_t chan_mask; /*!< I2S active channel bit mask, set value in `i2s_channel_t` to enable specific channel, the bit map of active channel can not exceed (0x1<<total_chan). */
uint32_t total_chan; /*!< I2S Total number of channels. If it is smaller than the biggest active channel number, it will be set to this number automatically. */
bool left_align; /*!< Set to enable left alignment */
bool big_edin; /*!< Set to enable big edin */
bool bit_order_msb; /*!< Set to enable msb order */
bool skip_msk; /*!< Set to enable skip mask. If it is enabled, only the data of the enabled channels will be sent, otherwise all data stored in DMA TX buffer will be sent */
#endif // SOC_I2S_SUPPORTS_TDM
} i2s_driver_config_t;
typedef i2s_driver_config_t i2s_config_t; // for backward compatible
Sziasztok!
Van valakinek ötlete hogy miért fagy le az ESP32 véletlen időközönként? Szépen működik aztán váratlan pillanatokban, fogja magát és áramtalanításig lefagy. Semmi különös nincs a programban csak IF-ek, DS18B20-klonok-4drb, i2c LCD, nyomógomb, relé, analóg bemeneten ASC712 áram szenzor.
Relé mit kapcsolgat? Milyen tápegységről üzemel a rendszer? DS18B20 kábelei milen hosszúak? Hol vannak (ha vannak) hidegítő kondenzátorok? Meg úgy egyáltalán, hogyan vannak ezek a dolgok összekötve?
5V/1A tapegység.
1M kábelek a szenzorokon
Kettő darab klima kültéri egységet vezérel- hősszivatyút készítek(leolvasztás, kaszkád, túláram, meg ilyesmi)
Csak úgy vannak össze vissza kötözve egy nyaklapon...(Életveszélyes de egyenlőre erre tellet)
Nem találtam meg az arduino referenciában az általad használt "and" definícióját?
Viszont eredetileg így kellene használnod: Bővebben: Logicaland: &&
if(veletlen==1 && nagyonhiba1==0)mukodj1=1;
Ezek rosszul vannak létrehozva:
long gombidostart,homerskeletido,aramido,elindultido1,elindultido2,comp1startido,comp2startido,defroststartido1,defroststartido2,hp1stopido,hp2stopido,wait,ventstopido1=-10000,ventstopido2=-10000,teljesitmenyido=20;
Bővebben: millis
Helyesen nem előjeles szám kel: unsigned long gombidostart,...
De még így is csak öt napig működhet egyfolytában hiba nélkül!
Bővebben: Link A hozzászólás módosítva: Jan 15, 2023
Az if-ek ben következetesen rosszul használod a feltétel vizsgálatokat!
"or" helyet inkább || kellene. Bővebben: Link
Logical operators
All logical operators exist in C and C++ and can be overloaded in C++, albeit the overloading of the logical AND and logical OR is discouraged, because as overloaded operators they behave as ordinary function calls, which means that both of their operands are evaluated, so they lose their well-used and expected short-circuit evaluation property.[1]
Bővebben: Link
Az and és or macro-k, amik szintén használhatóak a && és || operátorok alternatív megadására, mégha az arduino doksi nem is említi, de a végén egy gcc fordító fordít, ami támogatja:
Bővebben: Link
Sőt még az ördögtől való goto utasítást is elfogadja.
Itt pedig le írják, hogy mi a két módszer között a különbség:
Bővebben: Link
"Járt utat a járatlanért ne hagyd el!"
Akkor lehetséges hogy csak ez a probléma? Ma átírom hátha. De nem fér a fejembe hogy barmikor megtörténhet hogy meg áll. Néha lefagy máskor újra indul. 1-5 órat működik.
Semmi különbség nincs. A macro-kat a preprocesszor dolgozza fel, ami csak annyit csinál, hogy kicseréli a "and" szöveget "&&" szövegre.
#define and &&
#define or ||
Amikor a forditásra kerül sor akkor ott már az and helyett a && fog szerepelni a preprocesszált forrás fileban, pont mintha te irtad volna oda a &&-t, így a kiértékelésben nem lesz semmi különbség. Ez nem operátor overload csak egy egyszerű macro.
Szerintem ezek a helyettesítések több mint veszélyesek!
Pl. az alábbi sorok
.communication_format = ( i2s_comm_format_t )(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB)
command = 0x6B
a C fordítóhoz az alábbi formában jutnak el.
.communication_f||mat = ( i2s_comm_f||mat_t )(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB)
comm&& = 0x6B
A hozzászólás módosítva: Jan 15, 2023
Biztos? Szerintem szó közepén nem cseréli...
|
|