2012-06-14 29 views
0

我正在做一個項目,我將一個GPS模塊,數字羅盤和一個ZigBeeXBee調制解調器)連接到Arduino。順便說一下,我正在使用Eclipse IDE來完成這個項目,所以我把我的代碼分解成了幾個庫。如何在Arduino的庫中使用多個軟件序列?

XBee目前使用硬件UART,它工作正常。 GPS模塊和數字羅盤都使用Software Serial。

我的問題是,如果我實例化兩個軟件連續劇,只有最新的一個將工作。

以下是我的示例代碼。

void CSensor::initSensors() 
{ 
   //For GPS 
   this->gpsSerial = new SoftwareSerial(2, 3); 
   this->gpsSerial->begin(9600); 

   //For digital compass 
   this->compassSerial = new SoftwareSerial(6, 7); 
   this->compassSerial->begin(9600); 
} 

gpsSerial被聲明爲CSensor類的指針構件。 - >SoftwareSerial* gpsSerial; compassSerial也被宣佈爲相同 - >SoftwareSerial* compassSerial;

在上面的示例代碼中,只有數字羅盤才能工作,GPS將不起作用。但是,如果我交換代碼的位置,使其看起來像這樣:

void CSensor::initSensors() 
{ 
   //For digital compass 
   this->compassSerial = new SoftwareSerial(6, 7); 
   this->compassSerial->begin(9600); 

   //For GPS 
   this->gpsSerial = new SoftwareSerial(2, 3); 
   this->gpsSerial->begin(9600); 
} 

GPS現在可以工作,但數字羅盤不會。我認爲軟件串行有問題。解決辦法是什麼?

回答

0

按照Ardiuno documentation

圖書館有以下已知的侷限性:

如果使用多個軟件串行端口,只有一個可以在 接收數據的時間。

所以它看起來像你必須添加代碼來切換每個軟件序列的採樣。 我知道GPS廣播在第二間隔。所以,也許在獲得有效的GPS讀取後,斷開它,然後觀看指南針,直到下一個預定的GPS。一個研究問題將需要多長時間來初始化事物並保持足夠的代碼效率。

1

Your SoftwareSerial就好。就像jdh說的那樣,Arduino一次只能讀取一個軟件序列。但是,如果您使用的是Sparkfun GPS,則實際上可以使用UART進行GPS(通過使用UART/Dline開關並將RX/TX針號分別從2,3改爲0 & 1)。

爲此,請將開關保持在界線上並上傳代碼。在這個改變之後,它返回到UART,以便Arduino可以從GPS讀取數據。這將工作得很好。

有關更多詳細信息,請查看GPS教程的UART部分。 http://www.sparkfun.com/tutorials/173

+0

我發現我的UART是在引腳0,1而不是2,3,正如該站點所說的那樣。只是說可能會在這裏降落的人。 – kechapito

0

要設置其SoftwareSerial端口上監聽使用

mySerial.listen() 

這意味着你必須等待消息設置listen()之後抵達。通過檢查來做到這一點mySerial.available()>0

缺點是你錯過了來自其他設備的消息,所以好的程序設計變得非常重要。但我相信你知道:)

1

一個問題:你有沒有考慮過使用Arduino Mega作爲你的項目?通過這塊主板,您可以獲得4個(實際)硬件UART,這對於您的用途應該足夠了。

使用「軟件串行」庫太棘手。在某些情況下它可能正常工作,但與普通串行端口相比具有重要限制,並且很可能會導致數據丟失。

當涉及到管理多個串行設備時,我不建議您花更多時間來處理「串行仿真」。只需要一個更好的微控制器,就是這樣。

0

您應該從GPS接收器讀取一行文字,然後使用this->compassSerial->listen()切換回指南針,然後返回到GPS。你會失去一些報告,但這可能不會成爲你的限制。

+0

當您達到特定基本聲譽時,您將能夠得到滿意答案。請不要發佈不是真正答案的答案。現在,我將刪除註釋部分。 –

相關問題