普通IO口模拟串口接收数据如何及时响应

2019-03-24 17:27发布

网上找了好多io口模拟串口的例子,其中发送部分我自己已经实现了,但是碰到接收部分有些糊涂了,因为例子里在主循环中没有干其他工作,就是不断查看是否有串口接收起始标志位,然后一位一位接收数据,实际应用中显然不能这样啊,但是假如其他工作,又担心对及时响应接收数据产生影响。最后想到了,外部中断,但是如何用外部中断来接收串口数据还是没有头绪啊。希望有做过的能给个例子参考参考。
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
hljjxzhla
1楼-- · 2019-03-25 16:27
 精彩回答 2  元偷偷看……
hljjxzhla
2楼-- · 2019-03-25 19:52
lcofjp 发表于 2016-10-20 11:32
不行就加个串口扩展芯片

加芯片成本就增加了啊
hljjxzhla
3楼-- · 2019-03-26 00:24
汤权 发表于 2016-10-20 12:20
其实这个跟红外遥控的接收一样的,检测中断下降沿然后在中断里面接收数据,时序对了就行了的啊,另外你的头 ...

这是我的专属头像
hljjxzhla
4楼-- · 2019-03-26 01:44
 精彩回答 2  元偷偷看……
迈尔风随
5楼-- · 2019-03-26 07:18
hljjxzhla 发表于 2016-10-21 01:25
定时器中断里如何实现接收啊?有例子么?

相关资料在百度上有很多,你可以去看看
hljjxzhla
6楼-- · 2019-03-26 07:31
经过网上找例子,单位同事给了很多帮助,终于测试成功了串口接收的函数,波特率为9600,采用外部中断接收--外部中断设为下降沿触发,这样就可以及时响应串口数据的起始位,之后把外部中断关闭,在中断函数中接收完一个字节,再打开外部中断,退出中断函数。这样做后果是在接收过程中很难响应其他中断。而且我发现需要在检测到起始位之后延时两个位的时间(2/9600s)才能正常接收数据,否则收不到最高位。最后,感觉每次上电第一个接收的字节有些问题,但是之后的都是正常的。话不多说,先贴代码了
接收函数
void rxbyte(void)
{
        unsigned char i;
        if(RX==0)
        {
                delayrx(5);
                if(RX==0)
                {
                        P40=!P40;
                        delayrx(33);
                        readbuffer=0;
                        for(i=0;i<8;i++)
                        {
                                P40=!P40;
                                readbuffer>>=1;
                                if(RX==1)
                                {
                                        readbuffer|=0x80;
                                }
                                else if(RX==0)
                                {
                                        ;
                                }
                                delayrx(19);
                        }
                }
                else
                {
                        rxerror=1;
                }
        }
}

中断函数
void int_fun() __interrupt
{
        if(INT2IF)
        {
                INT2IF=0;
                INT2IE=0;
                rxbyte();
                INT2IE=1;
        }

}
另外由于各个单片机晶振和指令周期不同,以及各个编译器生成的汇编代码也不一样,所以延时函数需要自己去解决了。

一周热门 更多>