本帖最后由 刘前辈 于 2011-12-28 13:01 编辑
有点想明白了,LZ的主从轮询协议大致是这样:…… 因此可以完善一下程序,只要上位机**重发协议,那么即使从站开机执行若干时间升级程序(错过了接收主站协议数据帧),但升级完毕后,最终会收到主站的重发协议数据。
void main_task _task_ 1
{
while(1)
{
......
......
if(flag_uart==1) //串口收到数据
{
flag_uart=0;
os_send_signal(2); //给任务2发信号
}
os_switch_task( );
}
}
//串口数据处理任务
void rece_task _task_ 2
{
while(1)
{
.......
os_wait1(K_SIG); // 等待信号
send_char(0x0d); // 串口发送数据
.......
flag_uart=0;
// os_wait1(K_SIG); //退出该任务,等待信号
}
}
//串口发送数据
void send_char(uchar g) //串口发送数据
{
// while(flag_send==1) //等待发送完成
// {
// os_wait1(K_SIG); //退出该任务,等待信号
// }
// os_wait2(K_TMO,2); //延时
TI=0; // 发送早已完成,否则不会收到上位机信号,除非全双工。
SBUF0=g; //发送数据
jyhe0+=g;
flag_send=1;
}
、、 |