打印
[STM32F1]

stm32f103串口中断如何接收2.6k的大数据不丢数据

[复制链接]
6842|45
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
HAORANAN123|  楼主 | 2017-12-7 09:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
上危机每隔一秒钟发送2.6k的数据,这个数据包含帧头,不包含帧尾,stmf103使用串口中断接收,波特率为115200,程序里面还有4*4矩阵按键扫描,每当连续按键,就会发现接受到串口数据丢了,这个数据是不能丢的,怎么样才能保证数据的不丢失,如果使用DMA,是不是效果也不好了,有没有什么好的办法
沙发
mmuuss586| | 2017-12-7 09:47 | 只看该作者
开头几个错别字;
按键加了中断吗?没加的话,应该不会丢数据啊;

使用特权

评论回复
板凳
mmuuss586| | 2017-12-7 09:48 | 只看该作者
一串完整的数据,最好还是加桢头和桢尾;

使用特权

评论回复
地板
kingkits| | 2017-12-7 09:57 | 只看该作者
键盘处理程序有问题,占用了太多的系统时间

使用特权

评论回复
5
tomzbj| | 2017-12-7 11:06 | 只看该作者
DMA为啥会效果不好?
不过2.6k数据也太多了点... 上位机是PC吧, 如果是USB转串口, 距离不远的话, 波特率至少可以提到500k, 这样处理时间上就宽松多了.
至于键盘, 上个TM16XX之类做键盘扫描吧, 别直接扫了, 不够折腾的.

使用特权

评论回复
6
HAORANAN123|  楼主 | 2017-12-7 11:11 | 只看该作者
mmuuss586 发表于 2017-12-7 09:47
开头几个错别字;
按键加了中断吗?没加的话,应该不会丢数据啊;

void TIM2_IRQHandler(void)//100ms的中断
{u8 temp=0;
        if ( TIM_GetITStatus(TIM2 , TIM_IT_Update) != RESET )
        {       
                if(!(GPIO_ReadInputDataBit( GPIOA,GPIO_Pin_8)))//这个按键要检测长按       
                {
                USART_Tra[5]|=0X01;
                }               
                        else               
                  USART_Tra[5]&=0Xfe;
                       
          if(!(GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_0)))//up        //这个按键要检测长按
                {       
                 
                  USART_Tra[5]|=0X02;
                }
                        else               
                  USART_Tra[5]&=0Xfd;
          if(!(GPIO_ReadInputDataBit( GPIOB,GPIO_Pin_1)))//DWON //这个按键要检测长按
                {
                  USART_Tra[5]|=0X04;
                }
                        else               
                  USART_Tra[5]&=0Xfb;               
                       
        temp = memcmp(USART_Tra, USART_Tra_old, 8);  // 判断按键的值有没有变化
        if(temp)
        {
          USART_SEND(USART_Tra);//有变化就发送出去
                memcpy(USART_Tra_old, USART_Tra, 8);                 // 新的值替代老的值
        }       
                                TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
        }

}

使用特权

评论回复
7
HAORANAN123|  楼主 | 2017-12-7 11:12 | 只看该作者
int key(void)//这个是判断4*4的矩阵按键程序
{u8 temp=0;
   int KeyVal=0;
        u16 WriteVal=0;
        GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0xf));
        if((GPIOA->IDR & 0x00f0)==0x0000)
        {
                USART_Tra[3]=0; USART_Tra[4]=0;
                USART_Tra[5]&=0x07;
          return -1;
        }
       
        else
        {
          delay_ms(5);
                if((GPIOA->IDR & 0x00f0)==0x0000)
                {
                USART_Tra[3]=0; USART_Tra[4]=0;
                USART_Tra[5]&=0x07;
                return -1;
                }
        }
       
        GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x1));
        switch(GPIOA->IDR & 0x00f0)
        {
                case 0x0010: USART_Tra[3]|=4; KeyVal=11; break; //S19
                case 0x0020: USART_Tra[3]|=1; KeyVal=9; break;         //S18
                case 0x0040: USART_Tra[4]|=0x80;KeyVal=8; break;         //S17
                case 0x0080: USART_Tra[4]|=0x40;KeyVal=7; break;         //S16
        }
        GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x2));
        switch(GPIOA->IDR & 0x00f0)
        {
          case 0x0010: USART_Tra[5]|=0x80; KeyVal=0; break; //S15
                case 0x0020: USART_Tra[4]|=0x20; KeyVal=6; break;//S14
                case 0x0040: USART_Tra[4]|=0x10; KeyVal=5; break; //S13
                case 0x0080: USART_Tra[4]|=8; KeyVal=4; break; //S12
        }
        GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x4));
        switch(GPIOA->IDR & 0x00f0)
        {
          case 0x0010: USART_Tra[3]|=2; KeyVal=10; break; //S11
                case 0x0020: USART_Tra[4]|=4; KeyVal=3; break;//S10
                case 0x0040: USART_Tra[4]|=2; KeyVal=2; break; //S9
                case 0x0080: USART_Tra[4]|=1; KeyVal=1; break;//S8
        }
        GPIO_Write(GPIOA,(GPIOA->ODR & 0xfff0 | 0x8));
        switch(GPIOA->IDR & 0x00f0)
        {
          case 0x0010: USART_Tra[5]|=0x10; KeyVal=13; break; //S7
                case 0x0020: USART_Tra[5]|=0x40; KeyVal=15; break;//S6
                case 0x0040: USART_Tra[5]|=0x20; KeyVal=14; break;//S5
                case 0x0080: USART_Tra[5]|=0x08; KeyVal=12; break;//S4
        }

使用特权

评论回复
8
HAORANAN123|  楼主 | 2017-12-7 11:14 | 只看该作者
mmuuss586 发表于 2017-12-7 09:48
一串完整的数据,最好还是加桢头和桢尾;

现在如果不把按键放在tim2的中断程序里面,数据不丢失了,但是按键有时候失灵

使用特权

评论回复
9
dalarang| | 2017-12-7 11:15 | 只看该作者
把串口中断的优先级调到比TIM2的中断高就可以了。要允许中断嵌套

使用特权

评论回复
10
HAORANAN123|  楼主 | 2017-12-7 11:18 | 只看该作者
int main(void)
{GPIO_InitTypeDef  GPIOStru;
  /* Setup STM32 configuration */
                                        RCC_Configuration();
                                        USART_RCC_Configuration();
                                        GPIO_Configuration();
                                        InitKey();
                                        USART_GPIO_Configuration();                                  
                                        USART1_Configuration();
                                 //        TIM2_Configuration();
                    NVIC_Configuration();
                                        delay_init(72);
          LCD_Init();
                 LCD_ON;
                SPEAK_ON;
           GREEN_ON;
           RED_ON;
    TFT_Clr(BLACK  );
    delay_ms(12000);
        LCD_Fill_Pic();
        // LCD_Fill_Pic2(gImage_pic1);
          while (1)
          {
                        //LCD_Fill_Pic();
      key();   //按键扫描
      if( RX_flag_ok==1) //如果串口接受玩2.6K数据后进行处理显示
                        {
        //        LCD_Fill_Pic1( pic_buff[2],pic_buff);//°´ÕÕÿÐÐÏÔʾ
                                //USART_SEND1(pic_buff);
                          LCD_Fill_Pic2(pic_buff);//ÕûÕÅÏÔʾ                               
                                RX_flag_ok=0;
                               
                        }                               
                }                       
   
}

使用特权

评论回复
11
feelhyq| | 2017-12-7 11:31 | 只看该作者
只要你的矩阵键盘实在主程序里面运行,不管什么样的代码都不会影响串口接收中断接收数据,应该是串口接收万数据后,你主程序中没有及时处理导致接收buffer覆盖或者数据溢出。

使用特权

评论回复
12
nyszx| | 2017-12-7 11:39 | 只看该作者
调整串口接收中断优先级高于键盘扫描,使其能在扫描中断中嵌套,也就是中断优先级最高,如果想要不影响按键扫描,估计还得使用DMA了

使用特权

评论回复
13
plsbackup| | 2017-12-7 22:54 | 只看该作者
串口中断也有断开吗?

使用特权

评论回复
14
kmzuaz| | 2017-12-7 22:54 | 只看该作者
分开发送数据。

使用特权

评论回复
15
qiufengsd| | 2017-12-7 22:55 | 只看该作者
串口中断都解决不了,还真没有办法了。

使用特权

评论回复
16
plsbackup| | 2017-12-7 22:59 | 只看该作者
把串口中断优先级设为最高。

使用特权

评论回复
17
kmzuaz| | 2017-12-7 22:59 | 只看该作者
可以利用上位机进行编写序号发送。

使用特权

评论回复
18
qiufengsd| | 2017-12-7 22:59 | 只看该作者
楼主有可能是你数据处理的时候问题。

使用特权

评论回复
19
Leeone| | 2017-12-8 09:18 | 只看该作者
校验、重发,分页传输,DMA

使用特权

评论回复
20
ayl439| | 2017-12-8 09:25 | 只看该作者
delay_ms(5);

使用特权

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

本版积分规则

26

主题

330

帖子

1

粉丝