[求助] LPC1114串口数据接收丢失

pengfei0827   2015-12-10 10:02 楼主
各位大神,我用的是LPC1114的芯片,同时发送几条命令出去接收数据时,只能接收到一条命令返回的数据,如果一条命令返回的数据字节数太多的话也是接收不全,麻烦各位大神帮我看一下,下面是我的程序:
void SP485init2(uint32_t baudrate1)
{
        uint16_t usFdiv;
        uint32_t DL_value1,Clear1=Clear1;                                                                                                                //Clear2=Clear2解决Clear2=0时编译出现警告
        /*使能并设置串口2时钟*/
        //使能串口2时钟       
        LPC_SYSCON->SYSAHBCLKCTRL|=(1<<19);
       
        //串口2时钟分频为1:1
        LPC_SYSCON->UART1CLKDIV =0x01;       
       
        //8位传输,1个停止位,无奇偶校验,允许访问除数寄存器
        LPC_UART1->LCR = 0x83;                               
       
        //计算该波特率要求的除数锁存寄存器值
        DL_value1 = 48000000/16/baudrate1;
       
        //写除数锁存寄存器高位值
        LPC_UART1->DLM = DL_value1/256;
       
        //写除数锁存寄存器低位值
        LPC_UART1->DLL = DL_value1%256;
       
        //DLAB位置0,禁止对除数锁存寄存器的访问
        LPC_UART1->LCR = 0x03;
       
        //允许FIFO,清空Rx0FIFO 和 Tx0FIFO 8个字节触发
        LPC_UART1->FCR = 0xc7;
         
        //读UART1状态寄存器清空残留状态
        Clear1 = LPC_UART1->LSR;
       
        //开串口中断
        NVIC_EnableIRQ(UART1_IRQn);
        NVIC_SetPriority(UART1_IRQn,1);
       
        //开串口接收中断
        LPC_UART1->IER=0x01;
}


void UART1_IRQHandler(void)
{
        uint8_t errr=0;
        uint8_t i;
        while ((LPC_UART1->IIR&0x01) == 0)
        {                                                                                                                                                                       /*  判断是否有中断挂起          */
                switch ((LPC_UART1->IIR>>1)&0x07)                                 /*  判断中断标志                */
                {
                        case 0x02:                                                          /*  接收数据中断                */
                        {
                                P485count2 = 0;
                                P485rxOK2=1;
                                for(i=0;i                                 {
                                        P485buf2[P485count2]=LPC_UART1->RBR;
                                        P485count2++;
                                }
                                P485rxLEN2=P485count2;                                                                                                                                                        //存储数据长度
//                                P485buf2[P485count2]='\0';                                                                                                                                        //末尾加字符串结束符
                                break;
                        }
                       
                        case 0x06:                                                          /*  字符超时中断                */
                        {
                                P485count2 = 0;
                                P485rxOK2=1;
                                while ((LPC_UART1->LSR&0x01) == 0x01)                                                /*  判断数据是否接收完毕        */
                                {
                                        P485buf2[P485count2]=LPC_UART1->RBR;
                                        P485count2++;                                                                                                                                                                                        //清计数器
                                }
//                                while((LPC_UART1->LSR&0x01) == 0x01);
                                P485rxLEN2=P485count2;                                                                                                                                                        //存储数据长度
//                                P485buf2[P485count2]='\0';                                                                                                                                        //末尾加字符串结束符       
                                break;
                        }
                        default:
                                break;
                }
        }
}

void LPC_Read(uint8_t slave_id,uint16_t address,uint16_t RegCount)
{
        uint16_t crc_det = 0;
        uint8_t        MainSendBuf[10]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
        MainSendBuf[0]=slave_id;                                                                                                                                                                                                        //从机地址
        MainSendBuf[1]=0x03;                                                                                                                                                                                                                        //功能码
        MainSendBuf[2]=(uint8_t)(address>>8);                                                                                                                                                        //器件起始地址高字节
        MainSendBuf[3]=(uint8_t)address;                                                                                                                                                                        //器件起始地址低字节
        MainSendBuf[4]=(uint8_t)(RegCount>>8);                                                                                                                                                //寄存器数高字节
        MainSendBuf[5]=(uint8_t)RegCount;                                                                                                                                                                        //寄存器数低位
       
        crc_det = CRC16(MainSendBuf,6);                                                                                                                                                                                //算CRC16校验值
        MainSendBuf[6]=(uint8_t)(crc_det);                                                                                                                                                                //CRC校验低字节
        MainSendBuf[7]=(uint8_t)(crc_det>>8);                                                                                                                                                        //CRC校验高字节
       
        SP485Send2(MainSendBuf,8);
}


void pmc(void)                                                                                                                        
{
        LPC_Read(0x64,0x0016,0x0002);                                                                                                                                        //发送读请求命令
        delay_ms(20);
        LPC_Read(0X64,0X0020,0X0001);
        delay_ms(20);
        if(P485rxOK2==1)
        {       
                P485rxOK2=0;
                if(P485buf2[2]==0X04)
                {
//                        Regbuf[322] = P485buf2[3];
//                        Regbuf[323] = P485buf2[4];
//                        Regbuf[326] = P485buf2[5];
//                        Regbuf[327] = P485buf2[6];
                        SP485Send2(P485buf2,P485rxLEN2);
                       
                }
                else if(P485buf2[2]==0X02)
                {
//                        Regbuf[330] = P485buf2[3];
//                        Regbuf[331] = P485buf2[4];
                        SP485Send2(P485buf2,P485rxLEN2);
                }
        }                       
}


回复评论 (6)

麻烦各位大神了,检查了很久都没检查出结果来,着急啊
点赞  2015-12-10 10:03
做串口通信,有问题时,先用单片机自收自发试试,看看是发的问题还是收的问题,最好根据实际情况去修改。
我的博客
点赞  2015-12-10 10:26
引用: zhaojun_xf 发表于 2015-12-10 10:26
做串口通信,有问题时,先用单片机自收自发试试,看看是发的问题还是收的问题,最好根据实际情况去修改。

发送是没有问题的,就不知道接收哪里出了问题,我试了好久都没试出个结果来,麻烦版主帮我看一下可以吗,谢谢啦
点赞  2015-12-10 10:30
引用: pengfei0827 发表于 2015-12-10 10:30
发送是没有问题的,就不知道接收哪里出了问题,我试了好久都没试出个结果来,麻烦版主帮我看一下可以吗, ...

接收中断中不用搞太负责,仿真试试,直接在中断中把接收的数据放入缓冲,最好看看缓冲中是否丢数据。
我的博客
点赞  2015-12-10 13:40
                              P485count2 = 0;
                                P485rxOK2=1;
                                while ((LPC_UART1->LSR&0x01) == 0x01)                                                /*  判断数据是否接收完毕        */
                                {
                                        P485buf2[P485count2]=LPC_UART1->RBR;
                                        P485count2++;                                                                                                                                                                                        //清计数器
                                }
建议不要写这么复杂,中断里面,执行的东西,尽量,少而简单。一个变量++就够了。把寄存器的数送入数组。主循环中,判断变量的值,是否需要归零。
点赞  2015-12-17 21:30
引用: ienglgge 发表于 2015-12-17 21:30
P485count2 = 0;
                                P485rxOK2=1;
        ...

已经解决了,谢谢哈
点赞  2015-12-21 17:37
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复