Putty: _tkinter.TclError: no display name and no diplay environment variable

博客围绕Putty出现的_tkinter.TclError错误展开,该错误提示无显示名称和显示环境变量,反映了Putty使用中可能遇到的显示相关问题。
你看到的输出: ``` dTest 1: Reading default value... Test 4: send_byte... Timeout: No ACK received! ... Test 2: writing default value... Timeout: No ACK received! ... ``` 这种现象说明两个关键问题: --- ## 🔍 **根本原因分析** ### ❌ 1. **串口通信波特率不匹配(最可能)** 字符 `` 是一个 **无效或乱码字节**,通常是由于 **UART 波特率设置错误** 导致接收端解析错误。 - `` 的 ASCII 编码是 `0xFF`(或显示为不可打印字符) - 出现在字符串开头 → 表示在正常数据前收到了错误字节 - 常见于:MCU 发送时用的是 9600bps,而 PC 接收设成了 115200bps,反之亦然 📌 **结论:你的串口波特率配置和上位机(如串口助手)不一致!** --- ### ❌ 2. **I²C 通信失败导致持续超时** 所有 `"Timeout: No ACK received!"` 都是因为: > 主机发送了设备地址(如 `0xA0` 写 / `0xA1` 读),但从设备没有拉低 SDA 应答(ACK) 这意味着: - AT24C02 没有正确连接 - 或未供电 - 或地址错误 - 或缺少上拉电阻 - 或 WP 引脚被拉高禁止写入 - 或芯片损坏 --- ## ✅ 分步解决方案 --- ### ✅ 第一步:解决 **串口乱码问题**(先让日志可读) #### 📌 确认你的 UART 初始化代码中波特率设置是否正确 ```c USART_InitTypeDef USART_InitStruct; USART_InitStruct.USART_BaudRate = 9600; // 必须与串口助手一致! USART_InitStruct.USART_WordLength = USART_WordLength_8b; USART_InitStruct.USART_StopBits = USART_StopBits_1; USART_InitStruct.USART_Parity = USART_Parity_No; USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; USART_Init(USART1, &USART_InitStruct); USART_Cmd(USART1, ENABLE); ``` #### ✅ 同时检查: | 项目 | 正确值 | |------|--------| | 波特率 | 9600 / 115200(必须两端一致) | | 数据位 | 8 | | 停止位 | 1 | | 校验位 | None | 🔧 **操作建议:** 1. 打开串口助手(XCOM、SSCOM、PuTTY 等) 2. 设置为 `115200, 8N1` 或 `9600, 8N1` —— 和代码里完全一样 3. 重启开发板观察是否还有乱码 ✅ 如果乱码消失 → 输出变成清晰文本 → 可继续调试 I²C --- ### ✅ 第二步:解决 **I²C 无 ACK 问题** 这是你现在最大的障碍。 #### 🔎 为什么总是 "No ACK received"? 因为 `IIC_Wait_Ack()` 函数一直在等待从机拉低 SDA,但始终没等到。 典型调用流程: ```c IIC_Start(); IIC_Send_Byte(AT24C02_ID << 1 | WR); // 发送 0xA0 if (!IIC_Wait_Ack()) { // 等待 ACK ← 卡在这里! printf("Timeout: No ACK received!\r\n"); } ``` --- ## ✅ 彻底排查 I²C 无响应的 7 大原因 | 原因 | 如何检查 | 解决方法 | |------|----------|---------| | 🔴 1. 上拉电阻缺失 | 用万用表测 SCL/SDA 是否空闲时为高电平 | 加 4.7kΩ 上拉到 VCC | | 🔴 2. 地址错误 | 检查 `AT24C02_ID` 是否为 `0x50` | 改成 `#define AT24C02_ID 0x50` | | 🔴 3. WP 引脚悬空或接高 | 查看模块原理图或实物 | 将 WP 接地 | | 🔴 4. 电源异常 | 测量 VCC 是否 3.3V/5V | 检查供电线路 | | 🔴 5. GND 未共地 | MCU 和 EEPROM 没接同一地 | 补一根 GND 线 | | 🔴 6. 引脚定义错误 | 检查 `iic.h` 中的 PIN 是否对应 PB6/PB7 | 修改宏定义 | | 🔴 7. Delay_us() 不准 | 系统时钟未设为 72MHz → 延时不准确 | 确保 `SetSysClock()` 成功执行 | --- ### ✅ 最小测试代码验证 I²C 是否工作 ```c int main(void) { SetSysClock(); // 必须成功设置 72MHz Delay_ms(100); UART_Init(); // 波特率要对 IIC_Init(); while (1) { printf("\r\n--- I2C Test Start ---\r\n"); IIC_Start(); if (IIC_Wait_Ack()) { printf("Error: Bus not idle!\r\n"); // START 前 SDA/SCL 应为高 } IIC_Send_Byte(0xA0); // AT24C02 写地址 if (IIC_Wait_Ack()) { printf("✅ Device responded with ACK!\r\n"); } else { printf("❌ No ACK - Check wiring, power, pull-ups!\r\n"); } IIC_Stop(); Delay_ms(1000); } } ``` 如果这个都收不到 ACK → 肯定是硬件问题! --- ## ✅ 使用工具辅助诊断 ### 工具 1:逻辑分析仪(推荐) - 抓取 SCL 和 SDA 波形 - 查看是否有 START、ADDR、ACK - 判断是否真的发出了 `0xA0` ### 工具 2:示波器 - 观察 SCL/SDA 是否能拉高(判断上拉) - 检查上升沿是否陡峭(无上拉会缓慢上升) ### 工具 3:万用表 - 测 VCC ≈ 3.3V 或 5V - 测 GND 连通 - 测 SCL/SDA 对地电阻 ≈ 4.7kΩ(有上拉) --- ## ✅ 常见场景举例 | 现象 | 可能原因 | |------|----------| | 所有测试都失败 + 乱码 | 串口波特率错 + I²C 硬件问题 | | 有时能读、不能写 | WP 引脚接高 | | 发送地址后立即超时 | 地址错误或总线卡死 | | 读写偶尔成功 | 上拉电阻太弱或接触不良 | --- ## ✅ 总结:你现在应该怎么做? ### ✅ Step 1: 固定串口波特率 - 设为 `115200` 或 `9600`,确保 PC 端一致 - 清除乱码干扰,获得清晰日志 ### ✅ Step 2: 检查硬件连接 - ✅ 加 4.7kΩ 上拉电阻(SCL → VCC, SDA → VCC) - ✅ WP 引脚接地 - ✅ VCC 正常供电 - ✅ GND 共地 - ✅ 引脚定义正确(PB6=SCL, PB7=SDA) ### ✅ Step 3: 修改头文件中的函数名 ```c // 错误: extern void AT24C08_WriteByte(...); // 正确: extern void AT24C02_WriteByte(uint8_t addr, uint8_t data); ``` ### ✅ Step 4: 使用最小测试程序验证 ACK 只有当你能看到 `✅ Device responded with ACK!`,才能进行下一步读写测试。 --- ##
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值