2013-10-20 23 views
0

我目前正在研究一個HAB(高空氣球)項目,到目前爲止,所有這些都已經遊走了。輪詢uBlox MAX-6Q

我正在使用Arduino uno R3作爲此項目的主控制器,但是,我正在爲此處的GPS方面苦苦掙扎。

在UK-HAS(http://ukhas.org.uk/guides:ublox6)上翻閱奇妙的教程我目前正在使用uBlox MAX-6Q GPS模塊。

我打得周圍的教程提供的代碼,我在用下面的草圖測試的過程:

#include <SoftwareSerial.h> 
SoftwareSerial GPS(3,2); 
byte gps_set_success = 0; 

void setup() 
{ 
    Serial.begin(9600); 
    GPS.begin(9600); 
    GPS.print("$PUBX,41,1,0007,0003,4800,0*13\r\n"); 
    GPS.begin(4800); 
    GPS.flush(); 
    uint8_t setNav[] = { 
    0xB5, 0x62, 0x06, 0x24, 0x24, 0x00, 0xFF, 0xFF, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00,      0x10, 0x27, 0x00, 0x00, 
    0x05, 0x00, 0xFA, 0x00, 0xFA, 0x00, 0x64, 0x00, 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0xDC }; 
    /*while(!gps_set_success) 
    { 
     sendUBX(setNav, sizeof(setNav)/sizeof(uint8_t)); 
     gps_set_success = getUBX_ACK(setNav); 
    }*/ 
    gps_set_success = 0; 
    GPS.println("$PUBX,40,GGA,0,0,0,0*5A"); 
    GPS.println("$PUBX,40,GSA,0,0,0,0*4E"); 
    GPS.println("$PUBX,40,RMC,0,0,0,0*47"); 
    GPS.println("$PUBX,40,GSV,0,0,0,0*59"); 
    GPS.println("$PUBX,40,VTG,0,0,0,0*5E"); 
    GPS.println("$PUBX,40,GLL,0,0,0,0*5C"); 
} 

void loop() 
{ 
    printGPSData(); 
    delay(3000); 
} 

void printGPSData() 
{ 
    Serial.println("Polling: $PUBX,00*33"); 
    GPS.println("$PUBX,00*33"); 
    while (GPS.available()) 
    { 
    if (GPS.available() > 0) 
    { 
     char c = GPS.read(); 
     Serial.write(c); 
    } 
    } 
    Serial.println(); 
} 

void sendUBX(uint8_t *MSG, uint8_t len) 
{ 
    for (int i = 0; i<len; i++) 
    { 
    GPS.write(MSG[i]); 
    Serial.print(MSG[i], HEX); 
    } 
    GPS.println(); 
} 

boolean getUBX_ACK(uint8_t *MSG) 
{ 
    uint8_t b; 
    uint8_t ackByteID = 0; 
    uint8_t ackPacket[10]; 
    unsigned long startTime = millis(); 
    Serial.print(" * Reading ACK response: "); 

    ackPacket[0] = 0xB5; 
    ackPacket[1] = 0x62; 
    ackPacket[2] = 0x05; 
    ackPacket[3] = 0x01; 
    ackPacket[4] = 0x02; 
    ackPacket[5] = 0x00; 
    ackPacket[6] = MSG[2]; 
    ackPacket[7] = MSG[3]; 
    ackPacket[8] = 0; 
    ackPacket[9] = 0; 

    for (uint8_t i=2; i<8; i++) 
    { 
    ackPacket[8] = ackPacket[8] + ackPacket[i]; 
    ackPacket[9] = ackPacket[9] + ackPacket[8]; 
    } 

    while(1) 
    { 
    if (ackByteID > 9) 
    { 
     Serial.println("(SUCCESS!)"); 
     return true; 
    } 

    if (millis() - startTime > 3000) 
    { 
     Serial.println("(FAILED!)"); 
     return false; 
    } 

    if (GPS.available()) 
    { 
     b = GPS.read(); 
     if (b == ackPacket[ackByteID]) 
     { 
     ackByteID++; 
     Serial.print(b,HEX); 
     } 
     else 
     { 
     ackByteID = 0; 
     } 
    } 
    } 
} 

我已經在這裏2個問題掙扎。我在getUBX_ACK方法中超時,這意味着,GPS模塊無法確認設置更改。目前這不是至關重要的,我可以通過uCenter進行配置,並添加電池以保存設置。

但是,我面臨的主要問題是,當我運行這個草圖時,setup中的setNav塊註釋掉了,我能夠關閉所有自動NMEA語句,並且輪詢模塊,但是在輪詢時,我我迎接以下內容:

Polling: $PUBX,00*33 

後面跟着一些無效字符。 (矩形)

我檢查了波特率停止位,奇偶校驗等與實際的數據線連接,但似乎無法找到此來源。它向我建議不好的數據行/編碼/,但我想知道這是否是其他人曾經經歷過的事情?

編輯:

所以,更多的測試後,它會出現在SoftwareSerial庫不是這裏有毛病。我首先嚐試使用SoftwareSerial GPS ipput寫入OpenLog,然後將GPS Tx直接掛接到OpenLog Rx中。相同的故事。在Notepad ++中打開結果文件yeilds中有一大堆'NULL'字符。我只能假設GPS在運行時配置的方式導致了問題。

繞過Arduino,關閉句子,直接通過串口工作輪詢GPS,沒有問題,數據完美返回。

+1

您確定數據不是UBX消息(UBX協議是二進制而不是NMEA1083/IEC61162)。該模塊可以同時使用兩者。也許用十六進制輸出數據而不是ASCII,看看它是否有意義。 – Clifford

+0

這可能是一個好主意。當我將GPS直接連接到Arduino板的UART(無芯片)時,我可以發送「$ PUBX,40,GGA,0,0,0,0 * 5A」等消息來關閉句子,然後成功輪詢模塊返回清晰的信息。讓我試試你的建議並回復你。 – Ahhhhbisto

+0

@Clifford所以當讀入一個tmp字節變量,並打印爲十六進制,我迎接0。 看來,uBlox只是輸出空數據,但我需要明白,如果這是實際情況,由於我的代碼中出現錯誤,或者它只是在丟失/格式錯誤或在處理期間。 – Ahhhhbisto

回答

0

所以,我在這裏感覺有點不舒服,有一個問題,但沒有與GPS,我會問作爲一個單獨的問題。這將顯示我遇到了SoftwareSerial庫的問題。

SoftwareSerial庫不能同時使用多個軟串行端口,看起來,儘管有很多建議,否則,我不能在sof串行端口之間切換,因爲我無法開始()第二個端口,它會出現該港首先宣佈的是不可用的。