我有一个覆盆子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。答案 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%正确。