RPi4使用GSM modem发送TCP数据时混入Pi登录提示符问题
问题描述
在树莓派4上使用GSM模块与远程服务器建立TCP连接时,连接成功,但发送的消息中混入了树莓派的登录提示符(garage login: Password:),导致服务器收到的内容混乱。
相关代码
ser = serial.Serial('/dev/ttyS0', 115200) ser.write((f'AT+CIPOPEN=0,"TCP","{config.server_host}",{config.server_port}').encode()) ser.write(b'AT+CIPSEND=0,') time.sleep(5) ser.write(b'GET / HTTP/1.1\r\n') ser.write(b'\x1A')
服务器接收内容
connection from ('x.x.x.x', yyyyy) received b'\r\n\r\n>garage logi' received b'n: Password: GET' received b' / HTTP/1.1\r\r\n' no more data from ('x.x.x.x', yyyyy)
已尝试ser.reset_input_buffer()、ser.reset_output_buffer()及调整sleep时长,均无效果。
问题原因与解决办法
问题原因
树莓派默认将ttyS0端口配置为串口控制台,系统的getty服务会持续在这个串口输出登录提示符(login: Password:)。而你的GSM模块正好使用ttyS0进行串口通信,这些系统输出的内容会和你发送的AT命令、数据一起被GSM模块转发到远程服务器,导致内容混入。
解决步骤
禁用串口控制台服务
- 方法一:通过
raspi-config配置
运行sudo raspi-config,依次进入:Interface Options→Serial Port- 第一个选项询问是否为串口登录shell启用串口,选择No
- 第二个选项询问是否启用串口硬件,选择Yes(需保留串口硬件功能时)
- 重启树莓派生效
- 方法二:手动禁用服务
执行命令直接禁用ttyS0的getty服务:
若需永久关闭,可删除服务链接:sudo systemctl disable --now serial-getty@ttyS0.service
最后重启树莓派。sudo rm /etc/systemd/system/getty.target.wants/serial-getty@ttyS0.service
- 方法一:通过
优化AT命令发送流程
- 发送
AT+CIPSEND时指定准确的数据长度,避免长时间等待导致混入额外内容:data = b'GET / HTTP/1.1\r\n' # 指定要发送的数据长度 ser.write(f'AT+CIPSEND=0,{len(data)}\r\n'.encode()) # 短暂等待模块进入发送模式 time.sleep(0.5) ser.write(data) ser.write(b'\x1A') - 每次发送AT命令后读取模块响应,确认命令执行成功再继续,避免盲目等待。比如发送
AT+CIPOPEN后检查响应:open_cmd = f'AT+CIPOPEN=0,"TCP","{config.server_host}",{config.server_port}\r\n'.encode() ser.write(open_cmd) response = ser.read_all().decode() if "CONNECT OK" not in response: # 处理连接失败逻辑 ser.close() exit()
- 发送
内容的提问来源于stack exchange,提问作者shiznatix
相关产品推荐
相关产品推荐

