导致时间问题的sprintf?

问题描述

我在使用sprintf时遇到问题。

我需要一个char数组看起来像这样:g;cmd;arg;e;,其中arg的前导零,所以它总是3个字符,而cmd的前导零,所以它总是15个字符。 例如,如果cmd = 20且arg = 3749,则需要一个如下所示的char数组:g;020;000000000003749;e;。 arg和cmd都是整数。

起初,我以相当低效的方式完成了此操作,但是我使用sprintf将其更改为更简单的方法,因为我需要更快的代码。我的初始代码和更改都可以在on github中找到。

我当前的实现如下:

#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激活它们时,它们似乎是随机动作的。经过大量的测试,似乎只有我的代码更改才引起此问题。由于这段代码非常简单,旧代码(请检查github链接)也使用了Serial.print,因此我认为sprintf是罪魁祸首。

是否已知sprintf会导致此类计时问题?还可以吗?

解决方法

正如JVApen指出的那样,sprintf总是写一个空终止符。由于msgToSendFormated不够长,所以我会溢出。设置char msgToSendFormated[totalFormatedMsgLength + 1];可解决此问题。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...