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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2169|回復(fù): 7
收起左側(cè)

stm32串口通信問題

[復(fù)制鏈接]
回帖獎勵 1 黑幣 回復(fù)本帖可獲得 1 黑幣獎勵! 每人限 1 次(中獎概率 90%)
ID:551154 發(fā)表于 2019-11-4 12:20 | 顯示全部樓層 |閱讀模式
本帖最后由 forcexda 于 2019-11-4 12:23 編輯

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


2、還有,我想在tft中顯示串口發(fā)來的數(shù)據(jù),百度很久,發(fā)現(xiàn)網(wǎng)上都說應(yīng)該用sprintf函數(shù),但是我在使用過程中,發(fā)現(xiàn)沒法顯示,但是我已經(jīng)強制轉(zhuǎn)換變量為字符串了,代碼如下

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

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




回復(fù)

使用道具 舉報

ID:434390 發(fā)表于 2019-11-4 14:47 | 顯示全部樓層
問題沒講清楚;
                beep=1;
                        delay_ms(100);
                        beep=0;
這段程序不要放到UART接收中斷,否則串口接收丟數(shù)嚴(yán)重
回復(fù)

使用道具 舉報

ID:551154 發(fā)表于 2019-11-4 15:52 | 顯示全部樓層
snni00 發(fā)表于 2019-11-4 14:47
問題沒講清楚;
                beep=1;
                        delay_ms(100);

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

使用道具 舉報

ID:434390 發(fā)表于 2019-11-4 16:23 | 顯示全部樓層
如果要去掉判斷0x0d,0x0a作為接收完成的話,可以設(shè)個定時器,假設(shè)每1ms中斷,計數(shù)加1,串口接收中斷收到字符則清除計數(shù),主程序判斷如果計數(shù)>100ms,則無數(shù)據(jù)發(fā)送,可以認(rèn)為此幀結(jié)束
回復(fù)

使用道具 舉報

ID:434390 發(fā)表于 2019-11-4 16:38 | 顯示全部樓層
void TIM2_IRQHandler(void)      //1ms中斷
{
  if (rx_flag) rx_timeout++;
  else rx_timeout=0;
}

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

void main()
{
  ...
while (1)
{
   if (rx_timeout>100)   //100ms字符超時
  {
      rx_flag=0;
      ... //接收完成處理程序
  }
}
}
回復(fù)

使用道具 舉報

ID:551154 發(fā)表于 2019-11-4 18:06 | 顯示全部樓層
snni00 發(fā)表于 2019-11-4 16:38
void TIM2_IRQHandler(void)      //1ms中斷
{
  if (rx_flag) rx_timeout++;

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

使用道具 舉報

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

使用道具 舉報

ID:551154 發(fā)表于 2019-11-6 23:33 | 顯示全部樓層
snni00 發(fā)表于 2019-11-5 09:30
不清楚你的環(huán)境,如果是個串口接收顯示TFT,且在程序中定義sprintf輸出到對應(yīng)串口的話,應(yīng)該可以的,在接收 ...

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

開始是學(xué)習(xí)用歷程usart1來操作,發(fā)現(xiàn)buf里面的數(shù)據(jù)無法顯示在tft上,sprintf函數(shù)也使用了,參考的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);//設(shè)置光標(biāo)位置
        LCD_WR_DATA(POINT_COLOR);             
}

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

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久综合一区 | 91看片官网 | 亚洲aⅴ | 中文字幕不卡视频在线观看 | 天天干天天操天天看 | 久久久性色精品国产免费观看 | 亚洲区一| 精品日韩欧美一区二区 | 亚洲成人精品在线 | 精品人伦一区二区三区蜜桃网站 | 操久久| 自拍偷拍精品 | 久久久av一区 | 日韩五月天| 女女百合av大片一区二区三区九县 | 久久久久久国产精品 | 91av在线免费播放 | 亚洲国产一区二区在线 | 亚洲一区二区视频 | 久久黄网 | 日韩精品1区2区 | 国产精久久久久久久 | 久久专区 | 欧美乱操 | 国产精品婷婷 | 国产一区二区在线播放 | 视频在线一区 | 中文字幕第十五页 | 性色av香蕉一区二区 | 在线观看黄色电影 | 米奇7777狠狠狠狠视频 | 欧美日韩视频在线第一区 | 久久九九影视 | 日韩一区二区三区四区五区 | 亚洲精品视频免费 | 欧美日韩国产高清视频 | 日本视频在线播放 | 6080yy精品一区二区三区 | 伊人网综合 | 色播99 | 欧美一区二区三区的 |