用外设给单片机发送数据,每次发送75个字节,测量数据帧:AA 0049 00 61 AD 00 41 8300 00 08 CA 43 04 D5 4E 04 D0 48 04 D2 4D 04 D3 50 04 D6 3F 04 CF 5F 04 C4 5E04 C9 70 04 CE 5C 04 D2 43 04 D1 44 04 D2 46 04 D0 4E 04 D3 51 04 D1 48 04 CF44 04 D4 46 04 D2 52 04 D3 4B 04 CD 2A B7 (一共75*2个数值一个数表示一个字节=8位) AA: 帧头标识。00 49: 帧长度为0x0049(即73)字节(不包含CRC码) 1字=2字节=16位00: 地址码。61: 帧类型。AD: 命令字。00 41: 有效数据长度0x0041(65 Bytes)。83: 转速值,0x83即 131 * 0.05 = 6.55r/s00 00: 零点偏移量,有符号十六位数,0x0000/100 = 0.0°08 CA: 本帧起始角度0x08CA(2250),即当前角度是2250/100 + 0.0°(零点偏移量) = 22.5°43: 距离值1对应的信号强度:6704 D5: 距离值1是0x04D5(1237),实际距离是1237*0.25= 309.25mm。…….4B: 距离值20对应的信号强度:7504 CD: 距离值20是0x04CD(1229),实际距离是1229*0.25 = 307.25mm。2A B7: CRC校验码。我的串口程序如下:void USART1_IRQHandler(void) //´®¿Ú1ÖжϷþÎñ³ÌÐò { u8 Res,i; if(USART_Ge
tiTStatus(USART1, USART_IT_RXNE) != RESET) //½ÓÊÕÖÐ¶Ï { Res =USART_ReceiveData(USART1); //¶ÁÈ¡½ÓÊÕµ½µÄÊý¾Ý //BUF[cnt]=Res; USART_SendData(USART1,Res); while( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET );
} if(cnt==0) { cnt=(BUF[cnt]==0xAA)?cnt++:0;//ÅжÏÖ¡Í·0xAA } else if(cnt==1) { cnt=(BUF[cnt]==0x00)?cnt++:0; } else if(cnt==2) { cnt=(BUF[cnt]==0x49)?cnt++:0; } else if(cnt==3) { cnt=(BUF[cnt]==0x00)?cnt++:0;//ÅжϵØÖ·Âë } else if(cnt==4) { cnt=(BUF[cnt]==0x61)?cnt++:0; } else if(cnt==5) { cnt=(BUF[cnt]==0xAD)?cnt++:0; } else if(cnt>5) { cnt++; BUF[cnt]=Res; while(cnt==75) { cnt=0; } for(i=0;i<75;i++) { Data
=BUF[cnt]; USART1->SR; //·ÀÖ¹Ê׸ö×Ö·ûµÄ¶ªÊ§ USART_SendData(USART1,Data); while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
}这样子对吗。。。我串口调试不出来 so bad
建议2:现在先把你程序里后面的那一堆if判断去掉,先得能把收到的发出来再说
建议3:能把收到的发出来后,不要把处理的程序放在中断里做,中断不要过于复杂,否则影响中断的执行效率,中断里只需要把你收到的数据存储到一个全局数组里,在main loop里用专门的函数处理
建议4:串口数据处理用if的效率太低了,程序运行时需要逐个if判断,真是浪费,建议用switch好不好
一周热门 更多>