3

我有一个树莓派,我的环境是 C#。基本上我通过无线设备发送 GPS (GPRMC) 数据。Rx 无线设备读取数据并删除不必要的信息。Tx 端正在发送 GPRMC 消息(我使用的是 bray 终端)

$24GPRMC,123123.00,A,2753.13285,N,08232.29411,W,0.021,,011113,,,D*6D

当我在 RPi 上使用 CuteCom 时,我得到了这个:

\0xaa\0x02G\0xf0y\0x7fE,\0x12 \0xc6\0x00\0xa1-\0xcfU

常规(未选中十六进制输出框)

或在十六进制中(选中十六进制输出框时):

aa 02 47 f0 79 7f 45 2c   12 20 c6 00 a1 2d cf 55 

十六进制是预期的消息,因为它包含我需要的所有相关数据(开始、ID、日期、纬度、经度、lrc、结束)。

我已经设置了我的 C# 代码来读取串行数据,但似乎无法让它以这种方式显示数据。

这是我迄今为止在 C# 中所拥有的:

        public static void Main ()
    {
        SerialPort serial = new SerialPort ("/dev/ttyUSB0", 115200);
        serial.Open ();


        while (true) 
        {
            string data = ReadData(serial);

            if(!string.IsNullOrEmpty(data))
            {
                Console.WriteLine(data);

            }
        }
    }

    public static string ReadData (SerialPort serial)
    {
        string rxString = "";

        rxString += serial.ReadExisting();

        return rxString;
    }

对于我得到的输出:

?G?yE, ??-?U

我也尝试过流阅读器,但这不起作用:

    public static string ReadData2 (System.IO.Stream s)
    {

        StreamReader sr = new StreamReader (s);
        DataString = sr.ReadLine ();

        return DataString;
    }

我也尝试过使用我在另一篇文章中找到的位转换器。

    private static string ReadData3 (SerialPort serial)
    {
        GPSrxString += serial.ReadExisting();
        string GPSrxStringhex = BitConverter.ToString(Encoding.ASCII.GetBytes(GPSrxString));

        return GPSrxString;
    }

所以在这一切之后,我被困住了。我哪里错了。我需要做什么才能获得正确/所需的十六进制输出?

编辑:我在这里使用了字符串,但我最终发现字符串不是要走的路,它是不必要的。使用数组来保存所有值并从那里开始。您可以在下面的答案中计算所需的数字,例如 UTC。

4

3 回答 3

4

看起来数据是二进制的,但您的ReadData实现将其视为 ASCII 字符串(因此是奇怪的字符)。尝试读入二进制数据,然后将其转换为十六进制值的字符串表示形式:

public static string ReadData(SerialPort serial)
{
    byte[] buffer = new byte[serial.BytesToRead];
    serial.Read(buffer, 0, buffer.Length);

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < buffer.Length; i++)
        sb.AppendFormat("{0:X2} ", buffer[i]);

    return sb.ToString();
}
于 2014-03-12T15:39:17.183 回答
1

根据对我的第一个答案的评论,回答您问题的第二部分:

假设您有以下数据:

byte[] data = new byte[] {0xAA, 0x02, 0x47, 0xF0, 0x79, 0x7F};

我们需要跳过前两个字节,然后取剩下的四个字节。在转换为浮点数之前,我们还需要反转字节顺序:

byte[] data2 = data.Skip(2).Take(4).Reverse().ToArray();

现在我们可以转换:

float val = System.BitConverter.ToSingle(data2, 0);
于 2014-03-13T13:52:42.010 回答
0

我一直使用这种类型的代码:

public static string ReadData (SerialPort s)
{
    string DataString = "";
    int nByte = s.BytesToRead;
    for (i=0;i<nByte;i++)
    {
        int byteTemp = s.ReadByte();
        DataString += (char)(byteTemp);
    }
    return DataString;
}

这是来自 VB.Net 的直接翻译,我不确定 sintax 是否 100% 正确。

于 2014-03-12T15:24:52.393 回答