ATTiny85串口传4位数字经ATTiny45中转至树莓派无法正常接收问题
问题根因与修复方案
核心错误1:ATTiny45转发逻辑错误
ATTiny85调用println(c1)时,会先将整数转换为对应ASCII字符串输出,比如发送1234时实际输出的是'1'、'2'、'3'、'4'、'\r'、'\n'6个字节的ASCII码。
而ATTiny45中fromA85.read()返回的是单字节的ASCII码数值(比如读到'1'返回整数49),你直接调用toRip.println(整数值)会把这个ASCII数值再转一次十进制字符串输出,相当于做了两次数值转字符串操作,原始数据完全被篡改。
比如发送1234时,ATTiny45处理后输出的数据会变成"49\r\n50\r\n51\r\n52\r\n13\r\n10\r\n",数据量翻倍还多。3位数字时数据量小还能勉强适配缓存,4位数字时数据量超过ATTiny软串口的小缓存,就会出现溢出、丢包、乱码。
核心错误2:树莓派代码存在语法/配置错误
- 串口路径缺少根路径斜杠,
dev/serial0需改为/dev/serial0 - 停止位参数拼写错误,
STOPBITS_ON需改为STOPBITS_ONE - 参数定义行末尾缺少逗号,语法不完整
修复后的代码
ATTiny45修改部分
仅需修改loop逻辑,改为直接透传原始字节即可:
void loop() { if (fromA85.available()){ char recv_char = fromA85.read(); toRip.write(recv_char); // 直接输出原始字节,不要转成整数字符串 } }
树莓派修改后完整代码
import serial ser = serial.Serial( '/dev/serial0', 9600, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=1 ) while True: data = ser.readline() if data: print(data.decode('utf-8').strip())
ATTiny85修改部分
仅需把c1的赋值改为你需要的4位整数即可:int c1 = 1234;
内容的提问来源于stack exchange,提问作者user5128720
相关产品推荐
相关产品推荐

