1、我从串口设备获取到一个十六进制数据(接收的是字符串,直接看的话是乱码);
2、我的处理程序:
/// <summary>
/// 数据接收转换为十六进制字符串
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string StringToHex(string str)
{
byte[] ByteFoo = System.Text.Encoding.Default.GetBytes(str);
string TempStr = "";
foreach (byte b in ByteFoo)
{
TempStr += b.ToString("X2"); //X表示十六进制显示
}
return TempStr;
}3、前后四个怎么变都会转换正确的,就主要中间那部分,每个字节的高位超过7就会被转为 3F
转换正确
传输的数据: AA55 0E06 100711182230FFFF(发送数据)
转出来的数据:AA55 0E06 100711182230FFFF(接收调用StringToHex方法,转换结果)转换错误
传输的数据: AA55 E006 100711182230FFFF
转出来的数据:AA55 3F 100711182230FFFF4、中间的0E06转不会出错,而E006就成了3F; 如果是1E06、2E06...7E06不会出错,但8E06就会被转成3F
5、中间10 07 11 18 22 30这串转化也同(4)的错误,只有AA 55和FF FF前后两个字节不会出错在此跪求高手指点一二,小弟实在没搞懂怎么的。分不够加哈
2、我的处理程序:
/// <summary>
/// 数据接收转换为十六进制字符串
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string StringToHex(string str)
{
byte[] ByteFoo = System.Text.Encoding.Default.GetBytes(str);
string TempStr = "";
foreach (byte b in ByteFoo)
{
TempStr += b.ToString("X2"); //X表示十六进制显示
}
return TempStr;
}3、前后四个怎么变都会转换正确的,就主要中间那部分,每个字节的高位超过7就会被转为 3F
转换正确
传输的数据: AA55 0E06 100711182230FFFF(发送数据)
转出来的数据:AA55 0E06 100711182230FFFF(接收调用StringToHex方法,转换结果)转换错误
传输的数据: AA55 E006 100711182230FFFF
转出来的数据:AA55 3F 100711182230FFFF4、中间的0E06转不会出错,而E006就成了3F; 如果是1E06、2E06...7E06不会出错,但8E06就会被转成3F
5、中间10 07 11 18 22 30这串转化也同(4)的错误,只有AA 55和FF FF前后两个字节不会出错在此跪求高手指点一二,小弟实在没搞懂怎么的。分不够加哈
byte[] ByteFoo = Convert.FromBase64String(serialPort2.ReadLine());
string TempStr = "";
foreach (byte b in ByteFoo)
{
TempStr += b.ToString(b); //X表示十六进制显示
}
byte[] ByteFoo = Convert.FromBase64String(str);
1.你确定信源(下位机或另一个程序)发来的数据是正确的
2.你要确定硬件是否正常,使用串口调试助手(sscomm32.exe)查看,是否串口收到的数据本来就有错误。
3.检查你程序如何缓存数据的,看是否会丢失,覆盖,或是错位。
4.如果数据没有错误,考虑有没有哪里并发操作在你读一半时候吧缓存改写了。你可以考虑参考我博客中的范例,你直接下载可以试试,如果我的范例程序没错,你可以对照检查一下你的程序。希望能给你有些启发。
C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。
C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?
C# 串口操作系列(3) -- 协议篇,二进制协议数据解析
个人认为问题不在串口!其实串口只只是负责帮你把流传出去,如果要确保流的正确性那么需要有一个类似TCP的报文传输控制协议。
如果没有可能会出这样的问题:
发送方把一串文字发出去,比如长度为500字节,
而接收方可能先收到250字节,那么这时反转成字符串时可能不能成功,因为汉字是占两个字节,也有可能某个字的高字节到了,而低字节没到。所以有报文控制协议的话就可以保正数据的完敕性。
题外话了。如果,楼主只是做测试,那么你
System.Text.Encoding.Default.GetBytes(str);来发送
就得用
System.Text.Encoding.Default.GetString(Buf, 0, n);来解析。
还是建议试试5楼“Base64”的方法。
private static byte[] strToHexByte(string hexString)
{
hexString = hexString.Replace(" ", "");
if ((hexString.Length % 2) != 0)
hexString += " ";
byte[] returnBytes = new byte[hexString.Length / 2];
for (int i = 0; i < returnBytes.Length; i++)
returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
return returnBytes;
}
{
string s = "";
data.ToList().ForEach(b => s += b.ToString("X02") + " ");
return s;
}
byte[] ByteFoo = System.Text.Encoding.Default.GetBytes(str);
这个的时候字节数:
AA55 0E06 100711182230FFFF 就是正确的12个字节
AA55 E006 100711182230FFFF 就只有11个字节了
1:先别转成十六进制,也别传String,直接转流,比如:ByteFoo = new {oxAA,ox55.....
}
2:再看接收的会不会少?
3:如果少了,可能是串口有问题、或是设置有误,如:波特率、校验等设置有误。
1、我从串口设备获取到一个十六进制数据(接收的是字符串,直接看的话是乱码);
你都已经接收到十六进制数据,还需要转换吗?为什么直接看的话是乱码?
一般,串口传输的应该是byte[]吧,你的string从哪里来的?
我需要的是十六进制字符串
直接读字节数组就可以了。我博客中不是有完整例子么?
//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致
int n = comm.BytesToRead;
//声明一个临时数组存储当前来的串口数据
byte[] buf = new byte[n];
//读取缓冲数据
comm.Read(buf, 0, n); //依次的拼接出16进制字符串
foreach (byte b in buf)
{
builder.Append(b.ToString("X2") + " ");
}