C#串口发送直接赋值的字节数组和发送字符串转化后的字节数组有什么区别?

法号戒糖 2019-04-12 12:43:57
在做一个C#串口发送的程序的时候,发现了以下现象。
直接给数组赋值
byte[] sendData = new byte[12] {0x02,0x08, 0x01, 0x04, 0x11, 0x1C, 0x01, 0x1C, 0x02, 0x1C, 0x03, 0x00};
然后SendData(sendData);
发送给串口之后,下位机无法接收。
但是赋值给字符串再转成byte数组后,就可以接收了
string sendstringsample = "02 08 01 04 11 1C 01 1C 02 1C 03 00"; //直接赋值
byte[] sendData = strToHexByte(sendstringsample); //
SendData(sendData);
我的下位机是ARM7
请问这是为什么呢?
急!!!!
...全文
2583 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
liushun_csdn 2019-04-15
  • 打赏
  • 举报
回复
感谢分享感谢分享感谢分享
xiaoxiangqing 2019-04-15
  • 打赏
  • 举报
回复
调试一下看strToHexByte输出的是多少?
Bangheng008 2019-04-13
  • 打赏
  • 举报
回复
r串口调试助手
秋的红果实 2019-04-13
  • 打赏
  • 举报
回复
要说区别 直接赋值,数组的值,在编译时就确定了 后者,是在运行时从堆申请的空间,然后确定数组的值,动态的 检查你的运行环境,是不是只支持动态空间分配
吹风的兔子 2019-04-13
  • 打赏
  • 举报
回复
要么发动的字节不同,要么就是运气不好。


byte[] sendData1 = new byte[12] {0x02,0x08, 0x01, 0x04, 0x11, 0x1C, 0x01, 0x1C, 0x02, 0x1C, 0x03, 0x00};
string sendstringsample = "02 08 01 04 11 1C 01 1C 02 1C 03 00";  //直接赋值
byte[] sendData2 = strToHexByte(sendstringsample);

string str1 = string.Join("|", sendData1.Select(x=>x.ToString()));
string str2 = string.Join("|", sendData2.Select(x=>x.ToString()));

Console.WriteLine(str1 == str2); //不等于 true  就是 不想等


  • 打赏
  • 举报
回复
比如说,试试看是不是掷色子来随机改变测试方式,再测试20次?!
  • 打赏
  • 举报
回复
既然你都说了两次获得的 sendData 是完全一样的 12 个字节的 bytes,那么只能说说“点儿背、人品有问题”啦。
xiaobao510 2019-04-13
  • 打赏
  • 举报
回复
r串口调试助手
qq_34766405 2019-04-13
  • 打赏
  • 举报
回复
C#大神啊啊啊啊啊啊啊啊啊
stherix 2019-04-12
  • 打赏
  • 举报
回复
理论上是没有什么区别的 如果只是你写的这段代码,两者的sendData 应该是完全一样的(如果strToHexByte功能和预期的一样的话) 你可以在senddata设断点,看不同的代码data有什么区别
zhuowp 2019-04-12
  • 打赏
  • 举报
回复
两者发的数据不一样。

后面那个发送的字节是 30 32 20 30 38 20 30 31 20 30 34 20 31 31 20 31 43 20 30 31 20 31 43 20 30 32 20 31 43 20 30 33 20 30 30


字符串中每一个对应的字符,都转换成其二进制编码,包括空格。

不知道下位机无法接收是什么意思,如果是透传都没有数据,那我不太明白。如果只是这段指令发过去没反应和回复,说明你的下位机的协议用的就是字符串转为二级制这种方式。
路马 2019-04-12
  • 打赏
  • 举报
回复
或者你用串口调试助手监控一下,两者发送时,发出去的数据是否完全一致?
路马 2019-04-12
  • 打赏
  • 举报
回复
引用 9 楼 qq_41266316 的回复:
[quote=引用 8 楼 路马 的回复:]
我做个一个与你几乎一模一样的项目,其中有许多的发送指令都是直接发送byte数组的,从来没有问题。
估计你的问题出在别的地方,或者是接收方,也有可以是指令,波特率,接收缓存设置这些。

请问你接收方收到的数据类型是什么样的呢?我定义的是unsigned char数组。这样接收的话有什么问题吗?
但是我无法解释为什么这两种不一样的赋值方式会导致这样的结果。如果可以,可以私聊请教一下吗?谢谢了!特别着急。[/quote]接收方是一台linux嵌入式,看不到源码,我是按照厂家提供的协议书写的上位机。接收方有指定协议包括校验位,如果发送到指令格式不正确,接收方则返回错误。
法号戒糖 2019-04-12
  • 打赏
  • 举报
回复
引用 8 楼 路马 的回复:
我做个一个与你几乎一模一样的项目,其中有许多的发送指令都是直接发送byte数组的,从来没有问题。
估计你的问题出在别的地方,或者是接收方,也有可以是指令,波特率,接收缓存设置这些。

请问你接收方收到的数据类型是什么样的呢?我定义的是unsigned char数组。这样接收的话有什么问题吗?
但是我无法解释为什么这两种不一样的赋值方式会导致这样的结果。如果可以,可以私聊请教一下吗?谢谢了!特别着急。
路马 2019-04-12
  • 打赏
  • 举报
回复
我做个一个与你几乎一模一样的项目,其中有许多的发送指令都是直接发送byte数组的,从来没有问题。 估计你的问题出在别的地方,或者是接收方,也有可以是指令,波特率,接收缓存设置这些。
stherix 2019-04-12
  • 打赏
  • 举报
回复
引用 6 楼 qq_41266316 的回复:
[quote=引用 2 楼 stherix 的回复:] 理论上是没有什么区别的 如果只是你写的这段代码,两者的sendData 应该是完全一样的(如果strToHexByte功能和预期的一样的话) 你可以在senddata设断点,看不同的代码data有什么区别
没有什么区别。。所以我想问字符串转成字节数组和直接赋值给数组这两者有什么区别吗?[/quote]饿 没有,应该是其他的原因导致的
法号戒糖 2019-04-12
  • 打赏
  • 举报
回复
引用 2 楼 stherix 的回复:
理论上是没有什么区别的
如果只是你写的这段代码,两者的sendData 应该是完全一样的(如果strToHexByte功能和预期的一样的话)
你可以在senddata设断点,看不同的代码data有什么区别

没有什么区别。。所以我想问字符串转成字节数组和直接赋值给数组这两者有什么区别吗?
法号戒糖 2019-04-12
  • 打赏
  • 举报
回复
引用 4 楼 zhuowp 的回复:
贴一下strToHexByte这个方法的实现代码看看


//
//
//字符串转十六进制字节数组
private 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;
}
zhuowp 2019-04-12
  • 打赏
  • 举报
回复
贴一下strToHexByte这个方法的实现代码看看
法号戒糖 2019-04-12
  • 打赏
  • 举报
回复
引用 1 楼 zhuowp 的回复:
两者发的数据不一样。

后面那个发送的字节是 30 32 20 30 38 20 30 31 20 30 34 20 31 31 20 31 43 20 30 31 20 31 43 20 30 32 20 31 43 20 30 33 20 30 30


字符串中每一个对应的字符,都转换成其二进制编码,包括空格。

不知道下位机无法接收是什么意思,如果是透传都没有数据,那我不太明白。如果只是这段指令发过去没反应和回复,说明你的下位机的协议用的就是字符串转为二级制这种方式。


首先,我的字符串转十六进制数组程序是忽略空格去转的。所以不存在把空格也转了的问题。
然后,我用控制台
for (int i = 0; i < 12; i++)
{
Console.WriteLine(sendData[i]);

}
看了一下两种情况下senddata的值,都是一样的。
你说的下位机用的是字符串转二进制,应该是这样,用的是unsigned char。
还有就是,在发送第一种情况的数组后,再用能够正常收发的程序去发,电脑就会关机。
请问您有思路吗?谢谢了!

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧