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

PHP通过Python向Arduino传参失败求助:sys.argv与serial兼容疑问

问题分析与解决方案

首先明确:sys.argv与pyserial完全兼容,你的问题并非来自两者的冲突,而是代码错误和运行环境的问题,以下是具体排查和修复步骤:

1. PHP中$output未定义的直接原因

页面首次加载时无POST请求触发,$output变量未初始化,直接echo $output会抛出"Undefined variable $output"错误。

修复方案:在PHP代码开头初始化变量,避免未定义报错:

<?php
$output = ""; // 初始化变量
if(isset($_POST["turn1"])) {
  $var1 = 2;
  $pyfilepath = "python_to_arduino_p2.py";
  $output = shell_exec("/usr/bin/python3 $pyfilepath $var1");
}
if(isset($_POST["turn2"])) {
  $var1 = 3;
  $pyfilepath = "python_to_arduino_p2.py";
  $output = shell_exec("/usr/bin/python3 $pyfilepath $var1");
}

echo $output;
?>

2. Python代码的语法错误

你的导入语句格式错误,多个import写在同一行但未分隔,会导致脚本执行失败,shell_exec无法获取输出:
错误代码:

import serial import time import sys

正确写法(三选一):

import serial
import time
import sys

或:

import serial, time, sys

或:

import serial; import time; import sys

3. 串口权限问题

PHP运行的系统用户(如Apache的www-data、Nginx的nginx)通常没有串口设备的读写权限,导致Python脚本无法打开串口执行失败。

修复步骤:

  • 将PHP运行用户添加到串口所属用户组(通常为dialout或uucp):
    sudo usermod -aG dialout www-data
    
  • 重启Web服务使权限生效:
    sudo systemctl restart apache2
    

4. Python脚本优化建议

  • 添加串口连接后的延时,等待Arduino完成重启(Arduino串口连接时会自动重启):
    arduino = serial.Serial(port="/dev/cu.usbmodem1101", baudrate=115200, timeout=.1)
    time.sleep(2)  # 等待Arduino初始化完成
    
  • 增加异常捕获,方便排查串口问题:
    import serial
    import time
    import sys
    
    try:
        arduino = serial.Serial(port="/dev/cu.usbmodem1101", baudrate=115200, timeout=.1)
        time.sleep(2)
    except serial.SerialException as e:
        print(f"串口打开失败: {e}")
        sys.exit(1)
    
    def write_read(x):
        arduino.write(bytes(x, 'utf-8'))
        time.sleep(0.05)
        data = arduino.readline()
        return data
    
    if len(sys.argv) > 1:
        num = sys.argv[1]
        value = write_read(num)
        print("total", num)
        if value:
            print("Arduino返回:", value.decode('utf-8').strip())
    else:
        print("未传入参数")
    

方案可行性确认

你采用的「PHP调用Python脚本控制Arduino」的方案完全可行,修复上述代码错误和权限问题后即可正常运行。

内容的提问来源于stack exchange,提问作者Davis Kwok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:55:31