2017-08-23 56 views
0

我正在編寫運行在由Arduino作爲ISP編程的ATtiny上運行的代碼。 ATtiny將通過串行鏈路將AT命令發送到RN42藍牙模塊。Arduino SoftwareSerial Rx/Tx引腳順序錯誤?

由於ATtiny沒有UART,因此我在引腳0和1上使用SoftwareSerial。將Tx置於「數據輸出」/ MISO引腳和Rx置於「Data In」/ MOSI引腳上似乎是合乎邏輯的。該文件說明聲明如SoftwareSerial mySerial(Rx,Tx);但是我發現它只有在你像SoftwareSerial mySerial(Tx,Rx)那樣聲明時纔有效;

我已經拍攝了我的代碼和引腳的截圖,我覺得我錯過了一些東西,但是當我這樣做時它可以工作,並使藍牙模塊進入命令模式。文檔是否錯誤?

Code and Pinout

+0

入住[此帖]圖(https://stackoverflow.com/a/15552137/17034)。正如你所看到的,MOSI是從主機角度看的輸出引腳。所以一個簡單的解釋是你找到的網頁將它用作奴隸。很難判斷這是否是預期的,當您也可以提供URL時,請不要使用屏幕截圖來記錄您的問題。 –

+0

是的,我明白你的觀點。儘管在進一步的思考中它應該用到什麼樣的引腳,SoftwareSerial有點突出,所以它們只是用作GPIO的? –

回答

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); 
    } 
} 
+0

請注意,一段時間後,您將可以接受您自己的答案。 ;) –