You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino:整数转字节数组并通过LoRa发送的实现问题

解决LoRa发送10字节ASCII格式整数计数的问题

问题根源

你用String.toCharArray()的方式存在缺陷:这个方法只会把字符串的字符加上**字符串终止符'\0'**填充到数组里,剩下的数组元素不会自动设为0,所以接收端只能看到有效数字加一个终止符,后续字节是未初始化的垃圾值,完全不符合你要补0的需求。

两种优雅的解决方案

核心思路是:手动把整数的每一位转成ASCII字符填充到数组,然后将剩余位置明确设为0。

方法1:基于String的改进实现

先把整数转成字符串,逐个复制字符到数组,剩余位置依赖数组初始化自动补0:

void sendMessage(byte payload[], int length) {  
  int iPt = 552;
  String sPt = String(iPt);
  byte aPt[10] = {0}; // 初始化时直接把所有元素设为0
  
  // 把字符串的每个字符复制到数组,最多填10个位置
  for (int i = 0; i < sPt.length() && i < 10; i++) {
    aPt[i] = sPt.charAt(i);
  }
  
  LoRa.beginPacket();   
  LoRa.write(aPt, 10);
  LoRa.write(payload, length);
  LoRa.endPacket();  
}

方法2:直接数字逐位提取(无需String,更省内存)

如果想避免使用String类(适合资源有限的单片机),可以直接对整数做数学运算提取每一位:

void sendMessage(byte payload[], int length) {  
  int iPt = 552;
  byte aPt[10] = {0};
  int num = iPt;
  int digitIndex = 0;
  
  // 处理数字为0的特殊情况
  if (num == 0) {
    aPt[0] = '0';
  } else {
    // 先提取所有数字(会得到逆序的结果)
    while (num > 0 && digitIndex < 10) {
      int digit = num % 10;
      aPt[digitIndex] = '0' + digit; // 转成对应ASCII字符
      num = num / 10;
      digitIndex++;
    }
    // 反转数组,恢复数字的正确顺序
    for (int i = 0; i < digitIndex / 2; i++) {
      byte temp = aPt[i];
      aPt[i] = aPt[digitIndex - 1 - i];
      aPt[digitIndex - 1 - i] = temp;
    }
  }
  
  LoRa.beginPacket();   
  LoRa.write(aPt, 10);
  LoRa.write(payload, length);
  LoRa.endPacket();  
}

接收端配套处理示例

接收端读取前10字节后,可通过以下代码还原整数:

int parsePacketCount(byte countBytes[]) {
  String countStr = "";
  for (int i = 0; i < 10; i++) {
    if (countBytes[i] == 0) break; // 遇到0就停止拼接
    countStr += (char)countBytes[i];
  }
  return countStr.toInt();
}

内容的提问来源于stack exchange,提问作者acanessa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:05:23