打印

stm32F4移植ucosiii使用串口2 接收字符串,出现第二个字符丢失

[复制链接]
300|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kaloulin|  楼主 | 2018-7-9 14:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在对串口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 ;
                }复制代码

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

439

主题

448

帖子

0

粉丝