在对串口2接收程序进行在ucosiii上移植时,发现发送给该串口的第二个字符会丢失。
程序的目的是使用串口二接收一个485端口发送出来的数据,对485信号进行了转ttl电平然后串口2接收,将接受到的字符存在一个数组中并对接收到的字符进行判断,若接收到指定字符如“EEE”则将这次接收到的字符串存放到消息队列中,等待任务处理。对接收到的字符串通过串口1打印出来发现,接收到的数据总丢失第二个字符,比如通过484端口发送字符串为“BEGABCDEFGEEE”,接收到的字符为“BGABCDEFGEEE”。以为是因为对结束字符判断中是“EEE”的原因才出错的,然后改为发送“ABCDEFGEEE”,接收到的数据仍然少第二个字符,为“ACDEFGEEE”。
还麻烦大家帮忙看看,如果描述不清楚,还希望大家谅解下,有不太清楚我的表述的还望在下面留言。谢谢了。
串口二中断处理代码:
void USART2_IRQHandler(void)
{
OS_ERR err;
static u8 mallocFlag=0;
static u8* pbuf=NULL;
static u8 RS485_RX_CNT=0; //接收到的数据长度
OSIntEnter();
if(mallocFlag==0)
{
mallocFlag=1;
pbuf=mymalloc(SRAMIN,20); //申请64个字节
}
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
{
pbuf[RS485_RX_CNT++]=USART_ReceiveData(USART2);//;读取接收到的数据USART2->DR
if((pbuf[RS485_RX_CNT-1]=='E') & (pbuf[RS485_RX_CNT-2]=='E') & (pbuf[RS485_RX_CNT-3]=='E'))
{
pbuf[RS485_RX_CNT]='\0'; //在字符串末尾加上一个结束符
//发送消息
OSQPost((OS_Q* )&RS485_Q,
(void* )pbuf,
(OS_MSG_SIZE)(RS485_RX_CNT+1),
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR* )&err);
if(err != OS_ERR_NONE)
{
myfree(SRAMIN,pbuf); //释放内存
}
mallocFlag=0;
RS485_RX_CNT=0;
}else if(RS485_RX_CNT==19){
pbuf[RS485_RX_CNT]='\0'; //在字符串末尾加上一个结束符
//发送消息
OSQPost((OS_Q* )&RS485_Q,
(void* )pbuf,
(OS_MSG_SIZE)RS485_RX_CNT,
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR* )&err);
if(err != OS_ERR_NONE)
{
myfree(SRAMIN,pbuf); //释放内存
}
mallocFlag=0;
RS485_RX_CNT=0;
}
}
OSIntExit();
}复制代码消息处理代码(局部):
u8 re_char[]="ABC"; //需要处理的字符串
//请求消息
p=OSQPend((OS_Q* )&RS485_Q,
(OS_TICK )200,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(OS_MSG_SIZE* )&size,
(CPU_TS* )0,
(OS_ERR* )&err);
if(p != NULL)
{
USAR1_Send_Data((u8*)p,size); //将接受到的字符串发送到PC
if( ( time_add=(strstr((char*)p,(char*)re_char)) ) !=NULL)
{
printf("时间设置不成功!\r\n");
}
printf("没有正确的时间字符串头\r\n");
myfree(SRAMIN,p); //释放内存
return ;
}复制代码 |