如何在同一张arduino卡上设置2个串行条目(USB屏蔽主机/蓝牙)?

时间:2019-06-19 11:32:36

标签: bluetooth arduino usbserial

我试图使用arduino使ACM / USB与蓝牙的软件串行端口配合使用,但是将这两个代码组合会导致两个功能都无法使用。

首先,我为应用程序的蓝牙部分开发了代码,并且能够正确发送和解释通过软件序列(在引脚10和11上)发送的命令。

在那之后,我添加了一个arduino USB防护罩,以便将其连接到MRC12 USB条形码扫描仪。经过一番摆弄之后,我设法制作了一个代码,该代码能够接收使用ACM发送的数据,然后将其打印到串行端口(已连接的计算机)以进行调试。

单独执行此操作会使两个代码正常工作,但是当我尝试这样做时,代码停止工作。

这是带有设置的蓝牙控制代码的一部分。这将检测是否发送了管理代码并触发响应。

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..
}

从理论上讲,将这两个代码组合起来似乎很容易,我只是添加了所有必要的配置,然后在蓝牙检查后稍加暂停就添加了USB部分。

我希望代码可以做一个,然后做另一个,并产生相似的结果。代码正确编译,但是在上载时整个过程中断了。设置“启动”可以正常打印,但是尽管蓝牙卡是惰性的,但是代码仍开始输入到传入的蓝牙信号中,并打印了很多空白。我也无法通过串行接口通过蓝牙发送或接收任何内容,即使通过常规的println

0 个答案:

没有答案