У меня возникла проблема при использовании sprintf.
Мне нужно, чтобы массив символов выглядел так: g;cmd;arg;e;
, где arg получает начальные нули, поэтому он всегда имеет длину 3 символа, а cmd получает начальные нули, поэтому он всегда имеет длину 15 символов. Например, если cmd = 20 и arg = 3749, мне нужен массив символов, который выглядит так: g;020;000000000003749;e;
. И arg, и cmd являются целыми числами.
Сначала я сделал это довольно неэффективным способом, но я изменил его на что-то гораздо более простое, используя sprintf, потому что мне нужно было, чтобы мой код был быстрее. И мой исходный код, и мои изменения можно найти на 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 запрограммированы правильно, но при использовании функции Arduino servo.writeMicroseconds для их приведения в действие они, кажется, действуют случайным образом. После довольно большого количества тестов только это изменение в моем коде, похоже, вызывает проблему. Поскольку этот фрагмент кода настолько прост, а старый код (проверьте ссылку на github) также использовал Serial.print, я предполагаю, что виновником является sprintf.
Известно ли, что sprintf вызывает такие проблемы со временем? Может быть что-нибудь еще?