欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2477|回復: 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);

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




回復

使用道具 舉報

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,則無數據發送,可以認為此幀結束
回復

使用道具 舉報

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;
      ... //接收完成處理程序
  }
}
}
回復

使用道具 舉報

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上,不知這樣是否可行
回復

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

9#
無效樓層,該帖已經被刪除
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表