Последовательная связь Arduino MKR Wifi 1010 с Arduino Mega

Я пишу программу последовательной связи между mkr wifi 1010 и мега, в которой mkr отправляет на мега символ H или L, а мега отвечает, читая символ и устанавливая его встроенный светодиод на высокий или низкий уровень в зависимости от символ. Когда я использую задержку (#) на микроконтроллере, код работает нормально, а светодиод мегапикселя мигает и гаснет.

Однако, когда я создаю код без задержки, светодиод мегафона не мигает. Он либо остается низким, либо остается высоким, большую часть времени остается низким. Я проверил код mkr, прочитав последовательный порт, и он действительно отправляет 72 (H) и 76 (L) попеременно с правильным интервалом в обеих версиях кода.

Схема подключения:

MKR          Mega
gnd    ->     gnd
tx     ->     rx
rx     ->     tx

Я сместил уровень на выводе TX Mega до 3,3 В перед контактом RX на MKR.

Код задержки мкр:

void setup()
{
  uint32_t baudRate = 9600;
  Serial1.begin(baudRate);
}

void loop()
{
  Serial1.print('H');
  delay(500);
  Serial1.print('L');
  delay(500);
}

Код без задержки mkr:

unsigned long curT = 0;
unsigned long prevT = 0;
const int interval = 500;
int byteToSend = 'L';
void setup()
{
  uint32_t baudRate = 9600;
  Serial1.begin(baudRate);
}

void loop()
{
  curT = millis();
  
  if (curT - prevT > interval)
  {
    if (byteToSend == 'L')
    {
      byteToSend = 'H';
    }
    else
    {
      byteToSend = 'L';
    }
    
    Serial1.print(byteToSend);
    
    prevT = curT;
  }
}

мега-код:

const int ledPin = 13; // the pin that the LED is attached to
int incomingByte;      // a variable to read incoming serial data into

void setup() {
  // initialize serial communication:
  Serial.begin(9600);
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
}

void loop() {
  // see if there's incoming serial data:
  if (Serial.available() > 0)
  {
    // read the oldest byte in the serial buffer:
    incomingByte = Serial.read();
    // if it's a capital H (ASCII 72), turn on the LED:
    if (incomingByte == 'H')
    {
      digitalWrite(ledPin, HIGH);
    }
    // if it's an L (ASCII 76) turn off the LED:
    if (incomingByte == 'L')
    {
      digitalWrite(ledPin, LOW);
    }
  }
}

Насколько я знаю, эти две разные программы mkr делают одно и то же и отправляют последовательные данные одинаково, просто одна блокирует, а другая - неблокирующая. Почему не мигает код без задержки?


person JGoss    schedule 03.10.2020    source источник
comment
Что вы имеете в виду под не работает? Что случается? Индикатор постоянно горит или не горит или мигает с неправильной скоростью?   -  person Mark Setchell    schedule 04.10.2020
comment
Свет остается включенным или выключенным. В большинстве случаев он остается выключенным, но время от времени он будет оставаться на высоком уровне, поэтому, возможно, первое значение отправляется правильно, но не после этого первого.   -  person JGoss    schedule 04.10.2020
comment
Кажется, вы используете int (2 байта) для отправки байта. И получить.   -  person Mark Setchell    schedule 04.10.2020
comment
Это решило проблему, спасибо. Не могли бы вы объяснить, почему это не сработало?   -  person JGoss    schedule 04.10.2020
comment
Это означает, что вы отправляете 2 байта и сравниваете их с одним символом 'H' или 'L', поэтому он не будет работать очень часто - только когда старший байт окажется нулевым и будет полностью рассинхронизирован - как вы видели .   -  person Mark Setchell    schedule 04.10.2020
comment
отлично, еще раз спасибо. Я добавил исправление, которое вы дали в качестве ответа, и приму его, как только SO позволит мне.   -  person JGoss    schedule 04.10.2020


Ответы (1)


В коде отправителя без задержки:

int byteToSend

должно быть

char byteToSend

и в коде получателя:

int incomingByte

должно быть

char incomingByte

Это устраняет проблему.

person JGoss    schedule 04.10.2020