If you don’t learn sprintf(), your code will hate you later

Поделиться
HTML-код
  • Опубликовано: 6 янв 2025

Комментарии • 98

  • @ericBcreator
    @ericBcreator Год назад +15

    It is convenient and tidy but keep in mind this method is (a lot) slower than using a bunch of Serial.print commands, as I found out recently when I tried to clean up my new VU meter project code.

    • @kriscurkovic9265
      @kriscurkovic9265 11 месяцев назад +1

      Yeah arrays in general are always quite slow. You have to create 40 bytes on the stack now, then sprintf the new string characters into each slot. If you deconstruct everything into machine instructions it comes out as a lot more processor cycles. Streaming bits onto the serial isn't that computationally heavy.

  • @johnnz4375
    @johnnz4375 3 месяца назад +1

    This is so much clearer than the online Arduino reference that is obviously written by well seasoned programmers and assume that you have solid grasp of the C language.

  • @NotMarkKnopfler
    @NotMarkKnopfler Год назад +7

    Everything said in this video is correct. However, a couple of things to bear in mind: sprintf is a LOT slower than Serial.print. Also, sprintf uses a lot of memory. On things like an Arduino Uno, Nano, or ATTINY85 you may struggle. What I do, to keep my code tidy, is write a function to display the things I want to display using Serial.print. You don't save on lines of code, but you can move those pesky Serial.print lines - which tend to clutter up the code - into their own functions. Which is much neater. It's also easier to remove them when you don't need them any more. So, using the burritos example from the video:
    void displayBurritosInfo(int numberOfBurritos, float temperature)
    {
    Serial.print("The temperature of the ");
    Serial.print(numberOfBurritos);
    Serial.print(" is ");
    Serial.println(temperature);
    }

    • @shadamethyst1258
      @shadamethyst1258 Год назад +2

      Also note that using sprintf is *very strongly* discouraged on non-embedded platforms, because of the risk of overflowing the buffer. The examples in the video could trivially be weaponized if the user had control on the `tempStr` variable

    • @PraveenChintha-j2t
      @PraveenChintha-j2t 5 месяцев назад

      yeah you are true rather you can use string concatenation property

  • @mtraven23
    @mtraven23 2 года назад +4

    a good explanation...but thats still cumbersome. I prefer using the "Streaming.h" library. this allows for c++ style prints:
    Serial

    • @programmingelectronics
      @programmingelectronics  2 года назад +1

      Thanks for adding this Matt! I'll definitely check it out - I do wish the native Serial library just "made it easy" with out having to use the String class. If I could just do... Serial.print("I would like " + numTacos + " please"); Would that be great or what!

  • @jon_raymond
    @jon_raymond 3 года назад +28

    The sub-specifiers are super handy and there isn't very many good explanations of them. A video detailing them would be super helpful.

  • @GaboG85
    @GaboG85 Год назад +1

    The best explanation that u ever seen on RUclips. Loved it!!

  • @iamsparkicus
    @iamsparkicus 3 года назад +3

    Cheers Fella,
    you are an amazing teacher. Love your channel. I am starting to understand things I thought were beyond my intelect!
    Keep 'em coming!

  • @KashifKhan-kw3ez
    @KashifKhan-kw3ez 3 года назад +6

    itoa(), and dtostrf(), function detail explain.please

  • @MN-be7sx
    @MN-be7sx 2 года назад +1

    please make very detailed videos series on sprintf and sub-specifiers

  • @John-qe3ky
    @John-qe3ky 3 года назад +3

    Very nicely explained, please continue with the additional functions.

  • @_GB84
    @_GB84 3 года назад +3

    Brilliant! Great info. I have been struggling with why it wouldn't print %.2f for a large majority of the day and now I know :D, thanks. You mention you have another vid explaining 'dtostrf' but I can't seem to find it. Can you point me in the right direction please? Thanks for your time and effort with your videos, they're super clear!

  • @steventhehistorian
    @steventhehistorian 3 года назад +2

    You have the best Arduino function tutorials. Thank you so much for this content.

  • @MrShanmunir
    @MrShanmunir 2 года назад +1

    great man. Really good explanation.. please do a follow up. Thx

  • @user-su5sq5ib3i
    @user-su5sq5ib3i 2 года назад +1

    Nice explanation just what I hope will work with my microchip pic18f and C language. I'm doing a weather station

    • @programmingelectronics
      @programmingelectronics  2 года назад +1

      Thanks - best of luck in your project!

    • @user-su5sq5ib3i
      @user-su5sq5ib3i 2 года назад +1

      @@programmingelectronics just wanted to give you an update this piece of code that I wrote worked perfect thanks again

    • @programmingelectronics
      @programmingelectronics  2 года назад +1

      @@user-su5sq5ib3i So glad it helped!

  • @dalwinderssi4094
    @dalwinderssi4094 2 года назад +1

    Want know how to read from sd card and print on tft display using arduino uno

  • @DavidRisnik
    @DavidRisnik 2 года назад +1

    congratulations for the class, very explanatory. I'm doing a project using a panel of leds-dot matrix to print texts read by the SD card. How can I include the temperature value read by a sensor (DB1820), in the text sent by reading the SD card? thank you if you can clarify this doubt for me

  • @vikky452
    @vikky452 2 года назад +1

    thank you sir, very good tutorial. plz make such wonderful tutorial.

  • @rossli8621
    @rossli8621 2 года назад +1

    Very nice video!!!

  • @PraveenChintha-j2t
    @PraveenChintha-j2t 5 месяцев назад

    Sir, actually no need to use sprintf rather we can directly use the string concatenation property in serial.print() function

  • @alejandrom72
    @alejandrom72 3 года назад +1

    Nicely explained. Thank you.

  • @redcrafterlppa303
    @redcrafterlppa303 Год назад +1

    This is potentially creating a buffer overrun. As it depends on how long the inserted numbers/strings are. When inserting strings you can never make the buffer big enough since you don't know the length of the dynamic strings at compile time.
    Meaning you would need to allocate the buffer on the heap wasting already limited heap memory on an arduino.
    Also this whole thing is just unnecessary. There is nothing wrong with multiple Serial print statements. In fact it's more efficient.
    There are cases where sprintf makes sense to use. But this isn't one.

  • @sombatmuenphan1555
    @sombatmuenphan1555 2 года назад +1

    Many thank.Excellent explain.

  • @banditboy6444
    @banditboy6444 3 года назад +1

    As always, great vid

  • @ED99LAM
    @ED99LAM Год назад +1

    very useful n informative

  • @JPN76
    @JPN76 3 года назад

    Is it possible to use this to send multiple variable data to another arduino? If so how would you separate it on that side and plug the data into the correct variable on the recieving arduino?

  • @bobowen7861
    @bobowen7861 3 года назад +2

    Very excellent tutorial. You made this simple. Would be very interested in seeing an additional tutorial on using optional sub-specifiers.

  • @bibel2k
    @bibel2k 3 года назад +1

    I'm ‏speechless!
    One of the most annoying things on arduino is to print a long message like you have shown.
    Mind blowing!

  • @Clip7heApex
    @Clip7heApex 3 года назад +1

    Would this work for LCD print?

    • @programmingelectronics
      @programmingelectronics  3 года назад

      I believe LCD print just takes in a string, so that should work. Best of luck!

  • @giorgito3313
    @giorgito3313 2 года назад +1

    Excellent!!

  • @dalwinderssi4094
    @dalwinderssi4094 2 года назад +1

    Yes , I want to buy ,lessions

  • @jslonisch
    @jslonisch 2 года назад +1

    Isn’t it easier just to do it all in one line with Serial.println(String(variable1 + variable2 + ...)). No messing around with a buffer or worrying about if you got the right character specifier to suit your variable.

    • @programmingelectronics
      @programmingelectronics  2 года назад

      Yes, it is way easier using the built in String class...
      www.arduino.cc/reference/en/language/variables/data-types/stringobject/
      There is a fun "controversy" to read up about on whether to use/avoid the String class with Arduino...
      forum.arduino.cc/t/optimizing-memory-without-strings/341158
      I guess I landed on the not side of this but probably not for the right reasons though... A mentor programmer of mine told me to avoid them, so I just took his word for it! I should probably do some more of my own research :)

    • @berndeckenfels
      @berndeckenfels Год назад +3

      This will however be slow as heck as it allocates the string buffer multiple times with the potential to fail at runtime, not good for embedded projects where you need speed and reliability. Much better with a static or stack allocated buffer.

  • @fernandosimonetti6595
    @fernandosimonetti6595 2 года назад +1

    Excelente explicación! Muchas gracias!!!

  • @12DGJB21
    @12DGJB21 Год назад

    Thank you, sprintf looks very useful. Would there be any benefit of using sprintf over the following single line command to print a simple string of text with a variable (i)?
    For example: Serial.println((String)"Relay"+(i+1)+" OFF"); Where the variable i is a numerical value starting at 0.

    • @yo90bosses
      @yo90bosses Год назад

      I know that comment is old but Ill go ahead and reply. Using the string class is never a good idea, in short it has issues due to dynamic memory on memory constrained systems like arduino unos etc. Go ahead and search for "Why not to use string in arduino". Many good videos.

  • @joshuapitong899
    @joshuapitong899 2 года назад

    Really great.✔️ Thanks.🙌

  • @TOMTOM-nh3nl
    @TOMTOM-nh3nl 3 года назад +1

    Thank You

  • @ElIngLopez
    @ElIngLopez 3 года назад

    Great! ... I'd like to print the % sign, how i do this?

  • @ingenierocristian
    @ingenierocristian 3 года назад +1

    Love it, thanks

  • @markadyash
    @markadyash 2 года назад +1

    thanks lot helpful

  • @christiaansteyn4088
    @christiaansteyn4088 2 года назад

    Please do the additional tutorials

  • @МаксимАтанов-ъ9т
    @МаксимАтанов-ъ9т 3 года назад +1

    thanks. I dont found a good explanation of this function in Russia RUclips. Good reason to learn English)

  • @yugalkishor3131
    @yugalkishor3131 3 года назад +1

    Superb

  • @DodgyBrothersEngineering
    @DodgyBrothersEngineering 3 года назад

    This video would have come in real handy just the other day, but better late than never... Would have been nice if you covered the use of the \ as in \"%s\".

  • @clems6989
    @clems6989 5 месяцев назад

    The website will not send me the email needed for signup !!

  • @electronics5449
    @electronics5449 2 года назад +1

    Awesome

  • @berndeckenfels
    @berndeckenfels Год назад

    The function is called snprintf

  • @chrisspencer6502
    @chrisspencer6502 3 года назад +1

    I got caught out by the same thing in Matlab

  • @thunderbolt997
    @thunderbolt997 3 года назад +1

    super!

  • @jason_man
    @jason_man Год назад

    just use String() and + this point

  • @crissd8283
    @crissd8283 Год назад

    This seems inefficient. While the first example may have more lines of code, the second code certainly uses more resources. Using a character array requires the same data to be stored twice. Once in the program and variables and a second time in the character array. Then you are spending time sending that data into that memory location then sending that new memory location to print(). The first example is certainly faster and more efficient.
    I understand that neat looking code is desired but the second example is harder to understand and less efficient. Seems like a bad idea.

  • @lesatkins42
    @lesatkins42 11 месяцев назад

    or you could use Serial.printf(" .... ", var1, var2, ... varn);

  • @semibiotic
    @semibiotic Год назад +1

    It should be snprintf().

  • @xroppa5290
    @xroppa5290 3 года назад

    Top

  • @livetohash6152
    @livetohash6152 8 месяцев назад

    Can we use $"The taco is {tempTaco} degrees"
    ?