Сброс последовательного порта Arduino в последовательном мониторе и Python

Так что я использую Arduino со щитом, чтобы получить некоторые значения напряжения для ЭКГ. Затем я строю эти данные на Python. Однако всякий раз, когда я "наблюдаю" за последовательным портом, будь то через последовательный монитор Arduino или при попытке построить значения времени (с помощью millis()) против ЭКГ (напряжения), значения сбрасываются, поэтому millis() сбрасывает ноль, что нормально, за исключением того, что некоторые из старых значений все еще отображаются. Теперь это особенно проблема в Python, потому что это означает, что сюжет работает неправильно в начале сценария, потому что он отображает некоторые из старых значений, а затем через пару секунд он сбрасывается, и сюжет снова выглядит нормально.

Чтобы продемонстрировать это, я записал это на видео и выложил на YouTube, вот оно:

https://www.youtube.com/watch?v=dNpUakcRPec

Сначала я думал, что проблема связана с Python или модулем Pyserial, поэтому я обозначил видео как таковое, но, поскольку это происходит на последовательном мониторе, я понял, что решение будет в скетче Arduino. Я пытался сбросить, не получилось, я пытался даже не запускать данные, пока не отправлю стартовый байт, но это не сработало на Python.

В идеале я мог бы запустить сценарий построения на Python, и он пропустил бы или проигнорировал эти начальные значения из последовательного порта, прежде чем начать снова.

Вот скетч Arduino, который я использую:

#include <eHealth.h>


unsigned long time;
// Процедура настройки выполняется один раз при нажатии кнопки сброс:
void setup() {
  Serial.begin(9600); 

}

// Процедура цикла выполняется снова и снова бесконечно:
void loop() {

  float ECG = eHealth.getECG();
  time = millis();
  Serial.print(time);
  Serial.print(" ");
  Serial.print(ECG, 3); 
  Serial.println(""); 


  delay(50);    // wait for 50 millisecond
}

, 👍5

Обсуждение

У меня есть recorded [фактический импульс СБРОСА при последовательном подключении](https://i.stack.imgur.com/KV4Oa.png) (это составляет около 1 мс, в зависимости от уровней триггера)., @Peter Mortensen


3 ответа


Лучший ответ:

2

Arduino предназначен для сброса, когда к нему подключается последовательный монитор или скрипт. Лучший способ смягчить это-отправить Arduino какой-то сигнал "начать отправку" при подключении к последовательному порту. Затем он отправит данные, когда ваш сценарий будет готов.

,

Я понимаю, что, однако это влияет на мой сценарий, потому что это означает, что сценарий создает мусор в начале, мой вопрос в том, могу ли я предотвратить это. С моей точки зрения, это то, что мне нужно сначала изменить в скетче Arduino., @user3284376

Я удалил millis() и вместо этого использовал счетчик внутри своего цикла. Однако, когда я пытаюсь отправить сигнал запуска на свой последовательный порт, используя ser.write ("S") на Python, arduino не получает его, @user3284376

Вы могли бы попробовать добавить что-то в свою функцию "настройка", например "while (Serial.read ()! = "S");`, @TheDoctor

С Arduino все в порядке, когда я открываю последовательный монитор, он радостно печатает, проблема в Python, когда я пытаюсь отправить байт "S", последовательный порт, похоже, не принимает его., @user3284376


1

Взгляните на if(серийный)

Это заставляет скетч ждать последовательного порта, прежде чем продолжить.

void setup() {
//Инициализируйте последовательный и дождитесь открытия порта:
  Serial.begin(9600);
  while (!Serial) {
; // дождитесь подключения последовательного порта.
  }
} 

У меня есть смутное подозрение, что это может сработать только на Леонардо.

Если это так, вы могли бы попробовать альтернативу:

  1. Попросите Python отправить что-нибудь в Arduino после его подключения.

  2. Подождите, пока это не будет получено в setup(): если (Serial.доступен() > 0) {...}>

  3. Выполните loop() нормально

напр.

// отправлять данные только тогда, когда вы получаете данные:
    if (Serial.available() > 0) {
            // считывание входящего байта:
            incomingByte = Serial.read();

            // скажи, что у тебя есть:
            Serial.print("I received: ");
            Serial.println(incomingByte, DEC);
    }
,

0

Я ответ от @TheDoctor. Альтернативой является то, что клиент, прослушивающий последовательный порт, должен дождаться сигнала "успешного сброса" от Arduino.

void setup() {
//Инициализируйте последовательный и дождитесь открытия порта:
    Serial.begin(9600);
    while (!Serial) {
        ; // дождитесь подключения последовательного порта.
    }
    Serial.println('reset successful')
} 

У каждого решения есть свои плюсы и минусы. В решении @TheDoctor, похоже, есть крайние случаи, когда Arduino уже отправляет, когда клиент подключается, и вы получите некоторый мусор до того, как произойдет сброс.

,