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

如何通过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()

五、操作步骤

  1. 按硬件连接要求接好线路,插入SIM卡,安装牢固外置天线
  2. 修改Arduino代码中的APN、Python服务IP和端口,上传代码到Arduino,打开串口监视器确认每一步AT指令返回正确响应
  3. 运行Python代码,启动TCP服务端
  4. Arduino初始化完成后自动连接Python服务,开始发送数据,Python端实时打印并处理收到的参数

常见问题排查

  • SIM800L无法注册网络:检查SIM卡2G信号、APN设置、天线安装状态
  • TCP连接失败:确认Python服务IP正确、端口已开放(公网服务器需在防火墙开放对应端口)、端口未被占用
  • 数据乱码:确保Arduino与SIM800L波特率一致(代码中均为9600)、Python使用utf-8解码

内容的提问来源于stack exchange,提问作者vanshika srivastava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:35:23