This example illustrates using the low-level UART protocol to communicate with a VectorNav sensor.
class Program
{
private static bool IsCheckingForModelNumberResponse;
private static bool IsCheckingForAsyncOutputFreqResponse;
private static bool IsCheckingForVpeBasicControlResponse;
private static byte enable, headingMode, filteringMode, tuningMode;
static void Main(string[] args)
{
var buffer = new byte[512];
int receivedLength;
var pf = new PacketFinder();
UserUart_Initialize();
pf.ValidPacketFound += ValidPacketFoundHandler;
UserUart_MockReceivedData("$VNYMR,+100.949,-007.330,+000.715,-00.0049,-00.2449,+00.5397,-01.258,-00.100,-09.701,-00.000018,+00.001122,-00.000551*69\r\n");
receivedLength = UserUart_CheckForReceivedData(buffer);
pf.ProcessReceivedData(buffer, 0, receivedLength);
IsCheckingForModelNumberResponse = true;
UserUart_SendData(p1.Data);
UserUart_MockReceivedData("$VNRRG,01,VN-200T-CR*31\r\n");
receivedLength = UserUart_CheckForReceivedData(buffer);
pf.ProcessReceivedData(buffer, 0, receivedLength);
IsCheckingForModelNumberResponse = false;
var p2 = Packet.GenCmdWriteAsyncDataOutputFrequency(
ErrorDetection.Checksum8, 2);
IsCheckingForAsyncOutputFreqResponse = true;
UserUart_SendData(p2.Data);
UserUart_MockReceivedData("$VNWRG,07,2*6F\r\n");
receivedLength = UserUart_CheckForReceivedData(buffer);
pf.ProcessReceivedData(buffer, 0, receivedLength);
IsCheckingForAsyncOutputFreqResponse = false;
Console.WriteLine("Reading current values of the VPE Basic Control register.");
IsCheckingForVpeBasicControlResponse = true;
UserUart_SendData(p3.Data);
UserUart_MockReceivedData("$VNRRG,35,1,1,1,1*75\r\n");
receivedLength = UserUart_CheckForReceivedData(buffer);
pf.ProcessReceivedData(buffer, 0, receivedLength);
IsCheckingForVpeBasicControlResponse = false;
Console.WriteLine("Writing new values to the VPE Basic Control register.");
var p4 = Packet.GenCmdWriteVpeBasicControl(
enable,
0,
filteringMode,
tuningMode);
IsCheckingForVpeBasicControlResponse = true;
UserUart_SendData(p4.Data);
UserUart_MockReceivedData("$VNWRG,35,1,0,1,1*71\r\n");
receivedLength = UserUart_CheckForReceivedData(buffer);
pf.ProcessReceivedData(buffer, 0, receivedLength);
IsCheckingForVpeBasicControlResponse = false;
var p5 = Packet.GenCmdWriteBinaryOutput1(
200,
UserUart_SendData(p5.Data);
UserUart_MockReceivedData(new byte[] { 0xFA, 0x01, 0x09, 0x00, 0x70, 0x05, 0x00, 0x03, 0x0A, 0x00, 0x00, 0x00, 0x48, 0x0E, 0x2C, 0x42, 0x08, 0x4C, 0x37, 0xC1, 0x10, 0x38, 0x8B, 0xC2, 0xD4, 0xCB });
receivedLength = UserUart_CheckForReceivedData(buffer);
pf.ProcessReceivedData(buffer, 0, receivedLength);
UserUart_MockReceivedData("$VNERR,12*72\r\n");
receivedLength = UserUart_CheckForReceivedData(buffer);
pf.ProcessReceivedData(buffer, 0, receivedLength);
}
private static void ValidPacketFoundHandler(object sender, PacketFoundEventArgs args)
{
var packet = args.FoundPacket;
{
if (packet.IsAsciiAsync)
{
{
vec3f ypr, mag, accel, angularRate;
packet.ParseVNYMR(out ypr, out mag, out accel, out angularRate);
Console.WriteLine("[Found VNYMR Packet]");
Console.WriteLine(" YawPitchRoll: {0}", ypr);
Console.WriteLine(" Magnetic: {0}", mag);
Console.WriteLine(" Acceleration: {0}", accel);
Console.WriteLine(" Angular Rate: {0}", angularRate);
}
}
else if (packet.IsResponse)
{
if (IsCheckingForModelNumberResponse)
{
var modelNumber = packet.ParseModelNumber();
Console.WriteLine("Model Number: {0}", modelNumber);
}
else if (IsCheckingForAsyncOutputFreqResponse)
{
var asyncFreq = packet.ParseAsyncDataOutputFrequency();
Console.WriteLine("Asynchronous Output Frequency: {0}", asyncFreq);
}
else if (IsCheckingForVpeBasicControlResponse)
{
packet.ParseVpeBasicControl(out enable, out headingMode, out filteringMode, out tuningMode);
Console.WriteLine("[VPE Basic Control]");
Console.WriteLine(" Enable: {0}", enable != 0);
Console.WriteLine(
" Heading Mode: {0}", (
HeadingMode) headingMode);
Console.WriteLine(
" Filtering Mode: {0}", (
FilterMode) filteringMode);
Console.WriteLine(
" Tuning Mode: {0}", (
FilterMode) tuningMode);
}
}
else if (packet.IsError)
{
Console.WriteLine("Sensor Error: {0}", packet.Error);
}
}
{
if (!packet.IsCompatible(
{
return;
}
var timeStartup = packet.ExtractUint64();
var ypr = packet.ExtractVec3f();
Console.WriteLine("[Binary Packet Received]");
Console.WriteLine(" TimeStartup: {0}", timeStartup);
Console.WriteLine(" Yaw Pitch Roll: {0}", ypr);
}
}
private static byte[] _mockUartReceivedData;
public static void UserUart_Initialize()
{
}
public static void UserUart_MockReceivedData(byte[] data)
{
_mockUartReceivedData = data;
}
public static void UserUart_MockReceivedData(string data)
{
UserUart_MockReceivedData(Encoding.ASCII.GetBytes(data));
}
public static int UserUart_CheckForReceivedData(byte[] buffer)
{
if (_mockUartReceivedData == null)
return 0;
Buffer.BlockCopy(_mockUartReceivedData, 0, buffer, 0, _mockUartReceivedData.Length);
var dataLength = _mockUartReceivedData.Length;
_mockUartReceivedData = null;
return dataLength;
}
public static void UserUart_SendData(byte[] data)
{
}
}