打印

单片机串口通讯问题

[复制链接]
2265|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bing103|  楼主 | 2009-9-24 12:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
coldra| | 2009-9-24 12:52 | 只看该作者
串口接收用中断方式接收后放到缓存,处理led、lcd 、键盘等在主程序里,本来不会矛盾的,与通讯协议无关,协议处理可以放在主程序里慢慢做,也可以最后一个字节中断后马上处理

使用特权

评论回复
板凳
bluerain| | 2009-9-24 12:54 | 只看该作者
支持LS

使用特权

评论回复
地板
因特网用户| | 2009-9-24 13:01 | 只看该作者
RAM多大啊  有没有那么多啊 2# coldra

使用特权

评论回复
5
woshiwml| | 2009-9-24 17:19 | 只看该作者
:)

使用特权

评论回复
6
bing103|  楼主 | 2009-9-24 17:42 | 只看该作者
请教2楼:是否每接受到一个字节都做出响应?如果要的话,是不是很占用cpu?

使用特权

评论回复
7
bing103|  楼主 | 2009-9-24 17:46 | 只看该作者
补充一下:是否像I2C那样,每接收到一字节都要ACK,以确认字节已经收到,告诉从机再发剩下的字节

使用特权

评论回复
8
ningling_21| | 2009-9-24 22:52 | 只看该作者
回楼上,不需要的

使用特权

评论回复
9
二脚四分| | 2009-9-27 09:33 | 只看该作者
看你单片机的速度了,还有串口数据的重要性了!

使用特权

评论回复
10
wjp2009| | 2009-9-27 10:13 | 只看该作者
我做过两个串口一起工作的,都是应答式的,各项功能挺正常

使用特权

评论回复
11
mohanwei| | 2009-9-27 10:25 | 只看该作者
帧头 addr len data[] CRC16 帧尾
中断接收,外部大循环判断“帧接收完成标记”读取处理,收个四五K都不会影响到键盘显示什么的。

使用特权

评论回复
12
bing103|  楼主 | 2009-9-27 10:33 | 只看该作者
请问一下楼上的,中断里需要对帧头做判断吗?还是连帧头帧尾全部一起接收放到缓存里到主程序里做处理?9600的波特率

使用特权

评论回复
13
wjp2009| | 2009-9-27 10:37 | 只看该作者
“连帧头帧尾全部一起接收”
你如何确定你接收到的是包括帧头帧尾?

使用特权

评论回复
14
bing103|  楼主 | 2009-9-27 10:43 | 只看该作者
帧头和帧尾都是固定的字符

使用特权

评论回复
15
5880527| | 2009-9-27 10:44 | 只看该作者
9600速度很慢的,不会影响到其他

使用特权

评论回复
16
bing103|  楼主 | 2009-9-27 10:46 | 只看该作者
恩,485通讯

使用特权

评论回复
17
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);//保存接收字节到接收缓冲区中
    }
……
}

使用特权

评论回复
18
mohanwei| | 2009-9-27 12:29 | 只看该作者
以上例程对于半双工通信传输来说简直是无懈可击了……至于协议处理,就不便发了

使用特权

评论回复
19
bing103|  楼主 | 2009-9-27 13:58 | 只看该作者
非常感谢 mohanwei!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

36

帖子

0

粉丝