//定时器1的回调函数
void tmr1_callback(void *p_tmr,void *p_arg)
{
u8 *pbuf;
static u8 msg_num;
OS_ERR err;
pbuf = mymalloc(SRAMIN,10); //申请10个字节
if(pbuf) //申请内存成功
{
msg_num++;
sprintf((char*)pbuf,"ALIENTEK %d",msg_num);
//发送消息
OSQPost((OS_Q* )&DATA_Msg,
(void* )pbuf,
(OS_MSG_SIZE)10,//发数量
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR* )&err);
if(err != OS_ERR_NONE)
{
myfree(SRAMIN,pbuf); //释放内存
OSTmrStop(&tmr1,OS_OPT_TMR_NONE,0,&err); //停止定时器1
tmr1sta = !tmr1sta;
LCD_ShowString(10,150,100,16,16,"TMR1 STOP! ");
}
}
}
//显示消息队列中的消息
void msgdis_task(void *p_arg)
{
u8 *p;
OS_MSG_SIZE size;
OS_ERR err;
while(1)
{
//请求消息
p=OSQPend((OS_Q* )&DATA_Msg,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(OS_MSG_SIZE* )&size,
(CPU_TS* )0,
(OS_ERR* )&err);
LCD_ShowString(5,270,100,16,16,p);//此处显示11个字符
myfree(SRAMIN,p); //释放内存
OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err); //延时1s
}
}
当msg_num加到大于9时pbuf好像超过了10字节吧,不明白 说好的是发送10个字节,接收的是11个字节。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
确实在读取size的值是一直是10,当msg_num加到10时 执行sprintf((char*)pbuf,"ALIENTEK %d",msg_num);时,以pbuf位首地址的字符是11个,LCD显示“”ALIENTEK 10“”,共11个字符。当请求到消息时没有读取消息长度,而直接给是字符串首地址。从而造成发送10个字节的消息,收到11个消息。
一周热门 更多>