TI中文支持网
TI专业的中文技术问题搜集分享网站

C2000 Ware的使用

Other Parts Discussed in Thread:C2000WARE

1、使用的例程

can_ex2_loopback_interrupts

2、例程路径

C:\ti\c2000\C2000Ware_3_03_00_00\driverlib\f2838x\examples\cm\can\CCS

3、例程中没理解的部分

CAN_readMessage(uint32_t base, uint32_t objID, char *msgData);

上面这个CAN接收程序,有个注释,其中有句话说的是:

如果接收到的消息的DLC大于提供的msgData缓冲区,则可能发生缓冲区溢出。

4、想请教的问题

msgData缓冲区的大小,在什么地方能够查到呢?

使用CAN接收一条128字符长度的数据(发送端的数据速度是1Hz  25Hz  50Hz  100Hz),分成了16个包,每个8个字符。每次msgData接收到一包数据(8个字符),接着,数据转存到新的数组之后,这时候,需要接收下一包字符数据,接收之前,对msgData做了清0处理。处理完,再接收下一包数据。

这样的处理,有可能会出现上面说到的“缓冲区溢出吗?。

5、为何问这个问题

自己在写接收程序的时候,发现能正常接收到发送端的50Hz和100Hz的数据,并显示到串口中。但是25Hz及其以下的速度,我这边接收的时候,就会出错,错误的现象是,25Hz的发送速度,我这边一秒应该接收到25条数据,但是串口,每秒只能显示4条数据。

研究了很长时间,没明白是什么原因导致的。

6、接收程序和发送程序如下:

接收程序:

__interrupt void canaISR(void)
{
uint32_t status;

status = CAN_getInterruptCause(CANA_BASE);
// If the cause is a controller status interrupt, then get the status
//如果原因是控制器状态中断,则获取状态。
if(status == CAN_INT_INT0ID_STATUS)
{

status = CAN_getStatus(CANA_BASE);

if(((status & ~(CAN_STATUS_RXOK)) != CAN_STATUS_LEC_MSK) &&
((status & ~(CAN_STATUS_RXOK)) != CAN_STATUS_LEC_NONE))

{
//
// Set a flag to indicate some errors may have occurred.
//设置一个标志,表示可能发生了一些错误。
errorFlag = 1;
}
}
else if(status == RX_MSG_OBJ_ID)
{
// Get the received message
//分组接收数据
if(!recv_start_flag)
{
CAN_readMessage(CANA_BASE, RX_MSG_OBJ_ID, rxMsgData);
if(rxMsgData[1]=='#')
{
data_rev_ok=1;
for(my_i=1;my_i<8;my_i++)
{
my_rxdata[rxMsgData2_i++] = rxMsgData[my_i];
rxMsgData[my_i]=0;

}
}
else if(data_rev_ok==1)
{
for(my_i=1;my_i<8;my_i++)
{
my_rxdata[rxMsgData2_i++] = rxMsgData[my_i];
rxMsgData[my_i]=0;
if(my_rxdata[rxMsgData2_i-1] == '\n')
{
recv_start_flag = 1;
rxMsgData2_i = 0;
data_rev_ok=0;
break;
}
}
}
else
{
for(i=0;i<8;i++)
{
rxMsgData[i]=0;
}
}
}

CAN_clearInterruptStatus(CANA_BASE, RX_MSG_OBJ_ID);

errorFlag = 0;
}

CAN_clearGlobalInterruptStatus(CANA_BASE, CAN_GLOBAL_INT_CANINT0);

Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP9);
}

串口发送程序(写在了主函数中):

while(1)
{//rxMsgCount

if(recv_start_flag)
{
recv_start_flag = 0;
for(my_t=0;my_t<150;my_t++)
{
if(my_rxdata[my_t]==0)
{
continue;
}
SCI_writeCharBlockingFIFO(SCIA_BASE, my_rxdata[my_t]);
if(my_rxdata[my_t] == '\n')
//if(my_rxdata[my_t] == '*')
{
my_rxdata[my_t] = 0;
break;
}
my_rxdata[my_t] = 0;
}
//recv_start_flag = 0;
}
}

特来请教

谢谢

@vince:

my_rxdata是自己定义的转存的数组,因为需要将数据完整接收下来后,进行算法处理之后,再发出去

,

@vince:

my_rxdata是自己定义的转存的数组,因为需要将数据完整接收下来后,进行算法处理之后,再发出去

,

@vince:

接收的一条完整的数据特征是,帧头是#,帧尾是*

,

Susan Yang:

我们会在实验后给您回复

,

Susan Yang:

user6355257 说:msgData缓冲区的大小,在什么地方能够查到呢?

函数的原型如下

extern bool
CAN_readMessage(uint32_t base, uint32_t objID,uint8_t *msgData);

在 can_ex2_loopback_interrupts.c使用的是:

CAN_readMessage(CANA_BASE, RX_MSG_OBJ_ID, rxMsgData);

也就是缓冲区为rxMsgData的大小,在文件中有相关的定义

uint8_t rxMsgData[4];

您可以根据您的情况进行修改该缓冲区大小

,

@vince:

好的,辛苦了

,

@vince:

谢谢

赞(0)
未经允许不得转载:TI中文支持网 » C2000 Ware的使用
分享到: 更多 (0)