0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于潘多拉開發(fā)板的shell內(nèi)容屏幕顯示

冬至子 ? 來源:Zzxy ? 作者:Zzxy ? 2023-10-16 14:41 ? 次閱讀

潘多拉開發(fā)板有個小屏幕,并且提供了屏幕的驅(qū)動,所以我一直想著把這個屏幕用起來,最后把tshell輸出到串口的內(nèi)容最終也輸出到屏幕上 最終成果如下

1.jpg

實現(xiàn)的過程如下

1.使能lcd

1.jpg

即打開 Enalbe LCD ,下面的Enalbe LCD_console 是我自己加的

2.測試lcd屏幕

在打開后lcd后,rt-studio 會提供一個 樣例讓你輸出(自動添加到applitcations 下面),測試一下lcd是否可以正常使用

3.實現(xiàn)的思路

我這邊有兩種思路

1.在rt_kprintf 中串口中的內(nèi)容輸出后,再輸出到屏幕上
2.由第一種思路擴(kuò)展,rt-thread中提供串口的接受和發(fā)送的回調(diào)函數(shù),我們設(shè)置rt_kprintf使用串口的發(fā)送回調(diào)函數(shù),在發(fā)送數(shù)據(jù)后,將數(shù)據(jù)打印在屏幕上

最終我選擇了第一個方案,因為潘多拉串口沒有實現(xiàn)發(fā)送的回調(diào)函數(shù),以下是具體實現(xiàn)

3.1首先在 rtthread/src/kservice.c 中的rt_kprintf中添加如下

#ifdef BSP_USING_LCD_CONSOLE
if(lcd_show_flag){
shell_show_lcd(rt_log_buf);
}
#endif

其中#ifdef BSP_USING_LCD_CONSOLE 是我添加的lcd控制,lcd_show_flag 為1時,調(diào)用shell_show_lcd,這個函數(shù)會將串口發(fā)送的內(nèi)容打印到屏幕上,為什么有了BSP_USING_LCD_CONSOLE ,還要加個lcd_show_flag來控制呢?因為在開始rt_kprintf第一次被調(diào)用的時候,spi還沒有被初始化,直接調(diào)用會導(dǎo)致報錯,所以我在main中定義lcd_show_flag,并且調(diào)用main運(yùn)行后,將lcd_show_flag置1。

3.2實現(xiàn)調(diào)用shell_show_lcd

#ifdef BSP_USING_LCD_CONSOLE
int lcd_x = LCD_START,lcd_y = LCD_START,size_font=16;
void shell_show_lcd(char *rt_log_buf){
char str[2] ={0};
if(rt_strcmp(rt_log_buf, "x1b[2Jx1b[H")==0){
lcd_x = LCD_START,lcd_y = LCD_START;
lcd_clear(WHITE);
return ;
}
while(*rt_log_buf){
str[0] = *rt_log_buf;
//handle 'n'
if(str[0] == 'n'){
lcd_y = lcd_y + size_font - 1;
lcd_x = LCD_START;
rt_log_buf++;
//clear next line
if (lcd_y + size_font < LCD_H - size_font)
{
lcd_show_string(0, lcd_y + size_font , size_font, " ");
}
continue;
}
//handle 'r'
if(str[0] == 'r'){
lcd_x = LCD_START;
rt_log_buf++;
continue;
}
//hand del and backspace
if (str[0] == 0x7f || str[0] == 0x08){
lcd_x = lcd_x - (size_font/2 - 1);
if (lcd_x < LCD_START)
{
lcd_x = LCD_W - size_font / 2;
lcd_y -= size_font;
}
lcd_show_string(lcd_x, lcd_y , size_font, " ");
rt_log_buf++;
continue;
}
if (lcd_x > LCD_W - size_font / 2)
{
lcd_x =LCD_START;
lcd_y += size_font;
}
if (lcd_y > LCD_H - size_font)
{
lcd_y = lcd_x = LCD_START;
lcd_show_string(0, 0 , size_font, " ");
}
lcd_show_string(lcd_x, lcd_y , size_font, str);
lcd_x = lcd_x + size_font/2 - 1;
rt_log_buf++;
}
}
#endif

不到一百行代碼,非常簡單,我們逐步看一下

首先我們看最重要的一個函數(shù)

lcd_show_string,這個官方提供的,其函數(shù)原型如下

1.jpg

x y 是你要輸出的位置,size是字符的大小,fmt則是要輸出的字符,其中size時限定16 24 32 的,其他的尺寸會報錯
第2行 定義 x,y,以及字體大小font
第7-11行 處理clear指令,clear指令發(fā)送后,會輸出”x1b[2Jx1b[H”,我們在讀到這串代碼將屏幕清空,并將xy置0
第16-27行,處理n,主要在處理完n后我清空了下一行,主要時屏幕太小,很容易擠滿,看不清輸出到哪里了
第30-34行,處理 r ,清楚當(dāng)前行,重置x
第36-44行,處理 del 和 backspace ,計算回退的位置,并且用空格來填充
第52-61行,判斷下一個字符是否會超過xy的邊界值
第63-65行,輸出字符,將x自增,并且繼續(xù)處理下一個字符

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • LCD屏
    +關(guān)注

    關(guān)注

    0

    文章

    122

    瀏覽量

    15368
  • Shell
    +關(guān)注

    關(guān)注

    1

    文章

    363

    瀏覽量

    23257
  • 回調(diào)函數(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    87

    瀏覽量

    11528
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1261

    瀏覽量

    39837
收藏 人收藏

    評論

    相關(guān)推薦

    正點(diǎn)原子潘多拉開發(fā)板免費(fèi)試用

    潘多拉開發(fā)板是正點(diǎn)原子和RT-Thread聯(lián)合出品的IOT開發(fā)板,IOT方面我們采用的國內(nèi)自主物聯(lián)網(wǎng)操作系統(tǒng)RT-Thread。了解更多>>
    發(fā)表于 05-14 11:29

    如何在RT-Thread潘多拉開發(fā)板上實現(xiàn)電源管理?

    本文介紹了基于 RT-Thread潘多拉開發(fā)板電源管理組件的使用和移植過程。
    發(fā)表于 03-30 06:47

    如何在潘多拉開發(fā)板上運(yùn)行Modbus主機(jī)與從機(jī)?

    本文的目的是介紹如何在潘多拉開發(fā)板上運(yùn)行Modbus主機(jī)與從機(jī)。首先介紹串口方式通信的Modbus主機(jī)和從機(jī)。然后介紹如何使用網(wǎng)絡(luò)進(jìn)行Modbus通信。
    發(fā)表于 03-30 08:01

    怎樣去解決潘多拉開發(fā)板SFUD初始化失敗的問題

    潘多拉開發(fā)板SFUD為什么會初始化失?。吭鯓尤ソ鉀Q潘多拉開發(fā)板SFUD初始化失敗的問題?
    發(fā)表于 09-06 06:27

    潘多拉開發(fā)板的使用感受

    怎樣去使用潘多拉開發(fā)板呢?
    發(fā)表于 10-26 07:39

    快速上手STM32L475潘多拉開發(fā)板BSP的方法

    簡介本文檔為 RT-Thread 開發(fā)團(tuán)隊為 STM32L475 潘多拉開發(fā)板提供的 BSP (級支持包) 說明。主要內(nèi)容如下:開發(fā)板資源
    發(fā)表于 03-28 10:20

    用rtt studio的模板下載到潘多拉開發(fā)板之后開發(fā)板就黑屏了,如何讓屏幕變亮?

    用rtt studio的模板下載到潘多拉開發(fā)板之后潘多拉開發(fā)板就黑屏了,怎么才能讓屏幕亮那
    發(fā)表于 04-18 09:34

    潘多拉開發(fā)板+RT-Thread Studio芯片沒有反應(yīng)如何處理?

    請教一個問題。我用正點(diǎn)原子潘多拉開發(fā)板+RT-Thread Studio。建立工程時選擇按芯片創(chuàng)建,芯片選的是STM32L475VETx。編譯沒問題,但下載后,終端沒有任何顯示,甚至也沒有
    發(fā)表于 05-26 15:06

    潘多拉開發(fā)板+RT-Thread Studio選擇按芯片創(chuàng)建無反應(yīng)請問這是什么原因呢

    請教一個問題。我用正點(diǎn)原子潘多拉開發(fā)板+RT-Thread Studio。建立工程時選擇按芯片創(chuàng)建,芯片選的是STM32L475VETx。編譯沒問題,但下載后,終端沒有任何顯示,甚至也沒有
    發(fā)表于 07-29 10:33

    有沒有其他方法在潘多拉開發(fā)板上能夠?qū)崿F(xiàn)網(wǎng)絡(luò)播放功能

    最近剛?cè)胧至苏c(diǎn)原子的潘多拉開發(fā)板,在使用webclient軟件包的時候發(fā)現(xiàn),一旦打開MdebTLS Support之后,編譯就不通過了,顯示“請修改鏈接腳本以擴(kuò)大ROM大小”。也嘗試網(wǎng)上尋找方法
    發(fā)表于 08-18 09:54

    有沒有其他方法在潘多拉開發(fā)板上能夠?qū)崿F(xiàn)網(wǎng)絡(luò)播放功能呢

    最近剛?cè)胧至苏c(diǎn)原子的潘多拉開發(fā)板,在使用webclient軟件包的時候發(fā)現(xiàn),一旦打開MdebTLS Support之后,編譯就不通過了,顯示“請修改鏈接腳本以擴(kuò)大ROM大小”。也嘗試網(wǎng)上尋找方法
    發(fā)表于 10-19 11:08

    基于潘多拉開發(fā)板的tshell串口輸出內(nèi)容

    潘多拉開發(fā)板有個小屏幕,并且提供了屏幕的驅(qū)動,所以我一直想著把這個屏幕用起來,最后把tshell輸出到串口的內(nèi)容最終也輸出到
    發(fā)表于 12-12 16:07

    STM32CubeMX使用-1.點(diǎn)個燈(正點(diǎn)原子潘多拉開發(fā)板)

    STM32CubeMX使用-1.點(diǎn)個燈(正點(diǎn)原子潘多拉開發(fā)板)
    發(fā)表于 12-08 15:21 ?3次下載
    STM32CubeMX使用-1.點(diǎn)個燈(正點(diǎn)原子<b class='flag-5'>潘多拉開發(fā)板</b>)

    潘多拉開發(fā)板SFUD初始化失敗問題[SFUD] Error W25Q128 flash device is initialize fail

    【已解決】潘多拉開發(fā)板SFUD初始化失敗問題[SFUD] Error: W25Q128 flash device is initialize fail.問題描述如下:  
    發(fā)表于 12-22 19:44 ?11次下載
    <b class='flag-5'>潘多拉開發(fā)板</b>SFUD初始化失敗問題[SFUD] Error W25Q128 flash device is initialize fail

    rt-studio潘多拉開發(fā)板最新rt-thread不能運(yùn)行解決辦法

    在rt-studio 上 選擇基于開發(fā)板的項目,選擇潘多拉,rt-thread選擇lasted ,如下圖
    的頭像 發(fā)表于 10-16 14:50 ?1237次閱讀
    rt-studio<b class='flag-5'>潘多拉開發(fā)板</b>最新rt-thread不能運(yùn)行解決辦法