Arduino sprintf会导致时间问题吗?

Arduino sprintf会导致时间问题吗?,arduino,microcontroller,arduino-c++,Arduino,Microcontroller,Arduino C++,我在使用sprintf时遇到了一个perculiar问题 我需要一个字符数组,如下所示:g;cmd;精氨酸;e,其中arg获取前导零,因此它总是3个字符长,cmd获取前导零,因此它总是15个字符长。 例如,如果cmd=20和arg=3749,我需要一个如下所示的字符数组:g;020;000000000003749;e。 arg和cmd都是整数 我最初是以一种非常低效的方式完成这项工作的,但我使用sprintf将其改为更简单的方式,因为我需要更快的代码。我的初始代码和更改都可以找到 我当前的实现如

我在使用sprintf时遇到了一个perculiar问题

我需要一个字符数组,如下所示:
g;cmd;精氨酸;e,其中arg获取前导零,因此它总是3个字符长,cmd获取前导零,因此它总是15个字符长。
例如,如果cmd=20和arg=3749,我需要一个如下所示的字符数组:
g;020;000000000003749;e。
arg和cmd都是整数

我最初是以一种非常低效的方式完成这项工作的,但我使用sprintf将其改为更简单的方式,因为我需要更快的代码。我的初始代码和更改都可以找到

我当前的实现如下所示:

#define cmdMsgLength 3
#define argMsgLength 15
#define totalFormatedMsgLength (2+cmdMsgLength+1+argMsgLength+3)
#define msgFormater "g;%03d;%015d;e;"

char msgToSendFormated[totalFormatedMsgLength];
void sendMsg(int _cmd, int _arg) {
 sprintf(msgToSendFormated, msgFormater, _cmd, _arg);
 Serial.print(msgToSendFormated);
}
这似乎工作得很好,直到我的uC还必须控制4个ESC。老实说,我找不到两者之间的任何关系,但这种实现似乎会导致ESC的问题,当然,时间安排非常重要。ESC的编程正确,但当使用Arduino功能servo.writeMicroseconds启动ESC时,ESC的动作似乎是随机的。经过相当多的测试后,似乎只有对代码的这一更改导致了问题。由于这段代码非常简单,而且旧代码(检查github链接)也使用了Serial.print,我认为sprintf是罪魁祸首


已知sprintf会导致此类计时问题吗?还有其他原因吗?

正如JVApen指出的,sprintf总是写一个空终止符。由于msgToSendFormated不够长,所以我会得到一个溢出。设置字符MsgToSendFormatted[TotalFormattedMsgLength+1]修复了这个问题。

你不是忘记了长度计算中的空终止符吗?@JVApen,在这种情况下需要空终止符吗?sprintf对我来说是新的,但由于代码实际上通过uart发送了我期望的内容,我认为我正确地实现了它。你是说MsgToSendFormatted应该大1个字符吗?据我所知,sprintf会写的,是的,我就是这样saying@JVApen这确实奏效了。我应该多研究一下斯普林特。非常感谢你!如果您所做的只是串行发送,那么只需在一行中使用几个Serial.print语句,然后像一顿饭一样将其发送出去,速度会更快,代码效率也会更高。由于串行数据被缓冲且传输速度较慢,因此实际传输将是相同的,接收器将永远不会知道差异。这将是更多的行,但代码要小得多。sprintf是一个非常昂贵的函数。