【问题标题】:Why Serial Communications from Arduino stops after some time为什么来自 Arduino 的串行通信会在一段时间后停止
【发布时间】:2024-11-27 14:40:02
【问题描述】:

我正在用 arduino uno 作为温度控制器建造一个种植箱/玻璃容器。 arduino 的简单草图:如果 DS18B20 传感器的温度低于 25'C,则打开继电器,加热电缆连接到该继电器。循环 30 秒,每次 Serial.print(temperature) 到 PC,我正在收集数据并制作延时照片。 ---> 这就是问题所在。

一段时间后(从 15 分钟到 4 小时)。与 PC 的串行通信停止。当我尝试将新草图上传到 arduino 时,我收到一条错误消息: avrdude: ser_open(): can't set com-state for "\.\COM3"

我需要拔下并重新插入 USB 电缆(或在 Windows 设备管理器中将其关闭再打开),还需要重新启动正在收集数据的 Python 应用程序。 (非常不满意的修复)。

所以我的问题是: 1. 为什么? 2.如何解决? 3.或者如何做一些变通方法,例如从代码中重置COM端口(最好是python2.7)

附言。我在做什么以及它是如何工作(和不工作)的例子在这里:Life of pepper

PS2。我的目标是为植物创造可控的栖息地,在那里我可以看到行为因温度、日间持续时间、光照强度、湿度而异。

请帮助我:-)。

ARDUINO UNO 素描

    #include <OneWire.h>
    #include <DallasTemperature.h>

    // Data wire is plugged into port 2 on the A

rduino
    #define ONE_WIRE_BUS 2
    #define PIN_HEATING 6

    float temperatura = 30.0;

    // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    OneWire oneWire(ONE_WIRE_BUS);

    // Pass our oneWire reference to Dallas Temperature.
    DallasTemperature sensors(&oneWire);

    void setup(void)
    {
      // start serial port
      Serial.begin(9600);

      // Start up the library
      sensors.begin();

      pinMode(PIN_HEATING, OUTPUT);
    }

    void loop(void)
    {
      delay(30000);

      if(temperatura<25.0){
        digitalWrite(PIN_HEATING, HIGH);  
        }
      else{
        digitalWrite(PIN_HEATING, LOW);  
        }

      sensors.requestTemperatures(); // Send the command to get temperatures
      // After we got the temperatures, we can print them here.
      // We use the function ByIndex, and as an example get the temperature from the first sensor only.
      temperatura = sensors.getTempCByIndex(0);

      Serial.print("#");
      Serial.print(temperatura);
    }

PYTHON2.7 接收部分

import serial #pySerial

ser = serial.Serial()
ser.port = "COM3"
ser.open()

data = ser.read_all().split("#")
datasize = len(data)
if datasize>1:
    temp = data[datasize-1]
    tempstr = " / " + str(temp) + "'C"
else:
    tempstr=" / ----- "

【问题讨论】:

    标签: python-2.7 arduino serial-port usb


    【解决方案1】:

    我过去曾遇到过类似的问题,即串行端口无响应。我的解决方案不是很直观,但仍然有效。以下内容也可能对您有所帮助:

    • 确保您用于连接 arduino 的 USB 端口未与其他设备共享(例如使用 USB 多点集线器)。如果您使用具有多个 USB 端口(通常位于桌面机箱背面)的台式机,请拔下所有其他 USB 设备(键盘、鼠标等)并将它们重新连接到不同的 USB。使用计算机上可用的最快的 USB 端口(如果存在 USB 3.0),并将其专用于与 arduino 通信。通信端口有时无响应的原因是,如果您连接了多个设备,则电压和/或电流会出现瞬时波动。
    • 确保您的计算机有稳定的电源,由于负载过重导致的电压漂移有时会导致 PC 外围设备断开/重新连接。

    如果这不起作用,请尝试此快速软件修复。在代码中的 delay(30000) 语句之前,添加以下内容:

     if(!Serial) {  //check if Serial is available... if not,
    Serial.end();      // close serial port
    delay(100);        //wait 100 millis
    Serial.begin(9600); // reenable serial again
    }
    

    这至少可以确保您的应用程序在不需要您干预的情况下继续运行。

    【讨论】:

      【解决方案2】:

      所以在我的情况下,通过适当的浪涌抑制器连接我的电脑解决了这个问题,以前我用一根简单的电缆将它连接到墙上,我的公寓里有旧的 2 线、不接地的电气装置。

      【讨论】:

        最近更新 更多