• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

stm32f4串口只能接收一次

zhczlzhang 2018-09-19 浏览量:2810
u8 t;
    u8 data[5];
    u8 len; 
    u16 times=0;
    unsigned int time=0;
    void Cargo_RUN(void);
    void Cargo_two_RUN(void);
     
int main(void)
{
  
       
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//éèÖÃÏμí3ÖD¶ÏóÅÏ輶·Ö×é2
    delay_init(168);        //Ñóê±3õê¼»ˉ 
    uart_init(115200);  //′®¿ú3õê¼»ˉ2¨ìØÂêÎa115200
    LED_Init();             //3õê¼»ˉóëLEDᬽóμÄó2¼t½ó¿ú  
  delay_ms(10);   
    while(1)
    {
    //  usat_init();
        if(USART_RX_STA&0x4000)
        {                     
            //len=USART_RX_STA&0x3fff;//μÃμ½′Ë′νóêÕμ½μÄêy¾Y3¤¶è
            if(USART_RX_BUF[0]==0x01)
            {
                if(USART_RX_BUF[1]==0x05)
                {  
                  if(USART_RX_BUF[2]==0x05)
                    {  
                           USART_RX_STA=0; 
                           Cargo_RUN();
//                                  data[0]=0x08;
//                                              data[1]=0x05;
//                                              data[2]=0x01;
//                                              data[3]=0x09;
//                                len=4;
                    }
                }
            }
             
            for(t=0;t<len;t++)
            {
                USART_SendData(USART1 data[t]);         //Ïò′®¿ú1·¢Ëíêy¾Y      
        while(USART_GetFlagStatus(USART1USART_FLAG_TC)!=SET);//μè′y·¢Ëí½áêø
            }
             
            //printf("\r\n\r\n");//2åèë»»DD
            memset(data020*sizeof(char));
            USART_RX_STA=0;
        }
        else
        {
            times++;
//          if(times%5000==0)
//          {
//              printf("AT+CIPSTART=\"TCP\"\"192.168.1.10\"8080\r\n");
//              printf("ÕyμãÔ-×ó@ALIENTEK\r\n\r\n\r\n");
//          }
                        data[0]=0x08;
                                                data[1]=0x02;
                                                data[2]=0x09;
                                                data[3]=0x07;
            if(times%200==0)printf("%02X%02X%02X%02X"data[0]data[1]data[2]data[3]);  
            if(times%30==0)LED0=!LED0;//éá˸LEDìáê¾Ïμí3ÕyÔúÔËDD.
            delay_ms(10);   
        }
         
           
     
}
}
 
void Cargo_RUN(void)
{
//  if (USART_RX_BUF[3]<=0x3C)//μ±μú4¸ö×Ö½úD¡óú60¸ö»õμàê±£¬¼ìDøÏÂò»2½
//                          {
                                 
                                switch (USART_RX_BUF[3])
                                {
                                    case 0x01://′ò¿a1oÅ»õμà
                                                        Cargo_1_RUN();
                                                        delay_ms(time); 
                                            Cargo_1_STOP();
                                     
                                                        data[0]=0x00;
                                                        data[1]=0x05;
                                                        data[2]=0x00;
                                                        len=3;
                                                        break;
                                    case 0x02://′ò¿a2oÅ»õμà
                                                        Cargo_2_RUN();
                                                        delay_ms(time); 
                                            Cargo_2_STOP();
                                     
                                                        data[0]=0x00;
                                                        data[1]=0x05;
                                                        data[2]=0x00;
                                                        len=3;
                                                        break;
default:
                                                        data[0] = 0x00;//ÆäËü2»Ö§3ÖμÄ1|Äü£¬1|Äüλֱ1£¬
                                                        data[1] = 0x04;
                                                        data[2] = 0x01;//éèÖÃòì3£ÂeÎa1
                                                        len = 3;
                                                        break;

}



在原子哥的串口实验里面我尝试扩展串口实验。

我的结果应该是是开机后串号在没有接收到数据的情况下一直在向上发出08020907,在接收到数据后进行比对,数据相符向上传输数据000500.

然后我修改发送数据为数组,检测到上位机发送01050501-010502后发送08020907,结果开机接收数据正常,在检测到上位机有数据发送过来,数据正确时,会返回对应的数据,但是只有一次。然后就无反应了。但是我一旦去除else之后的空闲时间发送函数。就接受正常了。我把DATA的数组清空,USART_RX_STA也置零了,但是还是那样,一填加空闲发送,接受到数据并回复后就无反应了,不知道那里错了,请指教。

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 问题解决就好,请及时结贴。
    • 发布于 2018-10-19
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:9
  • 是不是使用了中断,那么你在中断中要清中断标志的
    • 发布于2018-09-19
    • 举报
    • 评论 1
    • 1
    • 0
zhczlzhang 回复了 rdim :清除了。 回复

  • 你应该提供完整工程,关于中断部分的处理无法看到
    • 发布于2018-09-19
    • 举报
    • 评论 2
    • 0
    • 0
zhczlzhang 回复了 我爱下载 :中断部分没有改,就是原子哥的中断。 回复
zhczlzhang 回复了 我爱下载 :我只改了main这一部分,其他都是原样。 回复

  • 检查下中断设置之前的初始化配置有没有问题呢
    • 发布于2018-09-21
    • 举报
    • 评论 0
    • 0
    • 0

  • 中断标志位是否有清除,不然你的中断标志会一直在,一直在中断里面
    • 发布于2018-09-23
    • 举报
    • 评论 0
    • 0
    • 0

  • 既然中断标志位已经清除,那就看看有没有别的全局变量控制使得串口中断服务函数只能执行一次?

    • 发布于2018-09-28
    • 举报
    • 评论 0
    • 0
    • 0

  • 问题已解决,变量定义的问题。
    • 发布于2018-09-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 应该是你的串口中断标志位没有及时清除导致的
    • 发布于2018-09-30
    • 举报
    • 评论 0
    • 0
    • 0

  • 可能是数据接收的逻辑问题,没有清中断标志,或是接收缓存满了
    • 发布于2018-10-16
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

stm32f4串口只能接收一次