大牛看看,我的IO模拟Uart的程序误码率很高,帮忙看看!
定时中断,中断采样时间和波特率一样中断程序的代码
// 接收数据代码段接收部分分为几个状态
/*状态 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;
}
这样不行吧,定时器频率太低了,IO模拟的串口,中断时间至少是3倍于串口速率吧,每位数据采样三次以上。我之前写过一次。没啥问题 容易受干扰。建议不使用中断,而是独占接收一位数据 huangyiting1990 发表于 2015-7-29 08:20
这样不行吧,定时器频率太低了,IO模拟的串口,中断时间至少是3倍于串口速率吧,每位数据采样三次以上。我 ...
我试一下,改成4倍波特率采集,3选2采集数据位看看。 必须判起始位的下降沿中断,然后定时延时取数,光定时中断是不行的 定时器的速率由于代码太多,在没办法提高了,中断程序的代码量影响定时中断的时间间隔呀。 dengxm2009 发表于 2015-7-29 23:23
定时器的速率由于代码太多,在没办法提高了,中断程序的代码量影响定时中断的时间间隔呀。 ...
https://xiaolaba.wordpress.com/2014/02/28/8051-software-uart/
页:
[1]