大牛看看,我的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;
                        }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
huangyiting1990
1楼-- · 2020-01-19 23:47
这样不行吧,定时器频率太低了,IO模拟的串口,中断时间至少是3倍于串口速率吧,每位数据采样三次以上。我之前写过一次。没啥问题
devcang
2楼-- · 2020-01-20 00:10
容易受干扰。建议不使用中断,而是独占接收一位数据
dengxm2009
3楼-- · 2020-01-20 04:02
huangyiting1990 发表于 2015-7-29 08:20
这样不行吧,定时器频率太低了,IO模拟的串口,中断时间至少是3倍于串口速率吧,每位数据采样三次以上。我 ...

我试一下,改成4倍波特率采集,3选2采集数据位看看。
zhugean
4楼-- · 2020-01-20 05:28
必须判起始位的下降沿中断,然后定时延时取数,光定时中断是不行的
dengxm2009
5楼-- · 2020-01-20 11:14
 精彩回答 2  元偷偷看……
xiaolaba
6楼-- · 2020-01-20 11:47
dengxm2009 发表于 2015-7-29 23:23
定时器的速率由于代码太多,在没办法提高了,中断程序的代码量影响定时中断的时间间隔呀。 ...

https://xiaolaba.wordpress.com/2014/02/28/8051-software-uart/

一周热门 更多>