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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 00:29:53