[mw_shl_code=c,true]电脑发送这串协议数据0xaa 0x11 0x01 0x12 0x00 0x01 0x05 0x07 0x00 0x00 0x00 0x20 0xbf 0x55,然后是有返回规定的数据的。然后
[/mw_shl_code]
[mw_shl_code=c,true]程序一直执行出错。曾经用接收函数测试过,接收到数据,然后再返回电脑。数据没错。但是用下面的
[mw_shl_code=c,true]void UartCheck(void)函数就出错了。我这里是一边接收一边查询的,是什么原因导致出错的。。。。。[/mw_shl_code]
[mw_shl_code=c,true]请大家给点意见。怎么写才好。给个稍微详细点的思路[/mw_shl_code]
[/mw_shl_code]
[mw_shl_code=c,true]void USART2_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收到数据
{
res =USART_ReceiveData(USART2); //读取接收到的数据
KeyLight_1;
if(RS485_RX_CNT<1024)
{
RS485_RX_BUF[RS485_RX_CNT]=res; //记录接收到的值
RS485_RX_CNT++; //接收数据增加1
if(RS485_RX_CNT==1024)
{
RS485_RX_CNT=0;
}
}
}
}
[/mw_shl_code]
[mw_shl_code=c,true]void UartCheck(void)
{
u8 dat;
while(Rs485_RX_Read_Cnt != RS485_RX_CNT) //Rs485_RX_Read_Cnt读数据计数
{ //初始为0,RS485_RX_CNT为接收计数
dat = RS485_RX_BUF[Rs485_RX_Read_Cnt]; // 读取接收到的数据
Rs485_Tx_Byte(dat); //用这个函数发数据回电脑,收到的数据并不是我发的,这个发送函数是没问题的。测试过的
Rs485_RX_Read_Cnt++;
if(Rs485_RX_Read_Cnt==1024)
{
Rs485_RX_Read_Cnt=0;
}
if(dat==0xaa) //这里一直进去不了。也就是说一直解析不到aa这个字节
{
/* 数据头 */
dataBuf[0]=dat;
ReceiveStatus=1;
RxCnt = 1;
KeyLight_0;//这个是LED熄灭。但是一直没有熄灭。就是一直没有接收到AA
}
else
{
switch(ReceiveStatus)
{
case 0:
break;
case 1:
if(dat==0x11)
{
dataBuf[1]=0x11;
ReceiveStatus=2;
RxCnt = 2;
}
else
{
ReceiveStatus=0;
RxCnt=0;
}
break;
case 2:
ReceiveStatus=3;break;
case 3:
if(RxCnt<FRAME_LEN_MAX)
{
dataBuf[RxCnt]=dat;
RxCnt++;
}
if(dat==0x55)
{
ReceiveStatus=4;
Flag_Data_End=1;
// dataBuf[RxCnt+1]=dat; //存最后一位数
}
break;
case 4:
break;
}
}
}
}
[/mw_shl_code]
[mw_shl_code=c,true]int main()//简化一下。其他的初始化的没有问题就不贴出来
{
u8 len1;
delay_init(); // 延时初始化
LED_Init();
RS485_Init(9600);
KeyLight_1; //控制一个灯亮起来,用来检测后面函数执行到哪里就灭灯
while(1)
{
UartCheck();
}
}[/mw_shl_code]
|