0

我正在编写代码以在由 Arduino 作为 ISP 编程的 ATtiny 上运行。ATtiny 通过串行链路向 RN42 蓝牙模块发送 AT 命令。

由于阁楼没有 UART,我在引脚 0 和 1 上使用 SoftwareSerial。将 Tx 放在“数据输出”/MISO 引脚上,将 Rx 放在“数据输入”/MOSI 引脚上似乎是合乎逻辑的。文档说要像 SoftwareSerial mySerial(Rx, Tx); 但我发现它只有在你像 SoftwareSerial mySerial(Tx, Rx);

我已经截取了我的代码和引脚分配的屏幕截图,我觉得我错过了一些东西,但是当我这样做时,它可以工作并使蓝牙模块进入命令模式。文档是错误的吗?

代码和引脚

4

1 回答 1

1

我意识到我的方式错误,我不必要地设置了 Rx 和 Tx 引脚的 pinMode。这让我大吃一惊,因为我认为将 Rx 引脚设置为 OUTPUT 但实际上它不起作用,所以我在我的 Rx 线上输出数据并在 Tx 线上接收它!答案是不指定方向,让 SoftwareSerial 处理引脚。按顺序传递参数(Rx,Tx)。

这是我的更简洁的代码,效果更好:

#include <SoftwareSerial.h>

const int Rx = 0;                           // pin 5 on ATtiny - DI/MOSI
const int Tx = 1;                           // pin 6 on ATtiny - DO/MISO
const int ButtonIn = 2;
const int OK_LED = 4;
int buttonState = 0;
SoftwareSerial serialBT(Rx, Tx);

void setup() 
{
  pinMode(ButtonIn, INPUT);
  pinMode(OK_LED, OUTPUT);
  serialBT.begin(9600);
}

void loop() 
{
  buttonState = digitalRead(ButtonIn);
  if (buttonState == 0)
  {  
    serialBT.print("$");                    // $$$ enters RN42 command mode
    serialBT.print("$");
    serialBT.print("$");
    delay(3000);

    serialBT.println("R,1");
    digitalWrite(OK_LED, HIGH);
    delay(5000);
    digitalWrite(OK_LED, LOW);
  }
}
于 2017-08-23T15:09:57.483 回答