|
楼主 |
发表于 2012-1-5 13:53:42
|
显示全部楼层
问题找到了,是程序的问题。CRC16校验出了问题。
由于之前的程序稍为改了一下。有些地方改漏了。就出现问题了。
void uart_isr() interrupt 4 using 3
{
符合要求;
CRC16(senddata,7); //CRC16校验
sendarray(senddata,9); //发送senddata这个数组
}
void main()
{
while(1)
{
loaddata();//更新senddata的数据。
}
}
上面是很久之前的旧程序。这样是没问题的,但不想在中断里做帮多的事,就改了一下
void uart_isr() interrupt 4 using 3
{
符合要求;
CRC16(senddata,7);
sendbit==1
}
void main()
{
while(1)
{
loaddata();//更新senddata里的数据
if(sendbit==1)
{
sendarray(senddata,9);
sendbit=0;
}
}
}
由于改在匆忙,出现问题了。
CRC校验还放在串口中断里,忘记放回到主程序里,这样就会导致有可能在数据发送前,senddata里面的数据被更新了,但CRC16的校验值没更新到,所以发送过去的数据CRC校验就是错误的,所以会导致有时接收到无效数据。
再改一下就OK了
void uart_isr() interrupt 4 using 3
{
符合要求;
sendbit==1
}
void main()
{
while(1)
{
loaddata();//更新senddata里的数据
if(sendbit==1)
{
CRC16(senddata,7);
sendarray(senddata,9);
sendbit=0;
}
}
} |
|