文章程式碼顯示

2019年1月14日 星期一

《進階※應用篇》寫程式Arduino教學 - 10:Lora 長距無線傳輸 SX1278 1W 433MHZ 進階 收發 2Bytes

將前篇的發送端程式碼修改為 "發送兩個 Bytes 數據的程式碼"

該程式碼中使用了 Serial.readBytes() 函式,並指定接收 2 Bytes

發送端(發送2 Bytes)

#include "SoftwareSerial.h"

#define LED 13
#define AUX 5

void waitAUX();

SoftwareSerial mySerial(2, 3); // RX, TX

byte incoming2Byte[2]={0xFF,0xFF}; /* buffer */

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(LED,OUTPUT);
  pinMode(AUX,INPUT);
  Serial.println("Start.");
}

void loop() {   
  waitAUX();
  if (mySerial.available() > 0) {   /*注意,這邊已改為 mySerial */
    digitalWrite(LED,!digitalRead(LED));
    mySerial.readBytes(incoming2Byte, 2); /* 將 2bytes 資料餵入 buffer */
    
    Serial.print("incoming2Byte[0] : ");
    Serial.println(incoming2Byte[0]); /* 第一個 byte 的數據 */
    Serial.print("incoming2Byte[1] : ");
    Serial.println(incoming2Byte[1]); /* 第二個 byte 的數據 */
    Serial.flush();
    mySerial.flush();    
  }
}

// ===== 等待 Lora 晶片不繁忙 =====
void waitAUX(){
  while(!digitalRead(AUX));
  delay(10);
}


查看 mySerial 的 Tx 端發送給 SX1278 的數據



接收端沿用之前的代碼如下

#include "SoftwareSerial.h"

#define AUX 5
#define LED 13

SoftwareSerial mySerial(2, 3); // RX, TX
void waitAUX();
byte incomingByte = 0;

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(AUX,INPUT);
  pinMode(LED,OUTPUT);
  waitAUX();
  Serial.println("Start.");
}

void loop() {
  if (mySerial.available() > 0) {
    incomingByte = mySerial.read(); 
    Serial.println(incomingByte); 
    digitalWrite(LED,!digitalRead(LED));
    Serial.flush();
  }    
}

// ===== 等待 Lora 晶片不繁忙 =====
void waitAUX(){
  while(!digitalRead(AUX));
  delay(10);
}


串列埠監看視窗

直接查看 SX1278 的 Tx 端口發送出來的數據



上方的接收端程式碼有個缺點,就是我們無法很簡易的將每一個 Byte 的資料獨立取出,這樣就失去了傳送多個 Bytes 的意義

故我修改了下程式碼,使其可以將 2Bytes 的資料獨立抓出來 (若有需要更多 Bytes 的獨立抓取,只要修改幾個小地方即可,在這我就不給出程式碼了)

改良版的接收端代碼(將收到的數據以 Byte 為單位獨立取出)

#include "SoftwareSerial.h"

#define AUX 5
#define LED 13

SoftwareSerial mySerial(2, 3); // RX, TX
void waitAUX();
byte incoming2Byte[2]={0x12,0x34}; /* buffer */

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(AUX,INPUT);
  pinMode(LED,OUTPUT);
  waitAUX();
  Serial.println("Start.");
}

void loop() {
  waitAUX();
  if (mySerial.available() > 0) {
    mySerial.readBytes(incoming2Byte, 2); /* 將 2bytes 資料餵入 buffer */
    Serial.print("incoming2Byte[0] : ");
    Serial.println(incoming2Byte[0]); /* 第一個 byte 的數據 */
    Serial.print("incoming2Byte[1] : ");
    Serial.println(incoming2Byte[1]); /* 第二個 byte 的數據 */

    digitalWrite(LED,!digitalRead(LED));
    Serial.flush();
  }    
}

// ===== 等待 Lora 晶片不繁忙 =====
void waitAUX(){
  while(!digitalRead(AUX));
  delay(10);
}


串列埠監看視窗



我的 Youtube 頻道,一定要訂閱
我將定期推出程式語言的新手教學影片


↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引