【问题标题】:Arduino concat char pointerArduino concat 字符指针
【发布时间】:2021-03-26 20:07:42
【问题描述】:

我正在为某事苦苦挣扎很长一段时间,我正在尝试根据一些变量生成 NMEA 消息,现在这些 0,0,0 需要是一个变量,所以我需要将我的变量连接到这个消息字符指针。有什么建议吗?

char * message = "$CONFI,0,0,0";
Serial.println(generateChecksum(message),HEX);

int generateChecksum(char *nmea_data)
{
    int crc = 0;
    int i;

    // ignore the first $ sign,  no checksum in sentence
    for (i = 1; i < strlen(nmea_data); i ++) { // removed the - 3 because no cksum is present
        crc ^= nmea_data[i];
    }

    return crc;
}

【问题讨论】:

  • 不使用指针和文字字符串是好的开始。也许改用 Arduino 标准 String 类。
  • 谢谢,虽然我阅读了整个互联网以避免使用字符串类,因为他们使用了相当多的 Arduino,我也不知道如何生成我的 CRC。
  • @Someprogrammerdude String 类臃肿且浪费。因为这个,我从来没有使用过它。事实上,我从来没有为 Arduino 使用过任何库。即使在 STM32 上,我也更喜欢直接寄存器编程,也许还有 LL 调用。但从来没有 HAL。抽象=浪费,当空间很重要时,通常不能容忍浪费。我敢打赌,大多数拥有嵌入式设计专利的设计师(就像我一样)都会同意。

标签: c++ arduino char nmea


【解决方案1】:

这是在 C 中执行此操作的一种非常标准的方法。使用 sprintf 格式化字符串,但使用不应超出缓冲区的版本,并使用从闪存而不是 RAM 获取格式字符串的版本:

#include <stdio.h>

#define NEMASIZE  30
char nemamessage[NEMASIZE+1];
... etc ...
n = snprintf_P(nemamessage, NEMASIZE, F("$CONFI,%d,%d,%d"), a, b, c);
// now check n!!

这是在 AVR libc 库中:https://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html

而且我不知道 NEMA 字符串有多大,因此请根据需要进行调整! :-)

【讨论】:

    猜你喜欢
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多