Arduino I2C单次传输字符串长度限制问题咨询
Arduino I2C单次传输字符串长度限制问题
Arduino Wire库的单次I2C传输(从beginTransmission到endTransmission)默认有32字节的缓冲区限制,这就是你只收到32个字符的核心原因。
问题根源
Wire库底层的发送缓冲区txBuffer默认大小为32字节,当你调用Wire.write()发送超过32字节的数据时,超出部分会被直接截断,无法完成发送。你的代码里尝试发送60个字符的字符串,自然只能收到前32个。
解决办法
1. 拆分数据分批次发送
这是最稳妥的通用方案,无需修改库文件:
char I2C_Send_Char[70]; String OtSTR = "12345678901234567890123456789012345678901234567890123456789"; OtSTR.toCharArray(I2C_Send_Char, 70); int totalLen = strlen(I2C_Send_Char); int currentPos = 0; Wire.beginTransmission(83); while (currentPos < totalLen) { // 计算本次可发送的最大长度,不超过缓冲区上限 int sendLen = min(32, totalLen - currentPos); // 发送当前片段 Wire.write(&I2C_Send_Char[currentPos], sendLen); currentPos += sendLen; // 保持I2C连接,避免重复发送起始信号(参数false表示不释放总线) Wire.endTransmission(false); Wire.beginTransmission(83); } // 最后一次传输结束,释放总线 Wire.endTransmission();
2. 修改Wire库缓冲区大小(不推荐)
如果你的项目没有兼容性顾虑,可以修改Wire库的默认缓冲区:
- 找到Arduino安装路径下的
Wire.h文件 - 修改
#define BUFFER_LENGTH 32为更大的值(如64、128) - 注意:部分Arduino硬件的I2C外设本身有硬件缓冲区限制,修改软件缓冲区可能无法突破硬件上限,还可能引发兼容性问题。
接收端配合
接收端需要逻辑处理分批次接收的数据,将多个片段拼接成完整字符串,避免只保留第一批次的内容。
内容的提问来源于stack exchange,提问作者puby
相关产品推荐
相关产品推荐

