搜索
bottom↓
回复: 12

请问485通信,单片机怎么知道一个包收完没有?

[复制链接]

出0入0汤圆

发表于 2013-3-29 20:26:49 | 显示全部楼层 |阅读模式
请问485通信,单片机怎么知道一个包收完没有?

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2013-3-29 20:39:52 | 显示全部楼层
每接收到一字节开定时器,定时时间为当前波特率下3.5个字节的时间,如果定时中断发生了,说明一包结束了,这样说你的明白?

出10入113汤圆

发表于 2013-3-29 21:01:12 | 显示全部楼层
自己写协议   

出0入0汤圆

发表于 2013-3-29 22:45:40 来自手机 | 显示全部楼层
本帖最后由 oufuqiang 于 2013-3-29 22:50 编辑

二楼说的是Modbus-RTU

出0入0汤圆

发表于 2013-3-30 13:13:33 | 显示全部楼层
定时器判断超时就可以了,也叫帧中断

出0入0汤圆

 楼主| 发表于 2013-3-30 22:43:50 | 显示全部楼层
有没有谁提供我一个参考程序?

出0入0汤圆

发表于 2013-3-30 22:57:04 | 显示全部楼层
自己设计协议。一般在协议头部,前几个 字节的位置,放一两个字节用来说明本帧的长度就可以了。接收方收到这个字节之后就能计数了。

例子可以看以太网的协议就比较好,就是IEEE 802.3  例程可能不多,看例程的话,可以找些简单的IP协议的实现,单片机上的肯定比PC机的程序简单、容易看

出0入0汤圆

 楼主| 发表于 2013-4-6 22:37:18 | 显示全部楼层
HadesHe 发表于 2013-3-29 20:39
每接收到一字节开定时器,定时时间为当前波特率下3.5个字节的时间,如果定时中断发生了,说明一包结束了, ...

我直接在接受中断中定义了变量,在主程序查询,这样应该行吧?

出0入0汤圆

发表于 2013-4-6 22:44:15 | 显示全部楼层
按MODBUS-RTU整吧,可靠性高许多

出0入0汤圆

 楼主| 发表于 2013-4-7 22:45:35 | 显示全部楼层
HadesHe 发表于 2013-4-6 22:44
按MODBUS-RTU整吧,可靠性高许多

恩,挺前辈的。

出0入0汤圆

 楼主| 发表于 2013-4-7 22:47:27 | 显示全部楼层
bit Uart_RecvFlag;   //liyang add on 2013.4.1   
volatile  unsigned  char  rx_time=0; //liyang add on 2013.4.3
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
        char status,data;
        status=UCSRA;
        data=UDR;  
        Uart_RecvFlag=0;
        if(!Uart_RecvFlag)
        {  
            if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
            {
                rx_buffer[rx_counter]=data;
                if(data!=addr)
                    Uart_RecvFlag=1;
                else
                    Uart_RecvFlag=0;
                rx_counter++;
            }   
        }
        rx_time=2 ; //定时
}
/**********************
             发送:68 AA 68 11 02 02 01 75 16
             68+电表地址(1)+68+命令字(1)+长度(1)+数据标识(2)+校验码(1)+16
            返回:68 AA 68 11 08 02 17 08 98 01 F4 04 36 77 16
            68+电表地址(1)+68+命令字(1)+长度(1)+数据标识(2)+A(2)+B(2)+C(2)+校验码(1)+16


        **************************/
              
                // 测试485通信
                if(rx_time!=0)  rx_time--;  // 判断数据接收是否结束
                if((rx_time==0)&&( rx_counter!=0))
                {
                        if(rx_buffer[3]==0x11)   //命令0x11读测量值
                            message_is_read();
                        rx_counter=0;  //指针复位
                        Uart_RecvFlag=1;
                }   

出0入0汤圆

发表于 2013-4-7 23:09:52 | 显示全部楼层
协议约定,or,固定长度。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-8-26 03:21

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

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