如何通过SIM800L无线模块实现Arduino向Python传输数据?求步骤、凭据及代码
Arduino通过SIM800L向Python传输数据的完整实现方案
一、硬件连接(SIM800L ↔ Arduino)
- 供电:大部分SIM800L模块支持5V供电,直接接Arduino的5V引脚;部分小体积模块需要3.7V锂电池供电,注意匹配,避免烧毁模块
- 接地:Arduino的GND与SIM800L的GND必须连接
- 串口通信:使用软串口避免占用Arduino硬件串口(用于调试)——Arduino数字引脚10接SIM800L的RX,引脚11接SIM800L的TX
- 必接外置天线:SIM800L内置天线信号极差,不接外置天线基本无法连接网络
二、前置准备与必要凭据
- 一张开通GPRS功能的2G SIM卡:优先选择移动或联通,国内大部分地区电信2G已停服
- 运营商APN信息:移动填
CMNET,联通填UNINET,无需用户名和密码 - Python服务可访问地址:公网部署用服务器公网IP+开放端口;内网测试用内网穿透工具(如ngrok)映射本地端口到公网,确保SIM800L能访问到Python服务
三、Arduino代码(发送数据到Python)
核心逻辑:初始化SIM800L,连接GPRS网络,建立TCP连接到Python服务,定时发送参数数据
#include <SoftwareSerial.h> // 用软串口连接SIM800L,避免占用硬件串口用于调试 SoftwareSerial sim800l(10, 11); // RX, TX void setup() { Serial.begin(9600); sim800l.begin(9600); delay(1000); // 分步初始化SIM800L sendATCmd("AT", "OK"); // 测试模块是否响应 sendATCmd("AT+CREG?", "+CREG: 0,1"); // 检查网络注册状态(0,1表示注册成功) sendATCmd("AT+CGATT=1", "OK"); // 附着GPRS网络 sendATCmd("AT+SAPBR=3,1,\"APN\",\"CMNET\"", "OK"); // 设置APN,根据运营商调整 sendATCmd("AT+SAPBR=1,1", "OK"); // 激活GPRS连接 // 建立TCP连接,替换为你的Python服务IP和端口 sendATCmd("AT+CIPSTART=\"TCP\",\"123.45.67.89\",\"8888\"", "CONNECT OK"); } void loop() { // 模拟要发送的参数,替换为你的传感器数据或自定义参数 int sensorA0 = analogRead(A0); float voltage = (sensorA0 * 5.0) / 1023.0; String sendData = "sensorA0:" + String(sensorA0) + ",voltage:" + String(voltage); // 发送数据 sim800l.print("AT+CIPSEND="); sim800l.println(sendData.length()); delay(500); sim800l.println(sendData); delay(1000); // 检查发送状态 if (sim800l.find("SEND OK")) { Serial.println("数据发送成功"); } else { Serial.println("发送失败,重新建立连接"); sendATCmd("AT+CIPSTART=\"TCP\",\"123.45.67.89\",\"8888\"", "CONNECT OK"); } delay(5000); // 每5秒发送一次,可按需调整 } // 封装AT指令发送与响应检查函数 void sendATCmd(String cmd, String expectedResp) { sim800l.println(cmd); delay(1000); while (sim800l.available()) { String resp = sim800l.readString(); Serial.println(resp); if (resp.indexOf(expectedResp) != -1) { break; } } }
四、Python代码(接收并处理数据)
核心逻辑:建立TCP服务端,监听指定端口,接收来自SIM800L的数据并解析处理
import socket # 配置服务端参数 HOST = '0.0.0.0' # 监听所有可用网卡 PORT = 8888 # 必须与Arduino代码中的端口一致 # 创建TCP套接字 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((HOST, PORT)) server.listen(1) print(f"等待设备连接... 监听端口: {PORT}") while True: conn, addr = server.accept() print(f"已连接设备: {addr}") while True: # 接收数据,最大1024字节 data = conn.recv(1024).decode('utf-8') if not data: print("设备断开连接,等待新连接...") break print(f"收到原始数据: {data}") # 解析参数,格式与Arduino发送的一致 params = data.split(',') for param in params: key, value = param.split(':') print(f"参数 {key} 的值是: {value}") # 此处可添加自定义处理逻辑,如存储到数据库、数据分析等 conn.close()
五、操作步骤
- 按硬件连接要求接好线路,插入SIM卡,安装牢固外置天线
- 修改Arduino代码中的APN、Python服务IP和端口,上传代码到Arduino,打开串口监视器确认每一步AT指令返回正确响应
- 运行Python代码,启动TCP服务端
- Arduino初始化完成后自动连接Python服务,开始发送数据,Python端实时打印并处理收到的参数
常见问题排查
- SIM800L无法注册网络:检查SIM卡2G信号、APN设置、天线安装状态
- TCP连接失败:确认Python服务IP正确、端口已开放(公网服务器需在防火墙开放对应端口)、端口未被占用
- 数据乱码:确保Arduino与SIM800L波特率一致(代码中均为9600)、Python使用utf-8解码
内容的提问来源于stack exchange,提问作者vanshika srivastava
相关产品推荐
相关产品推荐

