OpenEdv-开源电子网

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

长时间使用串口1收发数据问题,

[复制链接]

13

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-9-16
在线时间
22 小时
发表于 2015-12-29 11:36:09 | 显示全部楼层 |阅读模式
1金钱
和上位机通信,大约5分钟左右的时候,串口开始拒绝接收数据,在网上查了参考如下:
http://bbs.21ic.com/forum.php?mo ... E6%9C%BA&page=1
http://blog.csdn.net/huwen415/article/details/8928032
http://bbs.21ic.com/forum.php?mo ... amp;authorid=527638
但是问题依然没有解决,求助!!!!!!!!!!!!!!!!!!!!!!!!!!
串口1的设置如下:
void uart1_init(u32 bound){
                        //GPIO¶Ë¿úéèÖÃ
                        GPIO_InitTypeDef GPIO_InitStructure;
                        USART_InitTypeDef USART_InitStructure;
                        NVIC_InitTypeDef NVIC_InitStructure;
                 
                  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);        //ê1ÄüUSART1£¬GPIOAê±Öó
       
                  USART_DeInit(USART1);  //¸′λ′®¿ú1
                 //USART1_TX   PA.9
                        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
                        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //¸′óÃíÆíìêä3ö
                        GPIO_Init(GPIOA, &GPIO_InitStructure); //3õê¼»ˉPA9
                 
                        //USART1_RX          PA.10
                        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
                        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
                        GPIO_Init(GPIOA, &GPIO_InitStructure);  //3õê¼»ˉPA10

                        //Usart1 NVIC ÅäÖÃ

                        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
                        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0 ;//ÇàÕ¼óÅÏè¼¶0
                        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                //×óóÅÏè¼¶0
                        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQí¨μàê1Äü
                        NVIC_Init(&NVIC_InitStructure);        //¸ù¾YÖ¸¶¨μÄ2Îêy3õê¼»ˉVIC¼Ä′æÆ÷
               
                        //USART 3õê¼»ˉéèÖÃ

                        USART_InitStructure.USART_BaudRate = bound;//ò»°ãéèÖÃÎa9600;
                        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×Ö3¤Îa8λêy¾Y¸ñê½
                        USART_InitStructure.USART_StopBits = USART_StopBits_1;//ò»¸öí£Ö1λ
                        USART_InitStructure.USART_Parity = USART_Parity_No;//ÎTÆæÅ¼D£Ñéλ
                        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//ÎTó2¼têy¾Yá÷¿ØÖÆ
                        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //êÕ·¢Ä£ê½

                        USART_Init(USART1, &USART_InitStructure);                         //3õê¼»ˉ′®¿ú
                        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);        //¿aÆôÖD¶Ï
                        USART_ITConfig(USART1, USART_IT_PE, ENABLE);
                        USART_ITConfig(USART1, USART_IT_ERR, ENABLE);
                        USART_Cmd(USART1, ENABLE);                            //ê1Äü′®¿ú

}

中断处理函数如下:
void USART1_IRQHandler(void)                        //′®¿ú1ÖD¶Ï·tÎñ3ìDò
        {
                       
                        u8 Res;//Data_BuffÎaêy¾Y»o3å
                        u32 my_delay;
                        my_delay=0;
                        if(USART_GetFlagStatus(USART1, USART_FLAG_ORE) != RESET)  //1yÔØ3ö′í(Overrun error)£¬μ±RXNEÎa1μÄê±oòμÄ
                        {
                                  Res =USART_ReceiveData(USART1);                        //μ±½óêü′íÎóμÄê±oò£¬ò2½óêÕ£¬Ôù·¢¸øéÏλ»ú£¬éÏλ»úÅD¶Ïèç1û′íÎóÔòÖØ·¢                               
                                        data_buffer[NumSize]=Res;                       
                                        NumSize++;
                                        if(NumSize>6)
                                        {
                                                NumSize=0;
                                                state=1;
                                                while(my_delay < 144000){my_delay++;}
                                        }
                                        USART_ClearFlag(USART1, USART_FLAG_ORE);
                        }
                        if(USART_GetFlagStatus(USART1, USART_FLAG_NE) != RESET)  //&#212;&#235;éù′í&#206;ó±ê&#214;&#190; (Noise error flag)
                        {
                                        USART_ClearFlag(USART1, USART_FLAG_NE);
                        }
                        if(USART_GetFlagStatus(USART1, USART_FLAG_FE) != RESET)  // &#214;&#161;′í&#206;ó (Framing error)
                        {
                                        USART_ClearFlag(USART1, USART_FLAG_FE);
                        }
                        if(USART_GetFlagStatus(USART1, USART_FLAG_PE) != RESET)  //&#188;ì&#209;é′í&#206;ó (Parity error)
                        {
                                        USART_ClearFlag(USART1, USART_FLAG_PE);
                        }
                                       
                        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)    //&#182;á&#188;&#196;′&#230;&#198;÷·&#199;&#191;&#213; (Read data register not empty)
                        {               
                                        Res =USART_ReceiveData(USART1);                               
                                        data_buffer[NumSize]=Res;                       
                                        NumSize++;
                                        if(NumSize>6)
                                        {
                                                NumSize=0;
                                                state=1;
                                                while(my_delay < 144000){my_delay++;}
                                        }
                                        USART_ClearITPendingBit(USART1,USART_IT_RXNE);
                        }
}

发送数据函数如下:
void send_data(USART_TypeDef* USARTx,u8 (*p))
{
                u8 i;
                for(i=0;i<7;i++)
                {
                                USART_SendData(USARTx, *p);
                                while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
                                p++;
                }
}


最佳答案

查看完整内容[请看2#楼]

是不是外部中断一直在触发? 加个引脚电平指示,触发就变化电平 用示波器看看
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2015-12-29 11:36:10 | 显示全部楼层
Snowman 发表于 2015-12-30 09:41
这个调好了,1ms发送一次也没事,麻烦您看下帖子上面给别人的回复的信息,现在问题是我把外部中断关了以 ...

是不是外部中断一直在触发? 加个引脚电平指示,触发就变化电平 用示波器看看
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
发表于 2015-12-29 11:51:43 | 显示全部楼层
串口会拒绝接收数据?还是你的协议解析挂了。。。
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
发表于 2015-12-29 11:56:48 | 显示全部楼层
作为一个单片机开发人员不能说出“串口开始拒绝接收数据”这种话,把责任推到单片机身上,而不考虑自己程序问题。串口中断只是接收字节而已,解析协议是用户的事,自己写挂了不能说单片机不接受数据了,甚至把单片机写挂了(常见问题:堆栈溢出),不能怪单片机不工作。
回复

使用道具 举报

233

主题

961

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1815
金钱
1815
注册时间
2011-10-9
在线时间
230 小时
发表于 2015-12-29 12:20:59 | 显示全部楼层
这个其实很好搞啊  程序每隔一会儿就 把串口的 变量 参数 发送一次 或者显示一次  看看死的时候 程序啥状态就好了
回复

使用道具 举报

1

主题

84

帖子

0

精华

高级会员

Rank: 4

积分
529
金钱
529
注册时间
2015-7-21
在线时间
47 小时
发表于 2015-12-29 12:28:34 | 显示全部楼层
是不是有堆栈溢出的时候,使用的资源没有及时释放,就像楼上说的 看看死在哪里了
一名合格的工程师一定要做到,代码虐我千百遍依然待她如初恋!
回复

使用道具 举报

13

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-9-16
在线时间
22 小时
 楼主| 发表于 2015-12-29 17:54:17 来自手机 | 显示全部楼层
solo 发表于 2015-12-29 11:56
作为一个单片机开发人员不能说出“串口开始拒绝接收数据”这种话,把责任推到单片机身上,而不考虑自己程序 ...

您好,我不是把责任推到单片机上,如果我要推到单片机上,为什么我还要贴程序呢?我是想说明这种状况,我里面用了四个定时器,只是抢先优先级比串口1低,在五六分钟后不能产生定时器中断,应该是停在串口中断里面了,上面的三个链接,出现的情况,我也出现了,但是,我用了他们的方法,没有解决,我是希望您能帮忙看一下,这个问题怎么解决,因为程序是在串口中断里面没出来,不然,定时器中断是肯定会触发的
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
发表于 2015-12-30 08:18:01 | 显示全部楼层
Snowman 发表于 2015-12-29 17:54
您好,我不是把责任推到单片机上,如果我要推到单片机上,为什么我还要贴程序呢?我是想说明这种状况,我 ...

优先级低了不打紧,顶多是丢包,丢弃重来即可。如果不丢弃,就容易溢出。还是解析问题
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-12-30 08:38:51 | 显示全部楼层
你这样处理接收,不大合理,可靠性很难说。
回复

使用道具 举报

13

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-9-16
在线时间
22 小时
 楼主| 发表于 2015-12-30 09:03:34 | 显示全部楼层
TinyBoy 发表于 2015-12-30 08:38
你这样处理接收,不大合理,可靠性很难说。

我是这么想的,如果在接收的时候,过载出错,我也接收,计数器仍然加1,到7以后,会把数据发到上位机,逐个对比,如果不一致则重发,一直则发送,接收正确的指令
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13129
金钱
13129
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-12-30 09:05:37 | 显示全部楼层
Snowman 发表于 2015-12-30 09:03
我是这么想的,如果在接收的时候,过载出错,我也接收,计数器仍然加1,到7以后,会把数据发到上位机,逐 ...

代码太长,不太想看,但是你中断里还给延迟,是怎么想的?
学无止境
回复

使用道具 举报

13

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-9-16
在线时间
22 小时
 楼主| 发表于 2015-12-30 09:16:39 | 显示全部楼层
本帖最后由 Snowman 于 2015-12-30 09:17 编辑
solo 发表于 2015-12-30 08:18
优先级低了不打紧,顶多是丢包,丢弃重来即可。如果不丢弃,就容易溢出。还是解析问题

您能帮我看下程序不??现在控制4个电机,有八个行程开关,用的外部中断线9-5,10-15,如果使用这样的方式去控制电机:
                u32 my_delay;
                if(A_L )  
                {
                        logout=logout|0x80;    //使用标志,在定时器中报错,1000 0000               
                         my_delay=0;            //确保在开启的时候,能够在触发抖动的情况下,打开
                        while(my_delay < 144000)
                        {
                                        my_delay++;
                                        A_1 =0;A_2 =1;A_EN=1;
                        }
                }
                if(A_L == 0){logout=logout&0x7F;}  //清楚 标志位 0111 1111

外部中断程序,如下没有做消除抖动,因为我觉的只要触发了,就算停止后,也可以靠电机的惯性去使开关完全关闭,代码如下
#include "exti.h"

extern u8 logout;
void myExti_init(void)
{        
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //ê1&#196;ü&#184;′ó&#195;ê±&#214;ó
        
/****************************************A*/
        //&#191;a1&#216;A′ò&#191;aê&#199;·&#241;μ&#189;&#206;&#187;£&#172C9 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource9);
        
        EXTI_InitStructure.EXTI_Line =EXTI_Line9;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
        //&#191;a1&#216;A1&#216;±&#213;ê&#199;·&#241;μ&#189;&#206;&#187;£&#172C8 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource8);
        
        EXTI_InitStructure.EXTI_Line =EXTI_Line8;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
/****************************************B*/
        //&#191;a1&#216;B′ò&#191;aê&#199;·&#241;μ&#189;&#206;&#187;£&#172C7 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource7);
        
        EXTI_InitStructure.EXTI_Line =EXTI_Line7;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
        //&#191;a1&#216;B1&#216;±&#213;ê&#199;·&#241;μ&#189;&#206;&#187;£&#172C6 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource6);
        
        EXTI_InitStructure.EXTI_Line =EXTI_Line6;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
/****************************************C*/
        //&#191;a1&#216;C′ò&#191;aê&#199;·&#241;μ&#189;&#206;&#187;£&#172B15 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource15);
        
        EXTI_InitStructure.EXTI_Line =EXTI_Line15;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        //&#191;a1&#216;C1&#216;±&#213;ê&#199;·&#241;μ&#189;&#206;&#187;£&#172B14 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);           //μ¥&#182;àê1ó&#195;ía2&#191;&#214;D&#182;&#207;5_9
        
        EXTI_InitStructure.EXTI_Line =EXTI_Line14;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
/****************************************D*/        
        //&#191;a1&#216;D′ò&#191;aê&#199;·&#241;μ&#189;&#206;&#187;£&#172B13 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13);
        EXTI_InitStructure.EXTI_Line =EXTI_Line13;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
        //&#191;a1&#216;D1&#216;±&#213;ê&#199;·&#241;μ&#189;&#206;&#187;£&#172B12 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12);
        EXTI_InitStructure.EXTI_Line =EXTI_Line12;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        EXTI_Init(&EXTI_InitStructure);        

/*******************&#197;&#228;&#214;&#195;&#214;D&#182;&#207;&#207;òá&#191;****************/
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                                                //&#209;&#161;&#212;&#241;&#214;D&#182;&#207;&#207;&#223;9_5
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                        //&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                                                //′óó&#197;&#207;è&#188;&#182;0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ê1&#196;ü
  NVIC_Init(&NVIC_InitStructure);        
        //&#214;D&#182;&#207;&#207;&#223;15_10------------------D
        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                                        //&#209;&#161;&#212;&#241;&#214;D&#182;&#207;&#207;&#223;15_10
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                        //&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                                                //′óó&#197;&#207;è&#188;&#182;1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ê1&#196;ü        
}

void EXTI9_5_IRQHandler(void)              //μ&#231;&#187;úC
{
        if(A_L == 0 && A_R ==1 )
        {
                 A_EN=0;A_1 =0;A_2 =0;
                 EXTI_ClearITPendingBit(EXTI_Line9);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;0
                 logout=logout&0x7F;        
        }
        if(A_R == 0  && A_L ==1 )
        {
                 A_EN=0;A_1 =0;A_2 =0;
                 EXTI_ClearITPendingBit(EXTI_Line8);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;1
                 logout=logout&0xBF;        
        }
        if(B_L == 0 && B_R == 1)
        {
                 B_EN=0;B_1 =0;B_2 =0;
                 EXTI_ClearITPendingBit(EXTI_Line7);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;2
                 logout=logout&0xDF;        
        }
        if(B_R == 0 && B_L == 1)
        {
                 B_EN=0;B_1 =0;B_2 =0;
                 EXTI_ClearITPendingBit(EXTI_Line6);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;3
                 logout=logout&0xEF;        
        }
}

void EXTI15_10_IRQHandler(void)            //μ&#231;&#187;úD
{
         if( 0==C_L )
         {
                        C_EN=0;C_1 =0;C_2 =0;
                        EXTI_ClearITPendingBit(EXTI_Line15); //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;5
                        logout=logout&0xF7;
         }  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;5
         if(0 == C_R)
         {
                        C_EN=0;C_1 =0;C_2 =0;
                        EXTI_ClearITPendingBit(EXTI_Line14);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;6
                  logout=logout&0xFB;
         }
         if(0 == D_L)
         {
                        D_EN=0;D_1 =0;D_2 =0;
                        EXTI_ClearITPendingBit(EXTI_Line13);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;10
                  logout=logout&0xFD;
         }
         if(0 == D_R)
         {
                        D_EN=0;D_1 =0;D_2 =0;
                        EXTI_ClearITPendingBit(EXTI_Line12);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;11
                        logout=logout&0xFE;
         }
}

现在问题是只要我开始使用这种方式,不到十分钟,系统就不能正常工作,当是同不能正常工作的时候,但是确实把电机停了,说明外部中断触发了,使用串口调试助手发送数据,没有任何反映,
把电机控制程序改一下,不用外部中断,
                //u32 my_delay;
                while(A_L )
                {
                        logout=logout|0x80;    //1000 0000               

                                        A_1 =0;A_2 =1;A_EN=1;
                }
                if(A_L == 0){A_1 =0;A_2 =0;A_EN=0; logout=logout&0x7F;}  // 0111 1111

使用这种while 的方式工作半个小时,没有任何问题,您能帮我分析一下不?
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-12-30 09:24:04 | 显示全部楼层
Snowman 发表于 2015-12-30 09:03
我是这么想的,如果在接收的时候,过载出错,我也接收,计数器仍然加1,到7以后,会把数据发到上位机,逐 ...

你接收处理不好,怎么发回也是错的,不如想办法保证接收正确,还有,中断里面加延时,什问题都复杂了,你加也要合理才行啊。
回复

使用道具 举报

13

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-9-16
在线时间
22 小时
 楼主| 发表于 2015-12-30 09:24:34 | 显示全部楼层
jermy_z 发表于 2015-12-30 09:05
代码太长,不太想看,但是你中断里还给延迟,是怎么想的?

上面三个链接里面的所有方法我都试了一下,这个加延时,是最后一个帖子,所使用的方法...病急乱投医就试了一下,我能加您一个好友吗??昨天调试了半天,发现不是串口通信的问题,您能帮我看下程序不?
现在控制4个电机,有八个行程开关,还有四个定时器,定时器1、4用来保护4个电机,2、3是因为有两个触发信号需要用定时器控制,用的外部中断线9-5,10-15,如果使用这样的方式去控制电机:
                u32 my_delay;
                if(A_L )  
                {
                        logout=logout|0x80;    //使用标志,在定时器中报错,1000 0000               
                         my_delay=0;            //确保在开启的时候,能够在触发抖动的情况下,打开
                        while(my_delay < 144000)
                        {
                                        my_delay++;
                                        A_1 =0;A_2 =1;A_EN=1;
                        }
                }
                if(A_L == 0){logout=logout&0x7F;}  //清楚 标志位 0111 1111

外部中断程序,如下没有做消除抖动,因为我觉的只要触发了,就算停止后,也可以靠电机的惯性去使开关完全关闭,代码如下
#include "exti.h"

extern u8 logout;
void myExti_init(void)
{        
        EXTI_InitTypeDef EXTI_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);        //ê1&#196;ü&#184;′ó&#195;ê±&#214;ó
        
/***************************A*/
        //&#191;a1&#216;A′ò&#191;aê&#199;·&#241;μ&#189;&#206;&#187;£&#172;C9 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource9);
        
        EXTI_InitStructure.EXTI_Line =EXTI_Line9;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
        //&#191;a1&#216;A1&#216;±&#213;ê&#199;·&#241;μ&#189;&#206;&#187;£&#172;C8 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource8);
        
        EXTI_InitStructure.EXTI_Line =EXTI_Line8;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
/***************************B*/
        //&#191;a1&#216;B′ò&#191;aê&#199;·&#241;μ&#189;&#206;&#187;£&#172;C7 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource7);
        
        EXTI_InitStructure.EXTI_Line =EXTI_Line7;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
        //&#191;a1&#216;B1&#216;±&#213;ê&#199;·&#241;μ&#189;&#206;&#187;£&#172;C6 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource6);
        
        EXTI_InitStructure.EXTI_Line =EXTI_Line6;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
/***************************C*/
        //&#191;a1&#216;C′ò&#191;aê&#199;·&#241;μ&#189;&#206;&#187;£&#172;B15 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource15);
        
        EXTI_InitStructure.EXTI_Line =EXTI_Line15;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        //&#191;a1&#216;C1&#216;±&#213;ê&#199;·&#241;μ&#189;&#206;&#187;£&#172;B14 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);           //μ¥&#182;àê1ó&#195;ía2&#191;&#214;D&#182;&#207;5_9
        
        EXTI_InitStructure.EXTI_Line =EXTI_Line14;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
/***************************D*/        
        //&#191;a1&#216;D′ò&#191;aê&#199;·&#241;μ&#189;&#206;&#187;£&#172;B13 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource13);
        EXTI_InitStructure.EXTI_Line =EXTI_Line13;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        EXTI_Init(&EXTI_InitStructure);        
        //&#191;a1&#216;D1&#216;±&#213;ê&#199;·&#241;μ&#189;&#206;&#187;£&#172;B12 &#214;D&#182;&#207;&#207;&#223;ò&#212;&#188;°&#214;D&#182;&#207;3&#245;ê&#188;&#187;ˉ&#197;&#228;&#214;&#195;£&#172;&#207;&#194;&#189;μ&#209;&#216;′¥·¢
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource12);
        EXTI_InitStructure.EXTI_Line =EXTI_Line12;
        EXTI_InitStructure.EXTI_Mode =EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd =ENABLE;
        EXTI_Init(&EXTI_InitStructure);        

/*************&#197;&#228;&#214;&#195;&#214;D&#182;&#207;&#207;òá&#191;***********/
        NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;                                                //&#209;&#161;&#212;&#241;&#214;D&#182;&#207;&#207;&#223;9_5
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                        //&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                                                //′óó&#197;&#207;è&#188;&#182;0
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ê1&#196;ü
  NVIC_Init(&NVIC_InitStructure);        
        //&#214;D&#182;&#207;&#207;&#223;15_10------------------D
        NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;                                        //&#209;&#161;&#212;&#241;&#214;D&#182;&#207;&#207;&#223;15_10
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;                        //&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;0
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                                                //′óó&#197;&#207;è&#188;&#182;1
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                                                //ê1&#196;ü        
}

void EXTI9_5_IRQHandler(void)              //μ&#231;&#187;úC
{
        if(A_L == 0 && A_R ==1 )
        {
                 A_EN=0;A_1 =0;A_2 =0;
                 EXTI_ClearITPendingBit(EXTI_Line9);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;0
                 logout=logout&0x7F;        
        }
        if(A_R == 0  && A_L ==1 )
        {
                 A_EN=0;A_1 =0;A_2 =0;
                 EXTI_ClearITPendingBit(EXTI_Line8);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;1
                 logout=logout&0xBF;        
        }
        if(B_L == 0 && B_R == 1)
        {
                 B_EN=0;B_1 =0;B_2 =0;
                 EXTI_ClearITPendingBit(EXTI_Line7);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;2
                 logout=logout&0xDF;        
        }
        if(B_R == 0 && B_L == 1)
        {
                 B_EN=0;B_1 =0;B_2 =0;
                 EXTI_ClearITPendingBit(EXTI_Line6);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;3
                 logout=logout&0xEF;        
        }
}

void EXTI15_10_IRQHandler(void)            //μ&#231;&#187;úD
{
         if( 0==C_L )
         {
                        C_EN=0;C_1 =0;C_2 =0;
                        EXTI_ClearITPendingBit(EXTI_Line15); //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;5
                        logout=logout&0xF7;
         }  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;5
         if(0 == C_R)
         {
                        C_EN=0;C_1 =0;C_2 =0;
                        EXTI_ClearITPendingBit(EXTI_Line14);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;6
                  logout=logout&0xFB;
         }
         if(0 == D_L)
         {
                        D_EN=0;D_1 =0;D_2 =0;
                        EXTI_ClearITPendingBit(EXTI_Line13);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;10
                  logout=logout&0xFD;
         }
         if(0 == D_R)
         {
                        D_EN=0;D_1 =0;D_2 =0;
                        EXTI_ClearITPendingBit(EXTI_Line12);  //&#199;&#229;3y&#214;D&#182;&#207;±ê&#214;&#190;&#206;&#187;11
                        logout=logout&0xFE;
         }
}

现在问题是只要我开始使用这种方式,不到十分钟,系统就不能正常工作,当是同不能正常工作的时候,但是确实把电机停了,说明外部中断触发了,使用串口调试助手发送数据,没有任何反映,
把电机控制程序改一下,不用外部中断,
                //u32 my_delay;
                while(A_L )
                {
                        logout=logout|0x80;    //1000 0000               

                                        A_1 =0;A_2 =1;A_EN=1;
                }
                if(A_L == 0){A_1 =0;A_2 =0;A_EN=0; logout=logout&0x7F;}  // 0111 1111

使用这种while 的方式工作半个小时,没有任何问题,您能帮我分析一下不?
回复

使用道具 举报

13

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-9-16
在线时间
22 小时
 楼主| 发表于 2015-12-30 09:29:57 | 显示全部楼层
TinyBoy 发表于 2015-12-30 09:24
你接收处理不好,怎么发回也是错的,不如想办法保证接收正确,还有,中断里面加延时,什问题都复杂了,你 ...

嗯,延时也去了,如果只是一直发送错误的话,我把上位机关了,用串口助手,给它发送数据,收不到回应数据
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-12-30 09:38:04 | 显示全部楼层
Snowman 发表于 2015-12-30 09:29
嗯,延时也去了,如果只是一直发送错误的话,我把上位机关了,用串口助手,给它发送数据,收不到回应数据

串口助手16进制发送你1S发送一次数据,测试串口发回的数据,先把接收调好。
回复

使用道具 举报

13

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
194
金钱
194
注册时间
2014-9-16
在线时间
22 小时
 楼主| 发表于 2015-12-30 09:41:01 | 显示全部楼层
TinyBoy 发表于 2015-12-30 09:38
串口助手16进制发送你1S发送一次数据,测试串口发回的数据,先把接收调好。

这个调好了,1ms发送一次也没事,麻烦您看下帖子上面给别人的回复的信息,现在问题是我把外部中断关了以后,一切正常
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 19:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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