单片机串口通讯问题

[复制链接]
 楼主| bing103 发表于 2009-9-24 12:16 | 显示全部楼层 |阅读模式
串口需要一次接收128字节的数据,有什么高效的通讯协议或者处理方法?单片机还要处理led、lcd 、键盘,请大虾指点一下
coldra 发表于 2009-9-24 12:52 | 显示全部楼层
串口接收用中断方式接收后放到缓存,处理led、lcd 、键盘等在主程序里,本来不会矛盾的,与通讯协议无关,协议处理可以放在主程序里慢慢做,也可以最后一个字节中断后马上处理
bluerain 发表于 2009-9-24 12:54 | 显示全部楼层
支持LS
因特网用户 发表于 2009-9-24 13:01 | 显示全部楼层
RAM多大啊  有没有那么多啊 2# coldra
woshiwml 发表于 2009-9-24 17:19 | 显示全部楼层
 楼主| bing103 发表于 2009-9-24 17:42 | 显示全部楼层
请教2楼:是否每接受到一个字节都做出响应?如果要的话,是不是很占用cpu?
 楼主| bing103 发表于 2009-9-24 17:46 | 显示全部楼层
补充一下:是否像I2C那样,每接收到一字节都要ACK,以确认字节已经收到,告诉从机再发剩下的字节
ningling_21 发表于 2009-9-24 22:52 | 显示全部楼层
回楼上,不需要的
二脚四分 发表于 2009-9-27 09:33 | 显示全部楼层
看你单片机的速度了,还有串口数据的重要性了!
wjp2009 发表于 2009-9-27 10:13 | 显示全部楼层
我做过两个串口一起工作的,都是应答式的,各项功能挺正常
mohanwei 发表于 2009-9-27 10:25 | 显示全部楼层
帧头 addr len data[] CRC16 帧尾
中断接收,外部大循环判断“帧接收完成标记”读取处理,收个四五K都不会影响到键盘显示什么的。
 楼主| bing103 发表于 2009-9-27 10:33 | 显示全部楼层
请问一下楼上的,中断里需要对帧头做判断吗?还是连帧头帧尾全部一起接收放到缓存里到主程序里做处理?9600的波特率
wjp2009 发表于 2009-9-27 10:37 | 显示全部楼层
“连帧头帧尾全部一起接收”
你如何确定你接收到的是包括帧头帧尾?
 楼主| bing103 发表于 2009-9-27 10:43 | 显示全部楼层
帧头和帧尾都是固定的字符
5880527 发表于 2009-9-27 10:44 | 显示全部楼层
9600速度很慢的,不会影响到其他
 楼主| bing103 发表于 2009-9-27 10:46 | 显示全部楼层
恩,485通讯
mohanwei 发表于 2009-9-27 12:25 | 显示全部楼层
//写一个字节到串口0接收缓冲区中,解析转义字符
void Uart0_Write_RX_Buff(uchar ch)
{
        if(Uart0.Frame)//上一帧数据尚未处理
        {
                return;
        }
        if(Uart0.RxLen>_Uart0_RxBuffLen)//缓冲区溢出
        {
                Uart0.RxLen=0;
        }

        if(ch==0xAA)//收到帧头
        {
                Uart0.RxLen=0;
                Uart0.ZhuanYi=0;
        }
        else if(ch==0xA9)//收到帧尾
        {
                Uart0.Frame++;//外面的主循环不断判断这个帧标记即可……
        }
        else if(ch==0xA8)//转义字符
        {
                Uart0.ZhuanYi=1;
        }
        else
        {
                if(Uart0.ZhuanYi)
                {
                        if(ch<=2)
                        {
                                Uart0.RxBuff[Uart0.RxLen++]=0xA8+2-ch;
                        }
                        else//转义出错
                        {
                                Uart0.RxLen=0;
                        }
                        Uart0.ZhuanYi=0;
                }
                else
                {
                        Uart0.RxBuff[Uart0.RxLen++]=ch;//普通字节
                }
        }
}

//串口0中断服务程序
void Uart0_Isr(void) interrupt UART0_VECTOR
{
    char ch;
    ……
    if(RI)
    {
        RI=0;
        ch = SBUF0;
                Uart0_Write_RX_Buff(ch);//保存接收字节到接收缓冲区中
    }
……
}
mohanwei 发表于 2009-9-27 12:29 | 显示全部楼层
以上例程对于半双工通信传输来说简直是无懈可击了……至于协议处理,就不便发了
 楼主| bing103 发表于 2009-9-27 13:58 | 显示全部楼层
非常感谢 mohanwei!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

36

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部