求个简单c51程序!感谢
发布网友
发布时间:2024-10-09 11:26
我来回答
共1个回答
热心网友
时间:2024-12-05 11:37
“串口接收数组时对数组进行判断,如果7F 00开头的开始接收。”
事实上,你的这个说法是错误的,因为接收,是由不得你来决定的,只要有数据发给单片机,就得接收,你无从选择,所以,你这句话应该改成:
“串口接收数组时对数组进行判断,如果7F 00开头的就要进行数据处理。”
也就是说,你接收完成之后,进行判断,看看是不是以7F 00开头的,如果是,那么就处理,不是,说明本次数据不对,不处理:
看你的程序是一次只接收十个数据,那么修改如下:
void Com_Int(void) interrupt 4
{
EA = 0;
if(RI == 1) //当硬件接收到一个数据时,RI会置位
{
MY_Buffer[com_dat] = SBUF; //把从串口读出的数存到数组
RI = 0;
com_dat++;
if(com_dat ==10)
{
com_dat = 0; //当com_dat = 10时,清0,防止数组溢出
if((MY_Buffer[0] ==0x7F)&&(MY_Buffer[1] == 0x00))
{
//----这里面写你要处理的函数
}
}
EA = 1;
}
这样就可以了.
不过,说实话,我这么改,是因为你就给了我这么点程序,所以我只能在你的程序上修改,而其实际,你应该加个接收超时判断比较好,为了防止传送数据的过程中意外的掉线,那样比较稳妥追问假如超时时间为100ms 该怎么修改这个程序!帮人帮到底吧。谢谢了!
追答这个....100ms?太多了吧?
一般来说,超时,是为了防止掉线,或者发送方有问题,才设置的,一般10-20ms就已经不小了,你还100ms.
思路是这样的:
你先设置个变量 unsigned char Uart_Time_Out = 0;
然后,每次接收中断的时候,Uart_Time_Out = XX;这个XX的数值你自己确定,还要看定时器
然后,定时器中断里如下写:
if(Uart_Time_Out>0)
{
Uart_Time_Out--;
if(Uart_Time_Out == 0)
{
com_dat = 0;
}
}
这就可以了,那个XX 与 定时器中断时间有关系,总的XX与定时器中断周期的乘积大概在10-20ms就可以了.