DEV Community

Cover image for ການໃຊ້ງານ Serial.printf() function ໃນ PlatformIO
xang pheresakha
xang pheresakha

Posted on

ການໃຊ້ງານ Serial.printf() function ໃນ PlatformIO

ການພັດທະນາ program ໃນ Arduino platform ສິ່ງທີ່ຂາດບໍ່ໄດ້ຄືການ debug ເບິ່ງຄ່າຕ່າງໆ. ບໍ່ວ່າຈະເປັນ sensor, ການຄຳນວນ ເປັນຕົ້ນ ແລະ ສິ່ງທີ່ເຮົາໃຊ້ສະແດງຄ່າພວກນັ້ນກໍ່ຄື Serial ນັ້ນເອງ.

ຫ້າມ serial print ຂໍ້ຄວາມ ໄປ main memory ເດັດຂາດດດ ມັນເປັນບາບ!

ຫຼາຍຄົນອາດໃຊ້ serial.print("message") ເຊິ່ງມັນກໍ່ບໍ່ມີບັນຫາຫຍັງເຮັດວຽກໄດ້ປົກກະຕິແຕ່ວ່າມັນຈະມີບັນຫາຖ້າ program ທີ່ເຮົາກຳລັງພັດທະນານັ້ນເປັນ project ໃຫຍ່ມີການເກັບຂໍ້ມູນໄວ້ memory ຂອງ mcu ເປັນຈຳນວນຫຼາຍເພື່ອໃຊ້ໃນການຄຳນວນ ຫຼື ຮັບ response ຈາກ server ແລະ board ທີ່ເຮົາເລືອກໃຊ້ມີຄວາມຈຳໜ້ອຍຍຍຍ 2kb ຫຍັງກໍ່ວ່າກັນໄປ ເຊິ່ງກໍລະນີນີ້ອາດເຮັດໃຫ້ເກີດ memory overflow ໄດ້. ສະນັ້ນປ່ຽນມາໃຊ້ຄວາມຈຳອື່ນແທນນັ້ນກໍ່ຄື flash memory ງ່າຍໆພຽງແຕ່ໃຊ້ F("message") ແບບນີ້:

serial.print(F("message"))
Enter fullscreen mode Exit fullscreen mode

ພຽງເທົ່ານີ້ message ຕ່າງໆຂອງ Serial ກໍ່ຈະປ່ຽນໄປໃຊ້ flash memory ແທນແລ້ວວ ຫຼຸດການໃຊ້ main memory ໄປໄດ້ຫຼາຍເລີຍ!

ເພີ່ມ Serial.printf() ເພື່ອຄວາມຫຼໍ່!

ຫຼາຍຄົນເຄີຍຂຽນຫຼາຍພາສາ ແລະ ມັກຈະມີ printf ໄວ້ໃຫ້ເຮົາ formate message ໃຫ້ອ່ານງ່າຍ ສະນັ້ນເພື່ອຄວາມຫຼໍໍ່ເຮົາກໍ່ເລີຍຕ້ອງການເຮັດແບບນີ້ກັບ Serial class ຂອງ arduino ເຊິ່ງໂດຍປົກກະຕິແລ້ວວ ບໍ່ມີ build-in ມາໃຫ້. ໃນການເພີ່ມເຮົາກໍ່ທຳການແກ້ໄຂ້ Print.h ທີ່ຢູ່ໃນ arduino platform ຫຼື platformIO ໄດ້ເລີຍ.
ສຳລັບ PlatformIO ເຂົ້າໄປທີ່ ~/.platformio/packages/framework-arduino-avr/cores/arduino ແລະ ຫາ Print.h ເພື່ອແກ້ໄຂ້. ໂດຍການເພີ່ມ code ຕໍ່ໄປນີ້ຕໍ່ທ້າຍພາຍໃນ public section

#include <stdarg.h>
#define PRINTF_BUF 80 // define the tmp buffer size (change if desired)
   void printf(const char *format, ...)
   {
   char buf[PRINTF_BUF];
   va_list ap;
        va_start(ap, format);
        vsnprintf(buf, sizeof(buf), format, ap);
        for(char *p = &buf[0]; *p; p++) // emulate cooked mode for newlines
        {
                if(*p == '\n')
                        write('\r');
                write(*p);
        }
        va_end(ap);
   }
#ifdef F // check to see if F() macro is available
   void printf(const __FlashStringHelper *format, ...)
   {
   char buf[PRINTF_BUF];
   va_list ap;
        va_start(ap, format);
#ifdef __AVR__
        vsnprintf_P(buf, sizeof(buf), (const char *)format, ap); // progmem for AVR
#else
        vsnprintf(buf, sizeof(buf), (const char *)format, ap); // for the rest of the world
#endif
        for(char *p = &buf[0]; *p; p++) // emulate cooked mode for newlines
        {
                if(*p == '\n')
                        write('\r');
                write(*p);
        }
        va_end(ap);
   }
#endif
Enter fullscreen mode Exit fullscreen mode

ພຽງເທົ່ານີ້ເຮົາກໍ່ສາມາດໃຊ້ງານ printf ໄດ້ແລ້ວ

Serial.printf(F("%s\n"), mst.mac);
Enter fullscreen mode Exit fullscreen mode

ຂໍ້ຈົບບົດຄວາມໄວ້ເທົ່ານີ້ ໄວ້ມີໂອກາດມາແຊກັນໃຫມ່!

Discussion (0)