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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2415|回復: 13
收起左側

stm32串口數據顯示問題

[復制鏈接]
回帖獎勵 1 黑幣 回復本帖可獲得 1 黑幣獎勵! 每人限 1 次
ID:248659 發表于 2020-2-24 17:46 | 顯示全部樓層 |閱讀模式
大佬們,我又來問問題我再學習stm32串口的時候,看的是浦中的視屏資料,覺得操作起來還是很簡單的,但是當我想拓展一下的時候出現了問題,哎

我打算把串口的數據顯示在屏幕上
使用浦中教的串口寫法,寫出接受部分,
void USART2_IRQHandler(void)                        //串口2 中斷服務程序
{
                        static u16 count = 0;
                        u16 rdata;
                        if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
                                {
                                         rdata = USART_ReceiveData(USART2);        //讀取接收到的數據
                                         Res[count++] = rdata;                                               
                                         USART2->DR;
                                                //USART_SendData(USART2,rdata);
                                                //while(USART_GetFlagStatus(USART2,USART_FLAG_TC) != SET);
                                }       
                                        USART_ClearFlag(USART2,USART_IT_RXNE);
                                        USART2->DR;
                                        USART2->SR;
                       
}

然后把接受到res里的數據在主函數中調用lcd函數顯示出來
LCD_ShowString (0,0,&Res);
這個時候數據會一直接受一直存,不會清控,接受什么數據都會排在后面顯示出來
然后我的想法就是直接清空res,屏幕上就會一直顯示不同的數據了,但是又沒想明白放在那里

還有就是想問一下sprintf函數到底應該如何用,早先我顯示的時候是這樣寫的(A是char類型的)
sprintf(A,"%S", Res[0]);
LCD_ShowString (0,0,A);

然后屏幕上什么都不顯示。。。


顯示代碼:
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++;
    }  
}


已經整麻了。。。自學得有點暈頭轉向。。。。瘋狂碰壁。。。望大佬指點
回復

使用道具 舉報

ID:248659 發表于 2020-2-24 20:22 | 顯示全部樓層
如果我在這后面添加了清零Res[count++] = rdata;
那么在屏幕顯示上只能接受到最后一位,比如發了1234,就只有4,如果發送速度快一點,還會出現24,34這樣的,我想這應該是指針問題,但是還沒想明白怎么解決
回復

使用道具 舉報

ID:419968 發表于 2020-2-25 00:20 | 顯示全部樓層
LCD_ShowString (0,0,&Res);改成LCD_ShowString (0,0,Res);看看
回復

使用道具 舉報

ID:248659 發表于 2020-2-25 11:49 | 顯示全部樓層
adject 發表于 2020-2-25 00:20
LCD_ShowString (0,0,&Res);改成LCD_ShowString (0,0,Res);看看

不能去哦,去了就直接接受回來的數據不顯示了
回復

使用道具 舉報

ID:679425 發表于 2020-2-25 13:11 | 顯示全部樓層
LCD_ShowChar(x,y,*p,0);,怎么多出個0來呢?
回復

使用道具 舉報

ID:248659 發表于 2020-2-25 16:08 | 顯示全部樓層
haierzaifei11 發表于 2020-2-25 13:11
LCD_ShowChar(x,y,*p,0);,怎么多出個0來呢?

嗷嗷,這個是showchar里面有個模式的原因,代碼如下
/在指定位置顯示一個字符,包括部分字符
//x:0~127
//y:0~63
//mode:0,反白顯示;1,正常顯示                                 
//size:選擇字體 16/12
  1. void OLED_ShowChar(u8 x,u8 y,u8 chr,u8 Char_Size)
  2. {              
  3.         unsigned char c=0,i=0;        
  4.                 c=chr-' ';//得到偏移后的值                        
  5.                 if(x>Max_Column-1){x=0;y=y+2;}
  6.                 if(Char_Size ==16)
  7.                         {
  8.                         OLED_Set_Pos(x,y);        
  9.                         for(i=0;i<8;i++)
  10.                         OLED_WR_Byte(F8X16[c*16+i],OLED_DATA);
  11.                         OLED_Set_Pos(x,y+1);
  12.                         for(i=0;i<8;i++)
  13.                         OLED_WR_Byte(F8X16[c*16+i+8],OLED_DATA);
  14.                         }
  15.                         else {        
  16.                                 OLED_Set_Pos(x,y);
  17.                                 for(i=0;i<6;i++)
  18.                                 OLED_WR_Byte(F6x8[c][i],OLED_DATA);
  19.                                 
  20.                         }
  21. }
復制代碼
回復

使用道具 舉報

ID:248659 發表于 2020-2-25 21:28 | 顯示全部樓層
別沉哇,嚶嚶嚶
回復

使用道具 舉報

ID:88172 發表于 2020-2-26 10:14 | 顯示全部樓層
添加頭文件   #include <string.h>,并在  USART2->DR;USART2->SR;后面添加  memset(Res,0,sizeof(Res));試試
回復

使用道具 舉報

ID:698552 發表于 2020-2-26 15:23 | 顯示全部樓層
建議你網上看下人家調通的程序,網上很多的
回復

使用道具 舉報

ID:698552 發表于 2020-2-26 15:26 | 顯示全部樓層
#include "stdio.h",void LCD_ShowString(u16 x,u16 y,const u8 *p)該函數的參數統一
回復

使用道具 舉報

ID:248659 發表于 2020-2-27 00:17 | 顯示全部樓層
司海心 發表于 2020-2-26 10:14
添加頭文件   #include ,并在  USART2->DR;USART2->SR;后面添加  memset(Res,0,sizeof(Res));試試

主函數里面還是直接用showstring這個函數嗎,還是調用sprintf這個函數以后再調用showstring呢,如果還是直接使用showstring函數,接受回來的字符串還是會一直累加直到占滿屏幕,如果調用sprint函數再調用showstring直接是不顯示

我的sprintf函數是這樣寫的
char A
sprintf(A,"USART: %S", Res[0]);
LCD_ShowString (0,0,A);
是否是因為我的寫法有問題,或者根本函數使用方法不對呢,望回復
回復

使用道具 舉報

ID:248659 發表于 2020-2-27 00:18 | 顯示全部樓層
zjgchenzhen 發表于 2020-2-26 15:26
#include "stdio.h",void LCD_ShowString(u16 x,u16 y,const u8 *p)該函數的參數統一

說實話,沒看明白
回復

使用道具 舉報

ID:248659 發表于 2020-2-27 00:21 | 顯示全部樓層
zjgchenzhen 發表于 2020-2-26 15:23
建議你網上看下人家調通的程序,網上很多的

看了呢,但是移植過來就不對了呢,usart還是tft程序我都有參考,但是只能實現單一功能,初學stm32,還是菜鳥代碼看不懂的我就抄,這是實在看不明白了,所以來論壇請教
回復

使用道具 舉報

ID:699089 發表于 2020-2-27 15:04 | 顯示全部樓層
不管是串口還是TFT,測試時先將單個功能代碼測試,其他功能代碼屏蔽,單個測試
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: xxxxxx国产| 一级大黄| 久久69精品久久久久久久电影好 | 国产精品高清一区二区三区 | 国产在线精品一区二区三区 | 中文字幕在线一区 | 一级黄色网页 | 国产伦精品一区二区三区高清 | 一区二区三区福利视频 | 国产免费一区二区三区 | 国产伦精品一区二区三区照片91 | 久久久久亚洲精品中文字幕 | 日韩福利在线观看 | 久久成人国产 | 婷婷国产一区二区三区 | 国产精品99精品久久免费 | 免费视频成人国产精品网站 | 久久国产一区二区 | 久久一本| 欧美做暖暖视频 | 青青草视频免费观看 | 91网站在线看 | 欧美久久一区二区 | 国产精品久久久久久久久 | 成人亚洲视频 | 97精品超碰一区二区三区 | 北条麻妃一区二区三区在线视频 | 91资源在线 | 亚洲综合二区 | 欧美一区二区 | 成人一区精品 | 婷婷开心激情综合五月天 | 国产一二三区精品视频 | 爱综合| 国产精品视频一二三 | 国产四区 | www久久久 | 免费的日批视频 | 99免费在线观看视频 | 综合久久99 | 亚洲人人 |