串行输入为十六进制以解析C#

时间:2014-03-12 15:04:27

标签: c# serial-port raspberry-pi ftdi

我有一个覆盆子Pi,我的环境是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 

十六进制是预期的消息,因为它包含我需要的所有相关数据(start,id,date,lat,long,lrc,end)。

我已经设置了我的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;
    }

我也尝试过在另一篇文章中找到的Bit Converter。

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

        return GPSrxString;
    }

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

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

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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);

答案 2 :(得分: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%正确。