Можно ли переключиться с Serial на SoftwareSerial во время выполнения с той же скоростью передачи данных?

Я пытаюсь использовать GPS и модуль термопринтера Adafruit с Arduino Nano в одном проекте (оба используют скорость 9600 бод) и мне интересно, могу ли я сделать что-то вроде кода ниже? По сути, в примере, который я сделал, я получаю время от GPS, и когда оно достигает минуты, он вызывает метод printTime().

Мне интересно, можно ли сделать то, что я сделал в методах disableGPS, enablePrinter, завершив последовательное соединение для GPS и запустив его для моего принтера? Мне кажется, это должно работать, но я не до конца понимаю последовательные соединения.

Если это не работает, есть ли альтернатива, которую я мог бы сделать? Мне никогда не нужно одновременно считывать с GPS и записывать на принтер в коде.

#include <Adafruit_Thermal.h>
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
#define PrinterTXPin 6 // Arduino передает ЖЕЛТЫЙ ПРОВОД с маркировкой RX на принтер
#define PrinterRXPin 5 // Arduino получает ЗЕЛЕНЫЙ ПРОВОД с маркировкой TX на принтере

static const uint32_t baud = 9600;
//Принтер
SoftwareSerial PrinterSerial(PrinterRXPin, PrinterTXPin);
Adafruit_Thermal printer(&PrinterSerial);
//мы хотим печатать только по минутам
boolean havePrinted = false;

//GPS
TinyGPSPlus gps;
TinyGPSDate lastDate;


void setup() {
  enableGPS();
}

void loop() 
{
  if(gps.time.isValid() && checkDate(gps.time)){
    printTime(gps.time);
  }
}

boolean checkDate(TinyGPSTime theTime)
{
 if(theTime.second() == 0 && !havePrinted)
 {
    havePrinted = true;
    return true;
 }
 if(theTime.second() == 1){
    havePrinted = false;
 }
}

void printTime(TinyGPSTime theTime)
{
  //Отключить, так как на скорость передачи данных может быть только 1 последовательное соединение
  disableGPS();
  enablePrinter();

  printer.doubleHeightOn();
  printer.println(theTime.hour() + ":" + theTime.minute());
  printer.feed(1);

  disablePrinter();
  enableGPS();
}

void enablePrinter()
{

  PrinterSerial.begin();
  printer.begin();
  printer.wake();
}

void disablePrinter()
{
  printer.sleep();
  PrinterSerial.end();
}

void disableGPS()
{
  Serial.end();
}

void enableGPS()
{
  Serial.begin(baud);
}

, 👍0


1 ответ


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

4

Я думаю, вы не знаете, что такое скорость передачи данных. Это скорость, с которой передаются данные. Поэтому тот факт, что ваши два устройства одинаковы, не является проблемой. Из кода следует, что ваш GPS подключен к аппаратному последовательному порту (контакты 0,1 на uno), а принтер — к программному последовательному порту (контакты 5,6). Если это так, то нет причин отключать любой из них, они оба могут работать. В случае использования нескольких программных последовательных соединений только одно может «слушать» в любой момент времени, поэтому вам нужно переключаться между ними. В вашем коде это не так, поскольку есть только одно программное последовательное соединение.

,