关于实现一个自定义的通讯协议的问题

xixuanshi2977 2017-08-29 10:41:47
背景:为一个设备写一套rs232转can的通讯协议,设备可能包含多个电机,温控开关等硬件。有一份rs485的通讯协议做参考,对232转can不太熟悉。
问题:1,实现控制的方式如何选择?是对模块进行控制(一个温控开关和多个电机组成一个模块),还是对单个电机单个硬件进行控制?
2,rs485是主从通讯,协议中包含有主机地址+从机地址,can中的帧ID是不是同等于地址?
3,标准帧的数据帧中包含以下字段:帧起始+仲裁段+控制段+数据段+crc+arc+帧结束,数据外的这些信息需要事先固定还是添加在232协议中传输过来?
4,写的一个粗糙的协议,求指正
...全文
280 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xixuanshi2977 2017-08-30
  • 打赏
  • 举报
回复
引用 2 楼 ilikeff8 的回复:
can有2个通道,一个通道接一个设备,但是硬件上允许设备串联,可以一个通道控制多个设备,通过协议查找设备 帧ID什么的完全看你设备里的嵌入式代码怎么解析,你固定一个ID都没问题, 最好用扩展帧,帧ID可以很长 但具体怎么实现就不是很清楚了,之前用的是厂商提供的开发包,自己只要定义扩展帧里的8个字节的数据块内容,包括自定义命令和参数 VCI_CAN_OBJ sendobj = new VCI_CAN_OBJ(); sendobj.RemoteFlag = controllerParam.FrameFormat; sendobj.ExternFlag = controllerParam.FrameType; sendobj.ID = frameID; sendobj.DataLen = Convert.ToByte(cmdData.Length / 2); for (int i = 0; i < 8; i++) { sendobj.Data[i] = Convert.ToByte("0x" + cmdData.Substring(i * 2, 2), 16); }
好的
ilikeff8 2017-08-29
  • 打赏
  • 举报
回复
can有2个通道,一个通道接一个设备,但是硬件上允许设备串联,可以一个通道控制多个设备,通过协议查找设备 帧ID什么的完全看你设备里的嵌入式代码怎么解析,你固定一个ID都没问题, 最好用扩展帧,帧ID可以很长 但具体怎么实现就不是很清楚了,之前用的是厂商提供的开发包,自己只要定义扩展帧里的8个字节的数据块内容,包括自定义命令和参数 VCI_CAN_OBJ sendobj = new VCI_CAN_OBJ(); sendobj.RemoteFlag = controllerParam.FrameFormat; sendobj.ExternFlag = controllerParam.FrameType; sendobj.ID = frameID; sendobj.DataLen = Convert.ToByte(cmdData.Length / 2); for (int i = 0; i < 8; i++) { sendobj.Data[i] = Convert.ToByte("0x" + cmdData.Substring(i * 2, 2), 16); }
大鱼> 2017-08-29
  • 打赏
  • 举报
回复
对模块控制比较好些,一条指令可以控制多个部位是最好的,只是做过这类协议的解析,一般都是一条指令控制一个模块。没有做个协议的设定,帮不到你了

110,533

社区成员

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

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

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