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
相关产品推荐
相关产品推荐

