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
请问这是为什么呢?
急!!!!
...全文
2689 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。
还有就是,在发送第一种情况的数组后,再用能够正常收发的程序去发,电脑就会关机。
请问您有思路吗?谢谢了!
【原创改进代码】基于分段损耗与需求侧响应的多源协同阶梯碳价储能优化模型(Python代码实现)内容概要:本文介绍了一个基于Python实现的“原创改进代码”——多源协同阶梯碳价储能优化模型,该模型融合了分段损耗特性与需求侧响应机制,旨在提升能源系统的运行效率与低碳水平。通过对储能系统、多种能源出力及碳排放成本的联合优化,模型实现了在复杂电力系统环境下的精细化调度。文档还展示了大量相关科研方向的技术资源,涵盖智能优化算法、机器学习、深度学习、电力系统仿真、路径规划、信号处理等多个前沿领域,并提供了MATLAB/Simulink仿真模型与Python代码实例,突出其在科研复现与工程实践中的应用价值。; 适合人群:具备一定编程基础和电力系统、能源优化背景的研究生、科研人员及工程技术人员,尤其适合从事综合能源系统、低碳调度、储能优化等相关课题研究的人员。; 使用场景及目标:①用于多能源系统中储能配置与运行策略的优化设计;②支撑碳交易机制下的低碳经济调度研究;③作为学术论文复现、算法改进与科研项目开发的技术参考; 阅读建议:此资源以实际代码实现为核心,建议读者结合文中提供的仿真案例与算法框架,动手实践并调试代码,深入理解模型构建逻辑与优化机制,同时可拓展应用于自身研究场景。

111,120

社区成员

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

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

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