搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2015-7-28 22:26:50 | 显示全部楼层 |阅读模式
定时中断,中断采样时间和波特率一样

中断程序的代码

        // 接收数据代码段  接收部分分为几个状态  
                /*状态   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;
                        }

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2015-7-29 08:20:33 | 显示全部楼层
这样不行吧,定时器频率太低了,IO模拟的串口,中断时间至少是3倍于串口速率吧,每位数据采样三次以上。我之前写过一次。没啥问题

出0入0汤圆

发表于 2015-7-29 08:31:57 | 显示全部楼层
容易受干扰。建议不使用中断,而是独占接收一位数据

出0入0汤圆

 楼主| 发表于 2015-7-29 08:50:28 | 显示全部楼层
huangyiting1990 发表于 2015-7-29 08:20
这样不行吧,定时器频率太低了,IO模拟的串口,中断时间至少是3倍于串口速率吧,每位数据采样三次以上。我 ...

我试一下,改成4倍波特率采集,3选2采集数据位看看。

出0入0汤圆

发表于 2015-7-29 11:08:44 | 显示全部楼层
必须判起始位的下降沿中断,然后定时延时取数,光定时中断是不行的

出0入0汤圆

 楼主| 发表于 2015-7-29 23:23:19 | 显示全部楼层
定时器的速率由于代码太多,在没办法提高了,中断程序的代码量影响定时中断的时间间隔呀。

出0入0汤圆

发表于 2015-8-15 22:15:56 | 显示全部楼层
dengxm2009 发表于 2015-7-29 23:23
定时器的速率由于代码太多,在没办法提高了,中断程序的代码量影响定时中断的时间间隔呀。 ...

https://xiaolaba.wordpress.com/2014/02/28/8051-software-uart/
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 10:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表