大牛看看,我的IO模拟Uart的程序误码率很高,帮忙看看!

2020-01-19 19:43发布

定时中断,中断采样时间和波特率一样

中断程序的代码

        // 接收数据代码段  接收部分分为几个状态  
                /*状态   0:高电平查找中    1:起始位查找中    2:接收数据中    10:停止位已接受  11:接收完成   5:接收成功
                */
                if ( flag_rx_off==FALSE )//打开接收功能
                {
                        switch(simuart1_rx_status)
                        {
                        case 0://是高电平吗?是高电平进入下一个步骤                               
                                simuart1_rx_start_bit=get_rx_pin_status();
                                if (simuart1_rx_start_bit==1 )
                                {
                                        simuart1_rx_status=1;
                                }
                                else
                                {
                                        simuart1_rx_status=0;
                                }
                                break;

                        case 1://起始位查找中
                                simuart1_rx_start_bit=get_rx_pin_status();
                                if (simuart1_rx_start_bit==0 )
                                {
                                        simuart1_rx_status=2;//找到起始位,进入下一个步骤
                                }
                                else
                                {
                                        simuart1_rx_status=1;
                                }
                                break;
                        case 2://接收第0位
                                simuart1_rx_qout=0x00;
                                simuart1_rx_mask=get_rx_pin_status();//接收一个bit
                                simuart1_rx_qout |=simuart1_rx_mask;
                                simuart1_rx_status++;
                                break;
                        case 3://接收第1位
                                simuart1_rx_qout<<=1;
                                simuart1_rx_mask=get_rx_pin_status();//接收一个bit
                                simuart1_rx_qout |=simuart1_rx_mask;
                                simuart1_rx_status++;
                                break;
                        case 4://接收第2位
                                simuart1_rx_qout<<=1;
                                simuart1_rx_mask=get_rx_pin_status();//接收一个bit
                                simuart1_rx_qout |=simuart1_rx_mask;
                                simuart1_rx_status++;
                                break;
                        case 5://接收第3位
                                simuart1_rx_qout<<=1;
                                simuart1_rx_mask=get_rx_pin_status();//接收一个bit
                                simuart1_rx_qout |=simuart1_rx_mask;
                                simuart1_rx_status++;
                                break;
                        case 6://接收第4位
                                simuart1_rx_qout<<=1;
                                simuart1_rx_mask=get_rx_pin_status();//接收一个bit
                                simuart1_rx_qout |=simuart1_rx_mask;
                                simuart1_rx_status++;
                                break;
                        case 7://接收第5位
                                simuart1_rx_qout<<=1;
                                simuart1_rx_mask=get_rx_pin_status();//接收一个bit
                                simuart1_rx_qout |=simuart1_rx_mask;
                                simuart1_rx_status++;
                        case 8://接收第6位
                                simuart1_rx_qout<<=1;
                                simuart1_rx_mask=get_rx_pin_status();//接收一个bit
                                simuart1_rx_qout |=simuart1_rx_mask;
                                simuart1_rx_status++;
                                break;
                        case 9://接收第7位
                                simuart1_rx_qout<<=1;
                                simuart1_rx_mask=get_rx_pin_status();//接收一个bit
                                simuart1_rx_qout |=simuart1_rx_mask;
                                simuart1_rx_status++;
                                break;
                        case 10://接收停止位

                                simuart1_rx_stopbit=get_rx_pin_status();//接收一个bit
                                if (simuart1_rx_stopbit==1)
                                {
                                        simuart1_recv_sucess_flag=1;//停止位接收成功,置位接收成功标志
                                }
                                else
                                {
                                        simuart1_recv_sucess_flag=0;//接收失败
                                }
                                simuart1_rx_status=0;//重新进入接收状态                               
                                break;
                        default:
                                break;
                        }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。