请问485通信,单片机怎么知道一个包收完没有?
请问485通信,单片机怎么知道一个包收完没有? 每接收到一字节开定时器,定时时间为当前波特率下3.5个字节的时间,如果定时中断发生了,说明一包结束了,这样说你的明白? 自己写协议 本帖最后由 oufuqiang 于 2013-3-29 22:50 编辑二楼说的是Modbus-RTU 定时器判断超时就可以了,也叫帧中断 有没有谁提供我一个参考程序? 自己设计协议。一般在协议头部,前几个 字节的位置,放一两个字节用来说明本帧的长度就可以了。接收方收到这个字节之后就能计数了。
例子可以看以太网的协议就比较好,就是IEEE 802.3例程可能不多,看例程的话,可以找些简单的IP协议的实现,单片机上的肯定比PC机的程序简单、容易看 HadesHe 发表于 2013-3-29 20:39 static/image/common/back.gif
每接收到一字节开定时器,定时时间为当前波特率下3.5个字节的时间,如果定时中断发生了,说明一包结束了, ...
我直接在接受中断中定义了变量,在主程序查询,这样应该行吧? 按MODBUS-RTU整吧,可靠性高许多 HadesHe 发表于 2013-4-6 22:44 static/image/common/back.gif
按MODBUS-RTU整吧,可靠性高许多
恩,挺前辈的。 bit Uart_RecvFlag; //liyang add on 2013.4.1
volatileunsignedcharrx_time=0; //liyang add on 2013.4.3
// USART Receiver interrupt service routine
interrupt 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=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==0x11) //命令0x11读测量值
message_is_read();
rx_counter=0;//指针复位
Uart_RecvFlag=1;
} 协议约定,or,固定长度。{:tongue:} 用发送完成中断试试?
页:
[1]