Как я могу настроить 2 последовательных входа (USB-щит хоста / Bluetooth) на одной карте Arduino? - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь заставить ACM / USB работать в сочетании с программным последовательным портом bluetooth, используя arduino, но объединение обоих кодов приводит к сбою обеих функций.

Сначала я разработал код для части приложения, использующей Bluetooth, и смог правильно отправлять и интерпретировать команды, отправленные через серийный номер программного обеспечения (на контактах 10 и 11).

После этого я добавил Arduino USB-щит, чтобы подключить его к USB-сканеру MRC12 штрих-кода.Немного поработав с ним, мне удалось создать код, который мог бы получать данные, отправленные с помощью ACM, а затем распечатывать их на последовательный порт (подключенный компьютер) для целей отладки.

Это привело к тому, что оба кода работали по отдельности, но когда я попытался это сделать, код перестал работать.

Вот часть управляющего кода Bluetooth с настройкой.Он обнаруживает, был ли отправлен код администратора, и вызывает ответ.

char data; //Recived data will get stored in this variable
int i = 0; //count pour tabnumbers
int e = 0; //count pour firstchar
String test;
String win = "0000";
const int PowerPin1 = 4;
const int PowerPin2 = 5;

// software serial #1: RX = digital pin 10, TX = digital pin 11
SoftwareSerial portBluetooth(10, 11);

void setup() //The setup function will only run once, after each powerup.It initializes and sets the initial values
{
  Serial.begin(9600); //Sets the baud for serial data transmission (Bits Per Second)
  portBluetooth.begin(9600);
  pinMode(PowerPin1, OUTPUT);
  pinMode(PowerPin2, OUTPUT);
}

void loop() {

  if (portBluetooth.available()) //Here We're checking whether data is available or not
  {
    test = ""; //store assembled string
    data = ""; //store incoming data
    delay(50);

    while (portBluetooth.available()) {
      data = portBluetooth.read(); //Data received

      if ((byte) data == 13) {
        if (test.equals(win) == true) {
          portBluetooth.println("secret code acknowledged: opening all doors, sending current loaded numbers to serial");
          for (int k = 0; k < TabSize; k++) {
            portBluetooth.println("import: " + ImpTab[k]);
            portBluetooth.println("export: " + ExpTab[k]);
          }

          digitalWrite(PowerPin1, LOW);
          digitalWrite(PowerPin2, LOW);
          delay(5000);

          digitalWrite(PowerPin1, HIGH);
          digitalWrite(PowerPin2, HIGH);
        } else if (test.equals("1111")) {
          portBluetooth.println("secret code acknowledged: clearing tracking number list");
          for (int k = 0; k < TabSize; k++) {
            ImpTab[k] = "";
            ExpTab[k] = "";
          }
        }
      } else {
        test.concat(data);
        portBluetooth.println(test);
      }
    }
  }
}

Некоторые другие функции кода были удалены, но это должно дать представление о том, как он работает.

Это раздел, который управляет входом USB.Щит не может изначально настроить последовательную связь, для этого я использовал ACM.Этот более сложный (и, вероятно, источник проблемы), вот интегральный код.

#include <cdcacm.h>
#include <usbhub.h>

#include "pgmstrings.h"

// Satisfy the IDE, which needs to see the include statment in the ino too.
#ifdef dobogusinclude
#include <spi4teensy3.h>
#endif
#include <SPI.h>

class ACMAsyncOper : public CDCAsyncOper
{
public:
    uint8_t OnInit(ACM *pacm);
};

uint8_t ACMAsyncOper::OnInit(ACM *pacm)
{
    uint8_t rcode;
    // Set DTR = 1 RTS=1
    rcode = pacm->SetControlLineState(3);

    if (rcode)
    {
        ErrorMessage<uint8_t>(PSTR("SetControlLineState"), rcode);
        return rcode;
    }

    LINE_CODING lc;
    lc.dwDTERate    = 9600;
    lc.bCharFormat  = 0;
    lc.bParityType  = 0;
    lc.bDataBits    = 8;

    rcode = pacm->SetLineCoding(&lc);

    if (rcode)
        ErrorMessage<uint8_t>(PSTR("SetLineCoding"), rcode);

    return rcode;
}

USB     Usb;
//USBHub     Hub(&Usb);
ACMAsyncOper  AsyncOper;
ACM           Acm(&Usb, &AsyncOper);

void setup()
{
  Serial.begin( 9600 );
#if !defined(__MIPSEL__)
  while (!Serial); // Wait for serial port to connect - used on Leonardo, Teensy and other boards with built-in USB CDC serial connection
#endif
  Serial.println("Start");

  if (Usb.Init() == -1)
      Serial.println("OSCOKIRQ failed to assert");

  delay( 200 );
}

void loop()
{
    Usb.Task();

    if( Acm.isReady()) {
       uint8_t rcode;



       delay(50);

        /* reading the USB
        /* buffer size must be greater or equal to max.packet size */
        /* it it set to 64 (largest possible max.packet size) here, can be tuned down
        for particular endpoint */
        uint8_t  buf[64];
        uint16_t rcvd = 64;
        rcode = Acm.RcvData(&rcvd, buf);
         if (rcode && rcode != hrNAK)
            ErrorMessage<uint8_t>(PSTR("Ret"), rcode);

            if( rcvd ) { //more than zero bytes received
              for(uint16_t i=0; i < rcvd; i++ ) {
                Serial.print((char)buf[i]); //printing on the screen
              }
            }
        delay(10);
    }//if( Usb.getUsbTaskState() == USB_STATE_RUNNING..
}

Комбинируя 2 кода, в теории все выглядело просто, я просто добавил все необходимые конфиги и затем добавил раздел USB после проверки bluetooth с небольшой паузой.

Я ожидал кодсделать одно, затем другое, и дать аналогичные результаты.Код скомпилирован правильно, но после загрузки весь процесс прервался.«запуск» установки печатался хорошо, но затем код начал вводиться во входящий сигнал Bluetooth, несмотря на то, что карта Bluetooth была инертной, а также печатал много пустых мест.у меня также не было возможности отправлять или получать что-либо через bluetooth через последовательный интерфейс, даже через обычный println

...