Part Number:TMS320F280049Other Parts Discussed in Thread:C2000WARE
280049 DCAN 怎么在发送数据的时候改变数据长度?因为CAN一帧数据最长为8bytes,有时候从机返回给主机数据不一定是8个,可能是动态的,因此怎么在发送时候修改这个长度?
直接 使用函数 CAN_sendMessage(uint32_t base, uint32_t objID, uint16_t msgLen,const uint16_t *msgData); 参数 msgLen 不起作用,参数设为6,实际主机接收长度仍旧是8.
使用 CAN_sendMessage_updateDLC(uint32_t base, uint32_t objID, uint16_t msgLen,const uint16_t *msgData); 发送数据,主机会报错,数据异常。
Cherry Zhou:
您好我们已收到您的问题并升级到英文论坛寻求帮助,如有答复将尽快回复您。谢谢!
,
Li Cong:
谢谢!
,
Cherry Zhou:
您好,
Li Cong 说:DCAN 怎么在发送数据的时候改变数据长度
要发送的数据长度可以通过 DLC 字段进行配置。
Li Cong 说:为CAN一帧数据最长为8bytes,有时候从机返回给主机数据不一定是8个,可能是动态的,因此怎么在发送时候修改这个长度?
是的,接收器不知道要接收的帧的数据长度。可以是0到8之间的任何值。而且更重要的是,无需知道该长度。该信息嵌入在要接收的消息的 DLC 字段中。DLC 仅适用于要发送的数据,而不适用于要接收的数据。换句话说,DLC 字段是接收消息对象的"无关"字段。由于 DLC 字段嵌入到发送的帧中,因此接收报文对象可以确定正在传输的字节数量(因此需要接收)。
参数"msgLen"用于传递 DLC 值。
Li Cong 说:直接 使用函数 CAN_sendMessage(uint32_t base, uint32_t objID, uint16_t msgLen,const uint16_t *msgData); 参数 msgLen 不起作用,参数设为6,实际主机接收长度仍旧是8.
您是说即使对于一个发送消息目标,将msgLen 设置为6,但还是传输8个字节?还是说,即使接收帧的 DLC 值为6,也从接收报文对象读取8个字节?
直接针对不同长度使用此函数是没用的,因为它不会更新发送报文对象,正如以上答复中提到的。
Li Cong 说:使用 CAN_sendMessage_updateDLC(uint32_t base, uint32_t objID, uint16_t msgLen,const uint16_t *msgData); 发送数据,主机会报错,数据异常。
这就是开发此 API 的原因。不过此 API 中存在一个错误,现已修复,修复版本会再下一次更新时发布。
有关此问题的解决方法,请参阅以下帖子:
https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1117880/tms320f280049c-can_sendmessage_updatedlc-and-can_sendmessage-did-not-work-to-set-data-length?tisearch=e2e-sitesearch&keymatch=can_sendMessage_updateDLC
,
Li Cong:
谢谢。我下载的是官网最新的库 C2000Ware_4_01_00_00,这个确实有问题,按照您提供的方法:
修改msgCtrl &= CAN_IF1MCTL_DLC_M;为msgCtrl &= ~CAN_IF1MCTL_DLC_M;,问题已解决。
希望后来的人有所借鉴!