OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1792|回复: 3

帮忙看一下这个自己改编的串口实验 数据收发失败

[复制链接]

5

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2019-5-7
在线时间
32 小时
发表于 2019-6-18 18:59:59 | 显示全部楼层 |阅读模式
3金钱
int main(void)
{               
        u8  i;
        u16 t;  
        u16 len;       
        u16 times=0;
        u16 Temprature;
        u16 StressX;
        u16 StressY;
        u8 SettingData[6];
         
        //u16 times=0;
        delay_init();                   
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        uart_init(115200);       
        LED_Init();                          
        KEY_Init();         
        while(1)
        {
                if(USART_RX_STA&0x8000)
                {       
                       
                        len=USART_RX_STA&0x3fff;
                        if (len==6)
                        {
                                for(t=0;t<6;t++)
                          {
                                        SettingData[i]=USART_RX_BUF[t];
                                }
                        }
                }
                USART_RX_STA=0;
                if(times%100==0)
                {
                        USART_SendData(USART1,SettingData[0] );
                        USART_SendData(USART1,SettingData[1] );
                        USART_SendData(USART1,SettingData[2] );
                        USART_SendData(USART1,SettingData[3] );
                        USART_SendData(USART1,SettingData[4] );
                        USART_SendData(USART1,SettingData[5] );
                        USART_SendData(USART1,'a' );
                       
                }
                times++;
                if(times%30==0)LED0=!LED0;//Blink LED, check the system is operating or not...
                delay_ms(10);  
        }
}



这是主函数的,目的是想把3个参数的数据按顺序放在setting data中发送出去


void USART1_IRQHandler(void)               
        {
        u8 Res;

        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
                {
                        Res =USART_ReceiveData(USART1);
               
                        if((USART_RX_STA&0x8000)==0)
                        {
                                if(USART_RX_STA&0x4000)
                                {
                                        if(Res!=0xfe)USART_RX_STA=0;
                                        else USART_RX_STA|=0x8000;       
                                }
                                else
                                {       
                                        if(Res==0xff)USART_RX_STA|=0x4000;
                                        else
                                        {
                                                USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                                USART_RX_STA++;
                                                if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;          
                                        }                 
                                }
                        }                    
     }
#if SYSTEM_SUPPORT_OS
        OSIntExit();                                                                                           
#endif
}
/*void USART1_IRQHandler(void)                       
        u8 Res;
#if SYSTEM_SUPPORT_OS                
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
                {
                Res =USART_ReceiveData(USART1);       
               
                if((USART_RX_STA&0x8000)==0)
                        {
                        if(USART_RX_STA&0x4000)
                                {
                                if(Res!=0x0a)USART_RX_STA=0;
                                else USART_RX_STA|=0x8000;       
                                }
                        else
                                {       
                                if(Res==0x0d)USART_RX_STA|=0x4000;
                                else
                                        {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;
                                        }                 
                                }
                        }                    
     }
这是中断服务函数 是在串口实验4基础上改的 把标志位0x0d 0x0a 改成了0xff  0xfe    然后发送数组01 02 03 04 05 06 ff fe 01 02 03 04 05 06 ff fe  现在是接受不到    请大佬看看那个地方有问题 谢谢啦

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

31

主题

2183

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
14425
金钱
14425
注册时间
2018-8-3
在线时间
1157 小时
发表于 2019-6-18 19:49:50 | 显示全部楼层
仿真 找问题  发数据的时候 能不能进入中断函数里边
回复

使用道具 举报

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
151
金钱
151
注册时间
2017-3-29
在线时间
39 小时
发表于 2019-6-19 17:29:11 | 显示全部楼层
楼主,我按照你的思路改了一下,你可以看一下;首先你调用USART_SendData函数发送数据后少了一个while(USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);这个等待发送完成的判断,很容易造成数据发送过程中数据丢失;
其次,你数据发送失败有个标志位置位的问题,USART_RX_STA这个置位标志位如果你放到SettingData[t] = USART_RX_BUF[t];这个循环后就只能发送一次;
最后,你的times没有清零,这个和USART_RX_STA一样,需要到最后处理清零;

我的串口中断和你的相同,因此我就发主函数的改动,楼主你看一下:


        while(1)
        {
                if(USART_RX_STA & 0x8000)
                {
                        len = USART_RX_STA & 0x3fff;
                       
                        if(len == 6)
                        {
                                for(t = 0; t < 6; t++)
                                {
                                        SettingData[t] = USART_RX_BUF[t];
                                }
                        }
                        if(times%100==0)
                        {
                                for(t = 0; t < 6; t++)
                                {
                                        USART_SendData(USART1, SettingData[t]);
                                        while(USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);
                                }
                                times = 0;
                                USART_RX_STA = 0;
                        }
                        times++;
                }
        }

回复

使用道具 举报

5

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
80
金钱
80
注册时间
2019-5-7
在线时间
32 小时
 楼主| 发表于 2019-6-19 20:35:07 | 显示全部楼层
lpfdewo 发表于 2019-6-19 17:29
楼主,我按照你的思路改了一下,你可以看一下;首先你调用USART_SendData函数发送数据后少了一个while(USAR ...

好的,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-17 02:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表