Fórum témák

» Több friss téma
Lapozás: OK   123 / 138
(#) andyka hozzászólása Nov 16, 2022 /
 
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?
  1. void onWsEvent(AsyncWebSocket*, AsyncWebSocketClient*, AwsEventType, void*, uint8_t*, size_t)':
  2.  
  3. error: 'sprintf' writing a terminating nul past the end of the destination [-Werror=format-overflow=]
  4.         for(size_t i=0; i < info->len; i++){ sprintf(buff, "%02x ", (uint8_t) data[i]);
  5.  
  6. note: 'sprintf' output 4 bytes into a destination of size 3
  7.        for(size_t i=0; i < info->len; i++){ sprintf(buff, "%02x ", (uint8_t) data[i]);
  8.  
  9. error: 'sprintf' writing a terminating nul past the end of the destination [-Werror=format-overflow=]
  10.         for(size_t i=0; i < len; i++){ sprintf(buff, "%02x ", (uint8_t) data[i]);
  11.        
  12.  note: 'sprintf' output 4 bytes into a destination of size 3
  13.         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
(#) asch válasza andyka hozzászólására (») Nov 16, 2022 / 1
 
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.
(#) andyka válasza asch hozzászólására (») Nov 17, 2022 /
 
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)”
(#) asch válasza andyka hozzászólására (») Nov 17, 2022 / 1
 
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
(#) andyka válasza asch hozzászólására (») Nov 17, 2022 /
 
  1. char buff[3];
  2.         for(size_t i=0; i < len; i++) {
  3.           sprintf(buff, "%02x ", (uint8_t) data[i]);
  4.           msg += buff ;
  5.         }

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
(#) andyka válasza andyka hozzászólására (») Nov 17, 2022 /
 
Időközbe újbol letöltöttem az OneWire -t, ami már nem teljesen ugyanaz és azzal már megy.
(#) Rober_4 hozzászólása Dec 23, 2022 /
 
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:
  1. void i2s_install() {
  2.   // Set up I2S Processor configuration
  3.   const i2s_config_t i2s_config = {
  4.     .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_TX),
  5.     .sample_rate = 48000,
  6.     .bits_per_sample = i2s_bits_per_sample_t(16),
  7.     .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,
  8.    // .communication_format =  ( i2s_comm_format_t )( I2S_COMM_FORMAT_STAND_MSB ),
  9.     .communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S_MSB | I2S_COMM_FORMAT_I2S_LSB),
  10.     //.communication_format = (i2s_comm_format_t)(I2S_COMM_FORMAT_I2S),
  11.     .intr_alloc_flags = 0,
  12.     .dma_buf_count = 32,
  13.     .dma_buf_len = bufferLen,
  14.     .use_apll = false
  15.   };
  16.   i2s_driver_install(I2S_PORT, &i2s_config, 0, NULL);
  17.   }

illetve az audió bufferemet ezzel a kóddal írom ki:
  1. 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:
  1. .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

jelalakn.png
    
(#) sdrlab válasza Rober_4 hozzászólására (») Dec 23, 2022 / 1
 
Sin jel helyett adj neki monoton növekvő/csökkenő adatfolyamot. Ott szépen kibukik minden hiba....
(#) Rober_4 válasza sdrlab hozzászólására (») Dec 24, 2022 /
 
Köszi már majdnem jó, a felbontás már tökéletes!
Sajnos még mindig van cserélgetés.
(#) Rober_4 válasza Rober_4 hozzászólására (») Dec 24, 2022 /
 
Megvan! Bufferméret feléig kell elmennem a for ciklussal! Tehát fele akkora bufferrel kell dolgoznom, mint amit a DAC használ!
  1. for (int i = 0; i < bufferLen/2-1; i+=2) {
  2.    // sBuffer[i] = random(1, 10000);  
  3.      sBuffer[i]=sinusfg[freqmutato>>22];
  4.      sBuffer[i+1]=sinusfg[freqmutato>>22];      
  5.     freqmutato+=pich+tune;
  6.   }
A hozzászólás módosítva: Dec 24, 2022
(#) kapu48 válasza Rober_4 hozzászólására (») Dec 24, 2022 /
 
Duplázd meg a DMA tömböd méretét, mivel 2 Bytes az adat hosszod:
  1. .dma_buf_count = 2,
  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
(#) kapu48 válasza Rober_4 hozzászólására (») Dec 24, 2022 /
 
És rakjál sortöréseket az 1024 szám ki íratásába, hogy lássál is valamit:
  1. void sinusinit() {
  2.   Serial.print("{");
  3.   for (int i = 0; i < FG_SIZE; i++)
  4.   {
  5.    // sinusfg[i] = sin(i *  4*PI / 2048) * 32767;
  6.     sinusfg[i] = sin(i *  PI / 512) * 32767;  
  7.     Serial.print(sinusfg[i]);
  8.     Serial.print(", ");
  9.     if(i%20) Serial.println("");       // kb. 20 szám elfér egy sorban
  10.   }
  11.   Serial.println("};");
  12. }
(#) kapu48 válasza kapu48 hozzászólására (») Dec 24, 2022 /
 
Ezt javítani kell, ha nincs maradék az osztásba:
  1. if((i%20)==0) Serial.println("");       // kb. 20 szám elfér egy sorban
(#) kapu48 válasza kapu48 hozzászólására (») Dec 24, 2022 /
 
A struktúra létrehozásánál ez el is van magyarázva:
  1. /**
  2.  * @brief I2S driver configuration parameters
  3.  *
  4.  */
  5. typedef struct {
  6.  
  7.     i2s_mode_t              mode;                       /*!< I2S work mode */
  8.     uint32_t                sample_rate;                /*!< I2S sample rate */
  9.     i2s_bits_per_sample_t   bits_per_sample;            /*!< I2S sample bits in one channel */
  10.     i2s_channel_fmt_t       channel_format;             /*!< I2S channel format.*/
  11.     i2s_comm_format_t       communication_format;       /*!< I2S communication format */
  12.     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 */
  13.     int                     dma_buf_count;              /**< The total number of DMA buffers to receive/transmit data.
  14.                                                           * A descriptor includes some information such as buffer address,
  15.                                                           * the address of the next descriptor, and the buffer length.
  16.                                                           * 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.
  17.                                                           * Notice that these buffers are internal to'i2s_read' and descriptors are created automatically inside of the I2S driver.
  18.                                                           * Users only need to set the buffer number while the length is derived from the parameter described below.
  19.                                                           */
  20.     int                     dma_buf_len;                /**< Number of frames in a DMA buffer.
  21.                                                           *  A frame means the data of all channels in a WS cycle.
  22.                                                           *  The real_dma_buf_size = dma_buf_len * chan_num * bits_per_chan / 8.
  23.                                                           *  For example, if two channels in stereo mode (i.e., 'channel_format' is set to 'I2S_CHANNEL_FMT_RIGHT_LEFT') are active,
  24.                                                           *  and each channel transfers 32 bits (i.e., 'bits_per_sample' is set to 'I2S_BITS_PER_CHAN_32BIT'),
  25.                                                           *  then the total number of bytes of a frame is 'channel_format' * 'bits_per_sample' = 2 * 32 / 8 = 8 bytes.
  26.                                                           *  We assume that the current 'dma_buf_len' is 100, then the real length of the DMA buffer is 8 * 100 = 800 bytes.
  27.                                                           *  Note that the length of an internal real DMA buffer shouldn't be greater than 4092.
  28.                                                           */
  29.     bool                    use_apll;                   /*!< I2S using APLL as main I2S clock, enable it to get accurate clock */
  30.     bool                    tx_desc_auto_clear;         /*!< I2S auto clear tx descriptor if there is underflow condition (helps in avoiding noise in case of data unavailability) */
  31.     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 */
  32.     i2s_mclk_multiple_t     mclk_multiple;              /*!< The multiple of I2S master clock(MCLK) to sample rate */
  33.     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' */
  34.  
  35. #if SOC_I2S_SUPPORTS_TDM
  36.     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). */
  37.     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. */
  38.     bool                    left_align;                 /*!< Set to enable left alignment */
  39.     bool                    big_edin;                   /*!< Set to enable big edin */
  40.     bool                    bit_order_msb;              /*!< Set to enable msb order */
  41.     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 */
  42. #endif // SOC_I2S_SUPPORTS_TDM
  43.  
  44. } i2s_driver_config_t;
  45.  
  46. typedef i2s_driver_config_t i2s_config_t;       // for backward compatible
(#) luluzulu hozzászólása Jan 14, 2023 /
 
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.
(#) Bakman válasza luluzulu hozzászólására (») Jan 14, 2023 /
 
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?
(#) luluzulu válasza Bakman hozzászólására (») Jan 14, 2023 /
 
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)
(#) kapu48 válasza luluzulu hozzászólására (») Jan 15, 2023 /
 
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: &&
  1. if(veletlen==1 && nagyonhiba1==0)mukodj1=1;
(#) kapu48 válasza luluzulu hozzászólására (») Jan 15, 2023 /
 
Ezek rosszul vannak létrehozva:
  1. 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:
  1. 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
(#) kapu48 válasza luluzulu hozzászólására (») 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
(#) kapu48 válasza luluzulu hozzászólására (») Jan 15, 2023 /
 
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
(#) majkimester válasza kapu48 hozzászólására (») Jan 15, 2023 / 1
 
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
(#) GPeti1977 válasza majkimester hozzászólására (») Jan 15, 2023 /
 
Sőt még az ördögtől való goto utasítást is elfogadja.
(#) kapu48 válasza majkimester hozzászólására (») Jan 15, 2023 /
 
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!"
(#) luluzulu hozzászólása Jan 15, 2023 /
 
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.
(#) majkimester válasza kapu48 hozzászólására (») Jan 15, 2023 /
 
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.

  1. #define and     &&
  2. #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.
(#) kapu48 válasza luluzulu hozzászólására (») Jan 15, 2023 /
 
Inkább az itt jelzett hibát javíts ki: Bővebben: Link
(#) Hp41C válasza majkimester hozzászólására (») Jan 15, 2023 /
 
Szerintem ezek a helyettesítések több mint veszélyesek!
Pl. az alábbi sorok
  1. .communication_format =  ( i2s_comm_format_t )(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB)
  2. command = 0x6B

a C fordítóhoz az alábbi formában jutnak el.
  1. .communication_f||mat =  ( i2s_comm_f||mat_t )(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB)
  2. comm&& = 0x6B
A hozzászólás módosítva: Jan 15, 2023
(#) luluzulu válasza kapu48 hozzászólására (») Jan 15, 2023 /
 
Azt már megcsináltam
(#) pipi válasza Hp41C hozzászólására (») Jan 15, 2023 /
 
Biztos? Szerintem szó közepén nem cseréli...
Következő: »»   123 / 138
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem