This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

sprintf needs to be reset every 128 characters?

After having a problems with a function using vsnprintf, I finally boiled it down to sprintf. Every 128 characters that has been run through sprintf, it truncates the output.

Steps I used to reproduce it:

* I took the simplest example I could find which used the logging functionality (examples/peripheral/temperature)

* Changed the main function to after printing the temperature, do the following:

        NRF_LOG_INFO("Actual temperature: %d", (int) temp);
        nrf_delay_ms(500);

+        size_t rc = sprintf(buf, "01234567890123456789");
+        NRF_LOG_INFO("Result: %s (%d)", nrf_log_push(buf), rc);

        NRF_LOG_FLUSH();

* (buf is a global char array with size 32)

* Added RTT functionlity to get the logs through Segger RTT

* This resulted in the output to be as follows:

<info> app: Result: 01234567890123456789 (20)
<info> app: Actual temperature: 27
<info> app: Result: 01234567890123456789 (20)
<info> app: Actual temperature: 27
<info> app: Result: 0 (20)
<info> app: Actual temperature: 27
<info> app: Result: 01234567890123456789 (20)
<info> app: Actual temperature: 27
<info> app: Result: 01234567890123456789 (20)
<info> app: Actual temperature: 27
<info> app: Result: 01234567890123456789 (20)
<info> app: Actual temperature: 27
<info> app: Result: 01234567890123456789 (20)
<info> app: Actual temperature: 27
<info> app: Result: 01234567890123456789 (20)
<info> app: Actual temperature: 27
<info> app: Result: 01234567890123456789 (20)
<info> app: Actual temperature: 27
<info> app: Result: 0 (20)
<info> app: Actual temperature: 27
<info> app: Result: 01234567890123456789 (20)
<info> app: Actual temperature: 27
<info> app: Result: 01234567890123456789 (20)
<info> app: Actual temperature: 27

Note that it prints 128 ((20 + \0) * 6 + 1 + \0) characters before truncating, this repeats constantly. It still thinks it printed 20 characters however.

This is on SDK 15.3.0, btw.

Parents
  • Sounds odd to me that the sprintf would be the problem in this case. Your code is printing the same constant 20-byte string in each iteration. What if you modify it so that you call sprintf() only once, outside the main loop. This is to initialize the global buf array with the given data "123...". Then run the same test, i.e. calling NRF_LOG_INFO repeatedly (but not calling sprintf() for each iteration).

    If the test still behaves the same, then the problem must be in the NRF logging system and not in sprintf.

Reply
  • Sounds odd to me that the sprintf would be the problem in this case. Your code is printing the same constant 20-byte string in each iteration. What if you modify it so that you call sprintf() only once, outside the main loop. This is to initialize the global buf array with the given data "123...". Then run the same test, i.e. calling NRF_LOG_INFO repeatedly (but not calling sprintf() for each iteration).

    If the test still behaves the same, then the problem must be in the NRF logging system and not in sprintf.

Children
No Data
Related