автоматическое обнаружение ошибок при использовании последовательных портов в Arduino IDE - PullRequest
0 голосов
/ 25 мая 2018

Я программирую на платах Arduino, которые имеют несколько последовательных портов (скажем, пока Serial, Serial1 и Serial3).Каждый порт - это отдельный объект.Для использования порта необходимо сначала инициализировать его с помощью метода begin() (здесь я имею в виду, чтобы он работал нормально).Проблема в том, что соответствующие объекты все доступны в IDE Arduino по умолчанию, даже если вы не объявляете / не инициализируете их в своем эскизе, поэтому не требуется вызывать конструктор и / или инициализировать последовательный порт для его использования.(то, что я имею в виду здесь с обязательным, это то, что нужно сделать, чтобы избежать ошибки компилятора).Как следствие, следующий вид кода компилируется нормально, хотя есть опечатка:

byte crrt_char;

void setup(){
  Serial.begin(115200);
  delay(100);

  Serial.println("booted");

  Serial3.begin(57600);
  // Serial1.begin(9600);
  delay(100);
}

void loop() {
  if (Serial3.available() > 0){
    crrt_char = Serial1.read();
    Serial.println(crrt_char, HEX);
    delayMicroseconds(5);
  }
}

(в цикле должен быть Serial3 вместо Serial1).

Я был укушениз-за такого рода ошибок и потерял много времени на отладку (в более сложном коде, конечно) несколько раз, и мне грустно, что компилятор меня не спасает (для меня это выглядит как работа для компилятора проверять этовид опечатки, не так ли?)В любом случае, я мог бы получить помощь компилятора для обнаружения ошибок такого рода?

Ядро Arduino доступно здесь:

https://github.com/arduino/ArduinoCore-avr

Можно ли написать моюсобственное ядро ​​/ варианты Arduino без предварительно объявленных последовательных портов, так что мне нужно было бы объявить их самостоятельно, прежде чем я смогу их использовать?

1 Ответ

0 голосов
/ 25 мая 2018

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

Несмотря на то, что люди путаются между работой по поддержке кода и работой компилятора кода, ваша задача - убедиться, что код написан правильно.Задача компилятора - подтвердить, соответствует ли код правильному синтаксису.

Что касается создания варианта платы и включения его в ядро ​​Arduino, вам придется внести изменения в файл HardwareSerial.h, чтобы гарантировать, что любойненужные последовательные объекты не объявляются.

Более простым решением было бы заставить макрос удерживать объект Serial, который вы хотите использовать, следующим образом:

#define CONTROL_PORT    Serial
#define COMMUNICATION_PORT  Serial3

А в вашем коде используйте CONTROL_PORT иCOMMUNICATION_PORT следующим образом

CONTROL_PORT.begin(9600);
COMMUNICATION_PORT.begin(9600);

При этом вы никогда не столкнетесь с опечаткой, и вы можете изменить Serial1 на Serial3, когда захотите.Надеюсь, это поможет.

...