打印
[应用相关]

STM32串口接收数据问题

[复制链接]
2568|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Snow7|  楼主 | 2018-6-29 21:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用外设给单片机发送数据,每次发送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
沙发
android2| | 2018-6-29 21:45 | 只看该作者
在串口初始的时候,禁止掉接收中断

使用特权

评论回复
板凳
拉克丝| | 2018-6-29 21:58 | 只看该作者
发数据放到中断外面去。

使用特权

评论回复
地板
lefeng| | 2018-6-29 22:08 | 只看该作者
目前的程序缺少清中断标志位,USART_ClearITPendingBit(USART2, USART_IT_RXNE);

使用特权

评论回复
5
CaLipton| | 2018-6-30 15:34 | 只看该作者
把程序里后面的那一堆if判断去掉,先得能把收到的发出来再说

使用特权

评论回复
6
Rospiers| | 2018-6-30 15:40 | 只看该作者
串口数据处理用if的效率太低了,程序运行时需要逐个if判断,真是浪费,建议用switch好不好

使用特权

评论回复
7
stm32jy| | 2018-6-30 15:48 | 只看该作者
加上清空中断标志位,USART_ClearITPendingBit(USART2, USART_IT_RXNE);

使用特权

评论回复
8
stm32jy| | 2018-6-30 15:48 | 只看该作者
调试下试试,这样应该好点。

使用特权

评论回复
9
Richardd| | 2018-6-30 16:32 | 只看该作者
不要把处理的程序放在中断里做,中断不要过于复杂,否则影响中断的执行效率

使用特权

评论回复
10
keaibukelian| | 2018-7-17 16:03 | 只看该作者
中断处理函数尽可能的简单

使用特权

评论回复
11
八层楼| | 2018-7-18 10:07 | 只看该作者
示波器能看到波形吗

使用特权

评论回复
12
wakayi| | 2018-7-20 08:37 | 只看该作者
看起来楼主的问题不少啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

173

主题

926

帖子

3

粉丝