Sprintf 没有打印行中的所有内容 (Arduino)
Sprintf is not printing everything in the line (Arduino)
我用arduino做了一个小模型飞机,现在想在串口监视器上做一个简单的FCS页面。我使用 printf 在一行中打印所有变量,但它并没有在 printf 行中打印所有内容。
char buf[150];
sprintf(buf, "\t LEFT \t RIGHT \n AIL \t %d \t %d \n STAB \t %d \t %d \n TEF \t %d \t %t \n LEF \t %d \t %d \n RUD \t %d \n\n SPD %f KTS %f M \n AOA %f", leftAilPos, rightAilPos, leftStabPos, rightStabPos, TEFPos, TEFPos, LEFPos, LEFPos, RuddPos, Spd, AoA);
Serial.println(buf);
我认为这会打印出如下内容:
Left Right
AIL 20 -15
STAB 12 12
TEF 5 5
LEF 3 3
RUD 0
SPD 250KTS 0.37M
AOA 3.5
但是,在串口监视器上,只打印前几行:
Left Right
AIL 20 -15
STAB 12 12
TEF 5
我做错了什么或遗漏了什么吗?
您的代码绝对没问题。您没有考虑的是串口缓冲区大小,它仅为 64 字节。任何比这更大的东西都会被截断。
因此,您需要将数据分成两部分才能成功通过串口发送。
否则您可以通过更改 Arduino 核心库文件来修改串行缓冲区的大小。
更新:在较新版本的 Arduino IDE 中,他们更改了 SERIAL_BUFFER_SIZE
的位置
这是我的代码片段
[Local Drive](C:)\[Installation Path](Program Files (x86))\Arduino\hardware\arduino\avr\cores\arduino
在文件中 USBAPI.h
#ifndef SERIAL_BUFFER_SIZE
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_BUFFER_SIZE 16
#else
#define SERIAL_BUFFER_SIZE 64
#endif
#endif
#if (SERIAL_BUFFER_SIZE>256)
#error Please lower the CDC Buffer size
#endif
改为
#ifndef SERIAL_BUFFER_SIZE
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_BUFFER_SIZE 16
#else
#define SERIAL_BUFFER_SIZE 256
#endif
#endif
#if (SERIAL_BUFFER_SIZE>256)
#error Please lower the CDC Buffer size
#endif
注意:不要增加超过 256 字节,因为存在一些问题并且串行端口的行为往往不稳定。
因为你只是打印到串行,你最好的办法是完全删除 sprintf 并简单地使用一堆 Serial.print 和 Serial.println 语句。代码将在页面上占用更多行,但实际上会小很多,因为您不必引入 sprintf,这是一个巨大的功能。这样也更有效率, sprintf 是一个昂贵的功能。该行另一端的任何内容都无法知道您是用一行打印还是用一百万 Serial.print 每个字母打印。串行输出经过缓冲,因此就接收器而言没有区别。
所以我意识到我的错误在哪里,我在这里的一个变量中输入了 %t 而不是 %d;
TEF \t %d \t %t \n
这并没有作为错误弹出,但有点停止显示该行的其余部分。现在修复这个实际上显示了一切。
感谢其他所有人的帮助,我实际上仍会使用其中一些解决方案,希望能使我的程序更高效。
我用arduino做了一个小模型飞机,现在想在串口监视器上做一个简单的FCS页面。我使用 printf 在一行中打印所有变量,但它并没有在 printf 行中打印所有内容。
char buf[150];
sprintf(buf, "\t LEFT \t RIGHT \n AIL \t %d \t %d \n STAB \t %d \t %d \n TEF \t %d \t %t \n LEF \t %d \t %d \n RUD \t %d \n\n SPD %f KTS %f M \n AOA %f", leftAilPos, rightAilPos, leftStabPos, rightStabPos, TEFPos, TEFPos, LEFPos, LEFPos, RuddPos, Spd, AoA);
Serial.println(buf);
我认为这会打印出如下内容:
Left Right
AIL 20 -15
STAB 12 12
TEF 5 5
LEF 3 3
RUD 0
SPD 250KTS 0.37M
AOA 3.5
但是,在串口监视器上,只打印前几行:
Left Right
AIL 20 -15
STAB 12 12
TEF 5
我做错了什么或遗漏了什么吗?
您的代码绝对没问题。您没有考虑的是串口缓冲区大小,它仅为 64 字节。任何比这更大的东西都会被截断。 因此,您需要将数据分成两部分才能成功通过串口发送。
否则您可以通过更改 Arduino 核心库文件来修改串行缓冲区的大小。
更新:在较新版本的 Arduino IDE 中,他们更改了 SERIAL_BUFFER_SIZE
这是我的代码片段
[Local Drive](C:)\[Installation Path](Program Files (x86))\Arduino\hardware\arduino\avr\cores\arduino
在文件中 USBAPI.h
#ifndef SERIAL_BUFFER_SIZE
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_BUFFER_SIZE 16
#else
#define SERIAL_BUFFER_SIZE 64
#endif
#endif
#if (SERIAL_BUFFER_SIZE>256)
#error Please lower the CDC Buffer size
#endif
改为
#ifndef SERIAL_BUFFER_SIZE
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_BUFFER_SIZE 16
#else
#define SERIAL_BUFFER_SIZE 256
#endif
#endif
#if (SERIAL_BUFFER_SIZE>256)
#error Please lower the CDC Buffer size
#endif
注意:不要增加超过 256 字节,因为存在一些问题并且串行端口的行为往往不稳定。
因为你只是打印到串行,你最好的办法是完全删除 sprintf 并简单地使用一堆 Serial.print 和 Serial.println 语句。代码将在页面上占用更多行,但实际上会小很多,因为您不必引入 sprintf,这是一个巨大的功能。这样也更有效率, sprintf 是一个昂贵的功能。该行另一端的任何内容都无法知道您是用一行打印还是用一百万 Serial.print 每个字母打印。串行输出经过缓冲,因此就接收器而言没有区别。
所以我意识到我的错误在哪里,我在这里的一个变量中输入了 %t 而不是 %d;
TEF \t %d \t %t \n
这并没有作为错误弹出,但有点停止显示该行的其余部分。现在修复这个实际上显示了一切。
感谢其他所有人的帮助,我实际上仍会使用其中一些解决方案,希望能使我的程序更高效。