完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
嗨,我正在使用CAN库,我需要把RxBuffer传递给一个函数。代码编译得很好,但是PIC总是重新启动,这里是我使用的代码。这个函数被声明成这样。在另一个文件中像这样手工使用。我想我没有正确地设置指向函数的指针。谢谢
以上来自于百度翻译 以下为原文 Hi, I'm using the CAN lib And i need to pass the RxBuffer to a function. The code compile well but the PIC reboot all the time, here is the code I use //CANRxMessageBuffer is a structure header for the CAN frame CANRxMessageBuffer * Rxmessage; ... Rxmessage = CANGetRxMessage(CAN_USED,CAN_RX_CHANNEL);//Read the buffer ... CAN_RX_BootUp(Rxmessage);//Send the buffer to a function The function is declared like this in the .h void CAN_RX_BootUp(CANRxMessageBuffer * Rx); and use like this in other file void CAN_RX_BootUp(CANRxMessageBuffer * Rx) { if((Rx->msgSID.SID > OBJ_BOOT_UP)&&(Rx->msgSID.SID <= (OBJ_BOOT_UP + IDSlaveMax))) { .... } } I think I've don't correctly set the pointer to my function. Thanks |
|
相关推荐
11个回答
|
|
试试这个:CANRxMessageBuffer*Rxmessage;Rxmessage=(CANRxMessageBuffer*)CANGetRxMessage(CAN_USED,CAN_RX_CHANNEL);//读取缓冲区
以上来自于百度翻译 以下为原文 Try this: CANRxMessageBuffer * Rxmessage; Rxmessage = (CANRxMessageBuffer * ) CANGetRxMessage(CAN_USED,CAN_RX_CHANNEL);//Read the buffer |
|
|
|
嗨,当然,*创建指针。在XC32中,CANGetRxMessage给了我们一个指针,我没有选择。所以我需要将这个指针传递到我的函数。
以上来自于百度翻译 以下为原文 Hi, of course the * create the pointer. in XC32 the CANGetRxMessage give us a pointer I've no choice. so I need to pass this pointer to my function. |
|
|
|
|
|
|
|
|
|
|
|
你把RxMead指向缓冲区了吗?或者CangeTrxMaseAGE()应该这样做?
以上来自于百度翻译 以下为原文 Have you pointed Rxmessage to a buffer? Or is CANGetRxMessage() supposed to do that? |
|
|
|
指针很好。问题是指针指向的缓冲区在哪里?
以上来自于百度翻译 以下为原文 A pointer is fine. The question is where is the buffer the pointer is pointing too? |
|
|
|
指针声明为thisCANRxMessageBuffer*Rxmessage;CANRxMessageBuffer声明为thistypedef union{struct{//这是CAN RX消息的SID部分。CAN_RX_MSG_SID msgSID;//这是CAN RX消息CAN_MSG_EID msgEID的EID部分;//这是//接收到的消息的数据有效负载部分。字节数据[8 ];};//如果消息缓冲器是/或从一个数据类型的CAN RX信道读取的话,这是可以使用的。字节DATAONLYSLGDATA(8);//这是可以作为32位/ /字组组织的RX消息。UINT32 messageWord[4];}CANRxMessageBuffer;函数CANGetRxMessage在编译器CANRxMessageBuffer*CANGetRxMessage(CAN_MODULE模块,CAN_CHANNEL通道)中这样声明;
以上来自于百度翻译 以下为原文 The pointer is declared like this CANRxMessageBuffer * Rxmessage; and CANRxMessageBuffer is declared like this typedef union { struct { // This is SID portion of the CAN RX message. CAN_RX_MSG_SID msgSID; // This is EID portion of the CAN RX message CAN_MSG_EID msgEID; // This is the data payload section of the // received message. BYTE data[8]; }; // This can be used if the message buffer is to // be read from a Data-Only type of CAN RX Channel. BYTE dataOnlyMsgData[8]; // This is CAN RX message organized as a set of 32 bit // words. UINT32 messageWord[4]; }CANRxMessageBuffer; the function CANGetRxMessage is declared like this in the compiler CANRxMessageBuffer * CANGetRxMessage(CAN_MODULE module, CAN_CHANNEL channel); |
|
|
|
你知道数据指针和数据本身的区别吗?C不自动分配数据。作为一个程序员,你必须做到这一点。如果你有一个指向数据的指针。然后直接传递指针。没有星星。(*)如果您使用的数据是AN&AMP;它的意思是“地址”
以上来自于百度翻译 以下为原文 Do you understand the difference between a pointer to data and the data itself? C does not automatically allocate data. You as a programer must do it. If you have a pointer that points at data. Then pass the pointer directly. No stars. (*) If you have the data you use an &. It means "the address of" |
|
|
|
没错,它仍然有效。我不确定从Chanz收到的返回类型。你说你认为它是指针,但不确定。你可能会遇到一个例外。如果它是一个例外,为什么不检查调用栈中的原因的确切位置。
以上来自于百度翻译 以下为原文 That is true it should still work. I was not sure the return type from the Can_receive. You said you think its a pointer but not sure. You might be getting an exception. if its an exception why dont you check the exact location of the cause in the Call stack. |
|
|
|
只是猜测,如果没有新消息,CangeTrxMeXAGE()返回null,需要处理吗?
以上来自于百度翻译 以下为原文 Just a guess, might CANGetRxMessage() return NULL if there is no new message, and you need to handle that? |
|
|
|
所以,是的,你需要检查NULL。
以上来自于百度翻译 以下为原文 /*************************** * CAN Receive * *************************/ CANRxMessageBuffer * CANGetRxMessage(CAN_MODULE module, CAN_CHANNEL channel) { /* This function return a pointer to * the next message to read. */ CAN_REGISTERS * canRegisters = (CAN_REGISTERS *) canModules[module]; if (canRegisters->canFifoRegisters[channel].CxFIFOINTbits.RXNEMPTYIF == 0) { return (NULL); } else { return ((CANRxMessageBuffer *) PA_TO_KVA1(canRegisters->canFifoRegisters[channel].CxFIFOUA)); } } So, yes, you need to check for NULL. |
|
|
|
只有小组成员才能发言,加入小组>>
5250 浏览 9 评论
2037 浏览 8 评论
1958 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3218 浏览 3 评论
请问电源和晶体值之间有什么关系吗?PIC在正常条件下运行4MHz需要多少电压?
2266 浏览 5 评论
791浏览 1评论
682浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
613浏览 1评论
PIC Kit3出现目标设备ID(00000000)与预期的设备ID(02c20000)不匹配。是什么原因
686浏览 0评论
584浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-29 14:43 , Processed in 1.437029 second(s), Total 96, Slave 80 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号