久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: stm32串口通信問題 [打印本頁]

作者: forcexda    時間: 2019-11-4 12:20
標題: stm32串口通信問題
本帖最后由 forcexda 于 2019-11-4 12:23 編輯

1、大佬們,我想去掉0x0a和0x0d的判斷協議,改為這樣可以嗎?(里面的蜂鳴器是我用來判斷程序是否跑死,手頭只有isp下載器。。。)如果可以,我會卡在中斷中,這是為啥呢,是因為ore嗎,有沒有可能是因為沒有清中斷造成的,還有一個問題在下面
void USART2_IRQHandler(void)                        //串口2 中斷服務程序
{
u8 Res;//(這句我放在usart.c中最開始的include后面了)if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)  //接收中斷(接收到的數據必須是0x0d 0x0a結尾)
                {
                        Res =USART_ReceiveData(USART2);        //讀取接收到的數據
                        USART2->DR;
                        beep=1;
                        delay_ms(100);
                        beep=0;
                Res =USART_ReceiveData(USART1);        //讀取接收到的數據
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收數據錯誤,重新開始接收
                        USART_ClearFlag(USART2,USART_IT_RXNE);
        
               
                }
}


2、還有,我想在tft中顯示串口發來的數據,百度很久,發現網上都說應該用sprintf函數,但是我在使用過程中,發現沒法顯示,但是我已經強制轉換變量為字符串了,代碼如下

char a;
sprintf(a,"%s",USART_RX_BUF[t]);   LCD_ShowString (0,0,a);

不知道寫法有沒有問題,麻大佬指點一下,在此謝過大佬,新手沒人一起學習討論,遇到問題解決起來真困難。。。。





作者: snni00    時間: 2019-11-4 14:47
問題沒講清楚;
                beep=1;
                        delay_ms(100);
                        beep=0;
這段程序不要放到UART接收中斷,否則串口接收丟數嚴重

作者: forcexda    時間: 2019-11-4 15:52
snni00 發表于 2019-11-4 14:47
問題沒講清楚;
                beep=1;
                        delay_ms(100);

那這段程序可以放在接受完成之后嗎,我主要是用來判斷程序運行情況,額額,還有這個問題是基于原子串口歷程的,原本是有判斷的,我想把0x0d,和0x0a這兩個用來判斷發送完成的代碼去掉,改成上面那段代碼可以嗎

作者: snni00    時間: 2019-11-4 16:23
如果要去掉判斷0x0d,0x0a作為接收完成的話,可以設個定時器,假設每1ms中斷,計數加1,串口接收中斷收到字符則清除計數,主程序判斷如果計數>100ms,則無數據發送,可以認為此幀結束
作者: snni00    時間: 2019-11-4 16:38
void TIM2_IRQHandler(void)      //1ms中斷
{
  if (rx_flag) rx_timeout++;
  else rx_timeout=0;
}

void USART2_IRQHandler(void)                        //串口2 中斷服務程序
{
  rx_flag=1;
  rx_timeout=0;
  ...
}

void main()
{
  ...
while (1)
{
   if (rx_timeout>100)   //100ms字符超時
  {
      rx_flag=0;
      ... //接收完成處理程序
  }
}
}
作者: forcexda    時間: 2019-11-4 18:06
snni00 發表于 2019-11-4 16:38
void TIM2_IRQHandler(void)      //1ms中斷
{
  if (rx_flag) rx_timeout++;

原來是這樣,感謝大佬,那第二個問題中可否用sprintf顯示變量在tft上呢,我原本的想法是把接收的數據保存在buf里,然后再主程序里用sprintf函數一位一位輸出到tft上,不知這樣是否可行

作者: snni00    時間: 2019-11-5 09:30
不清楚你的環境,如果是個串口接收顯示TFT,且在程序中定義sprintf輸出到對應串口的話,應該可以的,在接收完成處理程序處添加即可,收到數據則顯示到TFT
作者: forcexda    時間: 2019-11-6 23:33
snni00 發表于 2019-11-5 09:30
不清楚你的環境,如果是個串口接收顯示TFT,且在程序中定義sprintf輸出到對應串口的話,應該可以的,在接收 ...

我的編譯環境是keil5,我想接受藍牙串口過來的數據,然后單片機處理后顯示在tft上。

開始是學習用歷程usart1來操作,發現buf里面的數據無法顯示在tft上,sprintf函數也使用了,參考的tft歷程和視頻和手頭tft的歷程的不一樣,在確定usart1電腦和單片機通信沒問題以后,看兩種tft歷程也沒看出個所以然。。。

這個是我手頭tft的歷程

void LCD_ShowString(u16 x,u16 y,const u8 *p)
{         
    while(*p!='\0')
    {      
        if(x>LCD_W-16){x=0;y+=16;}
        if(y>LCD_H-16){y=x=0;LCD_Clear(RED);}
        LCD_ShowChar(x,y,*p,0);
        x+=8;
        p++;
    }  
}

void LCD_ShowChar(u16 x,u16 y,u8 num,u8 mode)
{
    u8 temp;
    u8 pos,t;
        u16 x0=x;
        u16 colortemp=POINT_COLOR;      
    if(x>LCD_W-16||y>LCD_H-16)return;            
                          
        num=num-' ';
        Address_set(x,y,x+8-1,y+16-1);
        if(!mode)
        {
                for(pos=0;pos<16;pos++)
                {
                        temp=asc2_1608[(u16)num*16+pos];
                        for(t=0;t<8;t++)
                    {                 
                        if(temp&0x01)POINT_COLOR=colortemp;
                                else POINT_COLOR=BACK_COLOR;
                                LCD_WR_DATA(POINT_COLOR);       
                                temp>>=1;
                                x++;
                    }
                        x=x0;
                        y++;
                }       
        }else
        {
                for(pos=0;pos<16;pos++)
                {
                    temp=asc2_1608[(u16)num*16+pos];               
                        for(t=0;t<8;t++)
                    {                 
                        if(temp&0x01)LCD_DrawPoint(x+t,y+pos);     
                        temp>>=1;
                    }
                }
        }
        POINT_COLOR=colortemp;                                          
}

void LCD_DrawPoint(u16 x,u16 y)
{
        Address_set(x,y,x,y);//設置光標位置
        LCD_WR_DATA(POINT_COLOR);             
}

然后就操作不明白了,不知道為什么人家就是sprintf+lcd_showstring兩句話就能解決,為啥我不行呢,真是一頭霧水,能麻煩大佬看一眼嗎,謝謝大佬




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 97伦理电影网 | 91久久精品一区二区三区 | 久草青青草| 国产伦精品一区二区三区照片91 | 91一区二区 | 三级视频在线观看 | 亚洲国产精品视频一区 | 日韩综合网| 精品一区二区在线观看 | 久草精品视频 | 亚洲欧洲成人 | 密乳av| 国产精品小视频在线观看 | 日日噜噜噜夜夜爽爽狠狠视频, | 国产欧美在线观看 | 婷婷去俺也去 | 日韩三级 | 国产成人精品福利 | 欧美亚洲激情 | av中文字幕在线 | 国产午夜视频 | 91短视频网址 | 午夜电影福利 | 特黄av| 国产ts人妖系列高潮 | 自拍偷拍3p | 亚洲一区免费在线 | 欧美aaa级 | 亚洲欧洲中文日韩 | 国产9999精品| 欧美亚洲国产日韩 | 日本成人三级电影 | 国产精品福利在线 | 国产精品成人一区二区三区夜夜夜 | 羞羞视频在线免费 | 中文字幕一区二区三区四区五区 | 亚洲乱码国产乱码精品精的特点 | 美女福利网站 | 精品1区2区 | 狠狠操狠狠搞 | 亚洲精品乱码久久久久久蜜桃91 |