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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2280|回復: 7
打印 上一主題 下一主題
收起左側

stm32串口通信問題

[復制鏈接]
回帖獎勵 1 黑幣 回復本帖可獲得 1 黑幣獎勵! 每人限 1 次(中獎概率 90%)
跳轉到指定樓層
樓主
ID:551154 發表于 2019-11-4 12:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 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);

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




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:434390 發表于 2019-11-4 14:47 | 只看該作者
問題沒講清楚;
                beep=1;
                        delay_ms(100);
                        beep=0;
這段程序不要放到UART接收中斷,否則串口接收丟數嚴重
回復

使用道具 舉報

板凳
ID:551154 發表于 2019-11-4 15:52 | 只看該作者
snni00 發表于 2019-11-4 14:47
問題沒講清楚;
                beep=1;
                        delay_ms(100);

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

使用道具 舉報

地板
ID:434390 發表于 2019-11-4 16:23 | 只看該作者
如果要去掉判斷0x0d,0x0a作為接收完成的話,可以設個定時器,假設每1ms中斷,計數加1,串口接收中斷收到字符則清除計數,主程序判斷如果計數>100ms,則無數據發送,可以認為此幀結束
回復

使用道具 舉報

5#
ID:434390 發表于 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;
      ... //接收完成處理程序
  }
}
}
回復

使用道具 舉報

6#
ID:551154 發表于 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上,不知這樣是否可行
回復

使用道具 舉報

7#
ID:434390 發表于 2019-11-5 09:30 | 只看該作者
不清楚你的環境,如果是個串口接收顯示TFT,且在程序中定義sprintf輸出到對應串口的話,應該可以的,在接收完成處理程序處添加即可,收到數據則顯示到TFT
回復

使用道具 舉報

8#
ID:551154 發表于 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兩句話就能解決,為啥我不行呢,真是一頭霧水,能麻煩大佬看一眼嗎,謝謝大佬
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩视频―中文字幕 | 天天射中文| 丁香婷婷成人 | 精品综合 | 亚洲狠狠丁香婷婷综合久久久 | 国产精品成av人在线视午夜片 | 在线播放中文字幕 | 视频在线一区二区 | 国产精品射 | 色综合久久天天综合网 | 国产精品2区 | 国产中文字幕在线观看 | 午夜影院网站 | 国产一区不卡在线观看 | 在线中文一区 | 男女在线免费观看 | 色网在线观看 | 午夜天堂| 久久精品一区二区三区四区 | 国产精品观看 | 国产一区| 翔田千里一区二区 | 激情一区二区三区 | 日本国产高清 | 国产日韩欧美精品一区二区三区 | av资源中文在线天堂 | 久久综合久色欧美综合狠狠 | 亚洲一区二区三区视频免费观看 | 成人av网站在线观看 | 亚洲a毛片 | 亚洲一区久久 | 亚洲一区日韩 | 成人高清视频在线观看 | 九色一区| 伊人成人免费视频 | 天天干天天操天天看 | 国产日韩一区二区三区 | 日本淫视频 | 久久爱综合 | 中文字幕日韩欧美一区二区三区 | 精品国产欧美一区二区三区不卡 |