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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

如何讓MCU串口十六進制轉換為對應ASCII數字?

  [復制鏈接]
跳轉到指定樓層
#
ID:668693 發表于 2022-3-10 19:06 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
想在程序中將寄存器內容用ASCII方式發送出來,大家有沒有好的想法
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復

使用道具 舉報

20#
ID:1097337 發表于 2023-11-2 11:17 | 只看該作者

果然簡單又易懂。收藏了。
回復

使用道具 舉報

19#
ID:1097337 發表于 2023-11-2 10:57 | 只看該作者
188610329 發表于 2022-3-12 16:20
額…………, 首先,我辯解一下,我對"效率"和"代碼長度"確實比較在意, 但是,并沒有“太執著” 。可能 ...

高手間切磋,謙虛豁達,小小白們非常受益。
謝謝各位賜教。
關注了!
回復

使用道具 舉報

18#
ID:939553 發表于 2023-11-1 21:08 | 只看該作者
和上面大佬的思路差不多,我個人常用的,僅參考
unsigned char code ASCLIB[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
void printf_tx_len_hextoasc(unsigned char *in_buff , unsigned int buff_len)
{
       
        while(buff_len-- > 1)
        {
                printf("%c",ASCLIB[*in_buff >> 4]);
                printf("%c",ASCLIB[*in_buff++ & 0x0f]);
                printf("%c",0x20);
        }
       
        //最后一個字節
        printf("%c",ASCLIB[*in_buff >> 4]);
        printf("%c",ASCLIB[*in_buff & 0x0f]);
}
回復

使用道具 舉報

17#
ID:883242 發表于 2023-11-1 20:35 | 只看該作者
hei51com 發表于 2022-3-12 10:59
這代碼寫的水平高啊

高什么高啊!地板早就把答案寫出來了,而且地板的寫法跟8樓本質完全一樣,但是比8樓優雅了太多,但是你們就沒有一個人能看懂???
回復

使用道具 舉報

16#
ID:168971 發表于 2023-11-1 18:09 | 只看該作者
188610329 發表于 2022-3-12 02:22
還是那句話,結構體是給有錢人玩的。

typedef        unsigned char        u8;

說的沒錯,厲害厲害
回復

使用道具 舉報

15#
ID:401564 發表于 2022-3-12 20:13 | 只看該作者
dzbj 發表于 2022-3-12 19:45
您用51片子干一件事 而且只干好這一件事 那么這想法當然沒問題

但窮人不這么想 通常窮人希望51也能當 ...

行吧,就這樣吧
回復

使用道具 舉報

14#
ID:47286 發表于 2022-3-12 19:45 | 只看該作者
Y_G_G 發表于 2022-3-12 13:36
我感覺你對于"效率"和"代碼長度"太執著了,處處帶著匯編的思想去用C
如果是我,我一定會先用sprintf,單單 ...

您用51片子干一件事 而且只干好這一件事 那么這想法當然沒問題

但窮人不這么想 通常窮人希望51也能當個系統用 比如我這樣的 哪怕做個開閉燈泡的板子 也想著不光能穩定 可靠 長久的開閉 還能監控電壓 電流變化 可以調光 可以紀錄系統狀態 保存故障碼 容錯 支持故障回報和查詢 還需要通過通訊和系統協同 而且通訊是頻繁的 等等等等 沒準還會有更多想法和要求 這種時候 對每次的執行效率就可能會要求很高 至少自我要求比較高 所以我比較喜歡那位大佬的思路 雖然不是必須每次都追求高效率 但能做到為什么不呢 對我來說 限制功能想象的因素只有運算速度 只要速度夠 功能就可以繼續加下去
回復

使用道具 舉報

13#
ID:47286 發表于 2022-3-12 19:35 | 只看該作者
188610329 發表于 2022-3-12 02:22
還是那句話,結構體是給有錢人玩的。

typedef        unsigned char        u8;

程序寫的真漂亮 佩服

這樣的結果是把0x4f編程 "4" "f" 對么 如果是 這有啥意義啊 用于1602的顯示么 那等顯示時還得再拆temp

講真 一直沒想明白樓主的要求是啥目的 寄存器不就跟一排8個撥動開關一樣么 要設置啥就扳到1 那顯示的話變成1010 0011這種方式不是更直觀么 顯示個16進制格式的ASCII做啥用啊
回復

使用道具 舉報

12#
ID:624769 發表于 2022-3-12 16:20 | 只看該作者
本帖最后由 188610329 于 2022-3-12 18:09 編輯
Y_G_G 發表于 2022-3-12 13:36
我感覺你對于"效率"和"代碼長度"太執著了,處處帶著匯編的思想去用C
如果是我,我一定會先用sprintf,單單 ...

額…………, 首先,我辯解一下,我對"效率"和"代碼長度"確實比較在意, 但是,并沒有“太執著” 。可能,你把我和某人搞混了,記得有一篇我忘了是誰發的,關于“效率”的帖子,我倆都有參與過討論,你的觀點是不需要去考慮,我的觀點是可以考慮,但是不需要去太過執著,如果在低端機跑復雜程序,那么,就要提高效率,減小代碼,如果機器本來就高端,程序也不復雜,就沒有必要花精力和時間去提高那一丁點的效率,以及一丁點的代碼長度。也許,你是把我和發帖人搞混了??

其次,你說的很對,我很多時候,都會用匯編思想去用C,這個好像是不受控制的,下意識的,就會出現,但是,我對此并不覺得不好,因為可以不需要刻意而為,就能在一定程度上提高運行效率,以及縮小代碼長度,何樂而不為呢?
其實在這個論壇里,我最佩服的三個人你是其中之一,不僅僅是你懂得多,對各種問題都有了解,而且回答比較熱心,關鍵是,雖然有時你用詞會比較尖銳,但是直指問題中心,也從來不會通過貶低別人來抬高自己,所以,對你,我其實也算神交已久了。
而且,你也算是 C 和 ASM 雙修, 我一直認為,其實我們有一點心得是可以互相交流的,只不過,與我不同的是,你是從匯編,轉去的C, 我以前是學B的,玩單片機才去學的C 發現 學不下去了,才開始轉去的匯編。
所以,我和你對 C 與 匯編 這兩個東西的印象會 完全不同,
你會覺的,C全面優于匯編,
我會覺得,C除了(通用性,易讀易寫)不可否認之外,對于單片機控制而言,是完全不如匯編的。好像我越來越多時候,離不開匯編了,我也知道,這對今后和別人代碼交流是不利。

聊到這里,我順便請教一個問題,在C語言里面, 我們如果定義一個數組:  u16  Buf[32];   用來存放16位的數據, 但是,定時的需要把數據 存入Eeprom, 那么就需要分別操作 高,低 8位, 比較麻煩,我現在的做法是:
ASM 文件:
PUBLIC        U16_Buf,U8_Buf

DATA_Transfer        Segment DATA
RSEG        DATA_Transfer
U16_Buf:
U8_Buf:                    DS        64

END


C 文件:
extern        u16        U16_Buf[32];
extern        u8        U8_Buf[64];


利用這樣兩個文件,來作出兩個 目標地址其實一樣,但是步進不同的兩個數組,那么通過 對兩個數組操作,達到16位,8位的無縫切換,這里我就想問一下,C下面,應該有可以直接達到這個目的的方法,但是我找了很多資料,沒有找到這個方法,不知道能否指點一二, 畢竟我也想一點點擺脫對匯編的依賴。
回復

使用道具 舉報

11#
ID:401564 發表于 2022-3-12 13:36 | 只看該作者
188610329 發表于 2022-3-12 02:22
還是那句話,結構體是給有錢人玩的。

typedef        unsigned char        u8;

我感覺你對于"效率"和"代碼長度"太執著了,處處帶著匯編的思想去用C
如果是我,我一定會先用sprintf,單單這個函數,要占用1K和內存,效率更是慢得不用說的
但如果我用的單機是有8K或者是17K的內存,串口函數只要不是有意有去讓它變慢,一個串口函數是絕對有足夠時間執行的
那么,整體下來,C代碼簡單了,工作量小了,功能也更多了,代碼空間也足夠用,我實在是找不到不用它的理由
要是我,我一定是先一直浪費著這個函數占用的空間,肯定是要等到代碼寫下去之后,發現空間不夠用了,我才會考慮用別的方法
回復

使用道具 舉報

10#
ID:401564 發表于 2022-3-12 13:22 | 只看該作者
名字不是重點 發表于 2022-3-11 23:46
謹慎表示懷疑:
//定義一個結構體,用于存放轉換字節
typedef struct {

我只看過ADC的高低位結合的匯編代碼和32位和以下的乘法,位移的對比,匯編代碼中并沒有位移指令,全部都是通過加法實現,代碼都是一樣
至于結構體的運算,沒用過,不發表意見
回復

使用道具 舉報

9#
ID:731155 發表于 2022-3-12 10:59 | 只看該作者
188610329 發表于 2022-3-12 02:22
還是那句話,結構體是給有錢人玩的。

typedef        unsigned char        u8;

這代碼寫的水平高啊
回復

使用道具 舉報

8#
ID:824490 發表于 2022-3-12 09:34 | 只看該作者
188610329 發表于 2022-3-12 02:22
還是那句話,結構體是給有錢人玩的。

typedef        unsigned char        u8;

學習了~~
回復

使用道具 舉報

7#
ID:624769 發表于 2022-3-12 02:22 | 只看該作者
名字不是重點 發表于 2022-3-11 23:46
謹慎表示懷疑:
//定義一個結構體,用于存放轉換字節
typedef struct {

還是那句話,結構體是給有錢人玩的。

typedef        unsigned char        u8;
typedef        unsigned short        u16;

u8 code        ASCII_Code[]        = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

u16        HEX2ASCII(u8 dat)
{
        u16 temp;
        temp = (ASCII_Code[dat>>4] << 8);
        temp |= ASCII_Code[dat&0x0f];
        return        temp;
}

void        main()
{
        u8        tt        = 0xf3;
        u16        temp;
        temp =        HEX2ASCII(tt);
        while(1);
}


Build target 'Target 1'
compiling TestC.C...
assembling Transfer.asm...
linking...
Program Size: data=15.0 xdata=0 code=59
"TestC" - 0 Error(s), 0 Warning(s).

運行到結果:
花費0.00020650 @24M;(啟動后初始是:0.00019450, 即,實際耗時0.00001200)


回復

使用道具 舉報

6#
ID:824490 發表于 2022-3-11 23:46 | 只看該作者
Y_G_G 發表于 2022-3-11 20:12
Keil環境下寫的8051,乘法加法位移都是通過加法實現的,并不是我們想象的"位移"
ADC中常用的ADC_RES*256+A ...

謹慎表示懷疑:
//定義一個結構體,用于存放轉換字節
typedef struct {
  unsigned char reg_h;
  unsigned char reg_l;
}asc_code;
///////////////////////////////////////////////////////////
//把8位(1字節)二進制轉為ASCII碼以方便顯示
//byte  : 待轉換的16進制變量
//返回值: ASCII碼
asc_code byte2ascii(unsigned char byte)
{
asc_code temp;

temp.reg_h= byte/16<10? byte/16+0x30:byte/16+0x37;         //方法1
temp.reg_l= byte%16<10? byte%16+0x30:byte%16+0x37;

//temp.reg_h= byte>>4<10? byte/16+0x30:byte/16+0x37;         //方法2
//temp.reg_l= byte&0x0f<10? byte%16+0x30:byte%16+0x37;


return temp;
}

void main()

{
unsigned char tt=0xf3;
asc_code temp;

temp= byte2ascii(tt)  ;

while(1) ;//模擬運行到這里得出結果;


}


這兩種代碼中,各自編譯后的情況:
前兩行:
Build target 'Target 1'
compiling test.c...
linking...
Program Size: data=13.0 xdata=0 code=336
"test" - 0 Error(s), 0 Warning(s).
后兩行:
Build target 'Target 1'
compiling test.c...
linking...
Program Size: data=13.0 xdata=0 code=320 //少那么一點點。
"test" - 0 Error(s), 0 Warning(s).

運行到結果:
前兩行花費0.00024550 @24M;
后兩行花費0.00024050 @24M;//快那么一點點。。


歡迎指點!

回復

使用道具 舉報

5#
ID:401564 發表于 2022-3-11 20:12 | 只看該作者
名字不是重點 發表于 2022-3-10 20:53
移位更好。速度快,效率高。

Keil環境下寫的8051,乘法加法位移都是通過加法實現的,并不是我們想象的"位移"
ADC中常用的ADC_RES*256+ADC_RESL
你用位移也是一樣的,都是通過加法實現的,并不會因為你用了位移,效率就高了
不信你寫個代碼仿真看一下編譯后的匯編代碼就知道了
別的編程環境就不知道了
回復

使用道具 舉報

地板
ID:824490 發表于 2022-3-10 20:53 | 只看該作者
發表于 2022-3-10 20:40
我是直接判斷寄存器然后加0x30,高位的話在移位繼續判斷

移位更好。速度快,效率高。
回復

使用道具 舉報

板凳
ID:879809 發表于 2022-3-10 20:41 | 只看該作者
  1. ch[0]="0123456789abcdef"[i>>4];
  2. ch[1]="0123456789abcdef"[i&0xf];
復制代碼
回復

使用道具 舉報

沙發
ID:668693 發表于 2022-3-10 20:40 來自觸屏版 | 只看該作者
名字不是重點 發表于 2022-3-10 20:20
//定義一個結構體,用于存放轉換字節
typedef struct {
  unsigned char reg_h;

我是直接判斷寄存器然后加0x30,高位的話在移位繼續判斷
回復

使用道具 舉報

樓主
ID:824490 發表于 2022-3-10 20:20 | 只看該作者
//定義一個結構體,用于存放轉換字節
typedef struct {
  unsigned char reg_h;
  unsigned char reg_l;
}asc_code;
///////////////////////////////////////////////////////////
//把8位(1字節)二進制轉為ASCII碼以方便顯示
//byte  : 待轉換的16進制變量
//返回值: ASCII碼
asc_code byte2ascii(unsigned char byte)
{
asc_code temp;
temp.reg_h= byte/16<10? byte/16+0x30:byte/16+0x37;         //如果值小于10(0x0a),則+0x30,否則+0x37
temp.reg_l= byte%16<10? byte%16+0x30:byte%16+0x37;
return temp;
}
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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