I honestly didn't read anything about the NEO 6M, but if you're talking UBX, perhaps the same stuff I've been using for the ublox MAX6 would work?
For example, how about
/*
GPS Level Convertor Board Test Script
03/05/2012 2E0UPU
Initialise the GPS Module in Flight Mode and then echo's out the NMEA Data to the Software Serial.
This example code is in the public domain.
Additional Code by J Coxon (http://ukhas.org.uk/guides:falcom_fsa03)
*/
#include <SoftwareSerial.h>
SoftwareSerial mySerial(4, 5);
byte gps_set_sucess = 0 ;
void setup()
{
mySerial.begin(9600);
Serial.begin(9600);
mySerial.println("GPS Level Convertor Board Test Script");
mySerial.println("03/06/2012 2E0UPU");
mySerial.println("Initialising....");
// THIS COMMAND SETS FLIGHT MODE AND CONFIRMS IT
mySerial.println("Setting uBlox nav mode: ");
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_sucess)
{
sendUBX(setNav, sizeof(setNav)/sizeof(uint8_t));
gps_set_sucess=getUBX_ACK(setNav);
}
gps_set_sucess=0;
// THE FOLLOWING COMMANDS DO WHAT THE $PUBX ONES DO BUT WITH CONFIRMATION
/*
debug.println("Switching off NMEA GLL: ");
uint8_t setGLL[] = {
0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x2B };
while(!gps_set_sucess)
{
sendUBX(setGLL, sizeof(setGLL)/sizeof(uint8_t));
gps_set_sucess=getUBX_ACK(setGLL);
}
gps_set_sucess=0;
debug.println("Switching off NMEA GSA: ");
uint8_t setGSA[] = {
0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x32 };
while(!gps_set_sucess)
{
sendUBX(setGSA, sizeof(setGSA)/sizeof(uint8_t));
gps_set_sucess=getUBX_ACK(setGSA);
}
gps_set_sucess=0;
debug.println("Switching off NMEA GSV: ");
uint8_t setGSV[] = {
0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x39 };
while(!gps_set_sucess)
{
sendUBX(setGSV, sizeof(setGSV)/sizeof(uint8_t));
gps_set_sucess=getUBX_ACK(setGSV);
}
gps_set_sucess=0;
debug.print("Switching off NMEA RMC: ");
uint8_t setRMC[] = {
0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x04, 0x40 };
while(!gps_set_sucess)
{
sendUBX(setRMC, sizeof(setRMC)/sizeof(uint8_t));
gps_set_sucess=getUBX_ACK(setRMC);
}
gps_set_sucess=0;
debug.print("Switching off NMEA VTG: ");
uint8_t setVTG[] = {
0xB5, 0x62, 0x06, 0x01, 0x08, 0x00, 0xF0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x46 };
while(!gps_set_sucess)
{
sendUBX(setVTG, sizeof(setRMC)/sizeof(uint8_t));
gps_set_sucess=getUBX_ACK(setVTG);
}
*/
}
void loop()
{
while(1)
{
if(Serial.available() > 0)
{
char inByte = Serial.read();
mySerial.write(inByte);
}
}
}
// Send a byte array of UBX protocol to the GPS
void sendUBX(uint8_t *MSG, uint8_t len) {
for(int i=0; i<len; i++) {
Serial.write(MSG[i]);
mySerial.print(MSG[i], HEX);
}
Serial.println();
}
// Calculate expected UBX ACK packet and parse UBX response from GPS
boolean getUBX_ACK(uint8_t *MSG) {
uint8_t b;
uint8_t ackByteID = 0;
uint8_t ackPacket[10];
unsigned long startTime = millis();
mySerial.print(" * Reading ACK response: ");
// Construct the expected ACK packet
ackPacket[0] = 0xB5; // header
ackPacket[1] = 0x62; // header
ackPacket[2] = 0x05; // class
ackPacket[3] = 0x01; // id
ackPacket[4] = 0x02; // length
ackPacket[5] = 0x00;
ackPacket[6] = MSG[2]; // ACK class
ackPacket[7] = MSG[3]; // ACK id
ackPacket[8] = 0; // CK_A
ackPacket[9] = 0; // CK_B
// Calculate the checksums
for (uint8_t i=2; i<8; i++) {
ackPacket[8] = ackPacket[8] + ackPacket[i];
ackPacket[9] = ackPacket[9] + ackPacket[8];
}
while (1) {
// Test for success
if (ackByteID > 9) {
// All packets in order!
mySerial.println(" (SUCCESS!)");
return true;
}
// Timeout if no valid response in 3 seconds
if (millis() - startTime > 3000) {
mySerial.println(" (FAILED!)");
return false;
}
// Make sure data is available to read
if (Serial.available()) {
b = Serial.read();
// Check that bytes arrive in sequence as per expected ACK packet
if (b == ackPacket[ackByteID]) {
ackByteID++;
mySerial.print(b, HEX);
}
else {
ackByteID = 0; // Reset and look again, invalid order
}
}
}
}
I used that example code to add support (and talk UBX) for the MAX6/7 to the Trackuino source code.
I hope this helps,
Brad
KF7FER