用外设给单片机发送数据,每次发送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/s
00 00: 零点偏移量,有符号十六位数,0x0000/100 = 0.0°
08 CA: 本帧起始角度0x08CA(2250),即当前角度是2250/100 + 0.0°(零点偏移量) = 22.5°
43: 距离值1对应的信号强度:67
04 D5: 距离值1是0x04D5(1237),实际距离是1237*0.25= 309.25mm。
…….
4B: 距离值20对应的信号强度:75
04 CD: 距离值20是0x04CD(1229),实际距离是1229*0.25 = 307.25mm。
2A B7: CRC校验码。
我的串口程序如下:
void USART1_IRQHandler(void) //´®¿Ú1ÖжϷþÎñ³ÌÐò
{
u8 Res,i;
if(USART_GetITStatus(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 |