找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3171|回復(fù): 20
打印 上一主題 下一主題
收起左側(cè)

如何讓MCU串口十六進(jìn)制轉(zhuǎn)換為對應(yīng)ASCII數(shù)字?

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:668693 發(fā)表于 2022-3-10 19:06 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
想在程序中將寄存器內(nèi)容用ASCII方式發(fā)送出來,大家有沒有好的想法
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:824490 發(fā)表于 2022-3-10 20:20 | 只看該作者
//定義一個(gè)結(jié)構(gòu)體,用于存放轉(zhuǎn)換字節(jié)
typedef struct {
  unsigned char reg_h;
  unsigned char reg_l;
}asc_code;
///////////////////////////////////////////////////////////
//把8位(1字節(jié))二進(jìn)制轉(zhuǎn)為ASCII碼以方便顯示
//byte  : 待轉(zhuǎn)換的16進(jìn)制變量
//返回值: 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;
}
回復(fù)

使用道具 舉報(bào)

板凳
ID:668693 發(fā)表于 2022-3-10 20:40 來自手機(jī) | 只看該作者
名字不是重點(diǎn) 發(fā)表于 2022-3-10 20:20
//定義一個(gè)結(jié)構(gòu)體,用于存放轉(zhuǎn)換字節(jié)
typedef struct {
  unsigned char reg_h;

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

使用道具 舉報(bào)

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

使用道具 舉報(bào)

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

移位更好。速度快,效率高。
回復(fù)

使用道具 舉報(bào)

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

Keil環(huán)境下寫的8051,乘法加法位移都是通過加法實(shí)現(xiàn)的,并不是我們想象的"位移"
ADC中常用的ADC_RES*256+ADC_RESL
你用位移也是一樣的,都是通過加法實(shí)現(xiàn)的,并不會(huì)因?yàn)槟阌昧宋灰?效率就高了
不信你寫個(gè)代碼仿真看一下編譯后的匯編代碼就知道了
別的編程環(huán)境就不知道了
回復(fù)

使用道具 舉報(bào)

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

謹(jǐn)慎表示懷疑:
//定義一個(gè)結(jié)構(gòu)體,用于存放轉(zhuǎn)換字節(jié)
typedef struct {
  unsigned char reg_h;
  unsigned char reg_l;
}asc_code;
///////////////////////////////////////////////////////////
//把8位(1字節(jié))二進(jìn)制轉(zhuǎn)為ASCII碼以方便顯示
//byte  : 待轉(zhuǎn)換的16進(jìn)制變量
//返回值: 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) ;//模擬運(yùn)行到這里得出結(jié)果;


}


這兩種代碼中,各自編譯后的情況:
前兩行:
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 //少那么一點(diǎn)點(diǎn)。
"test" - 0 Error(s), 0 Warning(s).

運(yùn)行到結(jié)果:
前兩行花費(fèi)0.00024550 @24M;
后兩行花費(fèi)0.00024050 @24M;//快那么一點(diǎn)點(diǎn)。。


歡迎指點(diǎn)!

回復(fù)

使用道具 舉報(bào)

8#
ID:624769 發(fā)表于 2022-3-12 02:22 | 只看該作者
名字不是重點(diǎn) 發(fā)表于 2022-3-11 23:46
謹(jǐn)慎表示懷疑:
//定義一個(gè)結(jié)構(gòu)體,用于存放轉(zhuǎn)換字節(jié)
typedef struct {

還是那句話,結(jié)構(gòu)體是給有錢人玩的。

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).

運(yùn)行到結(jié)果:
花費(fèi)0.00020650 @24M;(啟動(dòng)后初始是:0.00019450, 即,實(shí)際耗時(shí)0.00001200)


回復(fù)

使用道具 舉報(bào)

9#
ID:824490 發(fā)表于 2022-3-12 09:34 | 只看該作者
188610329 發(fā)表于 2022-3-12 02:22
還是那句話,結(jié)構(gòu)體是給有錢人玩的。

typedef        unsigned char        u8;

學(xué)習(xí)了~~
回復(fù)

使用道具 舉報(bào)

10#
ID:731155 發(fā)表于 2022-3-12 10:59 | 只看該作者
188610329 發(fā)表于 2022-3-12 02:22
還是那句話,結(jié)構(gòu)體是給有錢人玩的。

typedef        unsigned char        u8;

這代碼寫的水平高啊
回復(fù)

使用道具 舉報(bào)

11#
ID:401564 發(fā)表于 2022-3-12 13:22 | 只看該作者
名字不是重點(diǎn) 發(fā)表于 2022-3-11 23:46
謹(jǐn)慎表示懷疑:
//定義一個(gè)結(jié)構(gòu)體,用于存放轉(zhuǎn)換字節(jié)
typedef struct {

我只看過ADC的高低位結(jié)合的匯編代碼和32位和以下的乘法,位移的對比,匯編代碼中并沒有位移指令,全部都是通過加法實(shí)現(xiàn),代碼都是一樣
至于結(jié)構(gòu)體的運(yùn)算,沒用過,不發(fā)表意見
回復(fù)

使用道具 舉報(bào)

12#
ID:401564 發(fā)表于 2022-3-12 13:36 | 只看該作者
188610329 發(fā)表于 2022-3-12 02:22
還是那句話,結(jié)構(gòu)體是給有錢人玩的。

typedef        unsigned char        u8;

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

使用道具 舉報(bào)

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

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

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

聊到這里,我順便請教一個(gè)問題,在C語言里面, 我們?nèi)绻x一個(gè)數(shù)組:  u16  Buf[32];   用來存放16位的數(shù)據(jù), 但是,定時(shí)的需要把數(shù)據(jù) 存入Eeprom, 那么就需要分別操作 高,低 8位, 比較麻煩,我現(xiàn)在的做法是:
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];


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

使用道具 舉報(bào)

14#
ID:47286 發(fā)表于 2022-3-12 19:35 | 只看該作者
188610329 發(fā)表于 2022-3-12 02:22
還是那句話,結(jié)構(gòu)體是給有錢人玩的。

typedef        unsigned char        u8;

程序?qū)懙恼嫫?佩服

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

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

使用道具 舉報(bào)

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

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

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

使用道具 舉報(bào)

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

但窮人不這么想 通常窮人希望51也能當(dāng) ...

行吧,就這樣吧
回復(fù)

使用道具 舉報(bào)

17#
ID:168971 發(fā)表于 2023-11-1 18:09 | 只看該作者
188610329 發(fā)表于 2022-3-12 02:22
還是那句話,結(jié)構(gòu)體是給有錢人玩的。

typedef        unsigned char        u8;

說的沒錯(cuò),厲害厲害
回復(fù)

使用道具 舉報(bào)

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

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

使用道具 舉報(bào)

19#
ID:939553 發(fā)表于 2023-11-1 21:08 | 只看該作者
和上面大佬的思路差不多,我個(gè)人常用的,僅參考
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);
        }
       
        //最后一個(gè)字節(jié)
        printf("%c",ASCLIB[*in_buff >> 4]);
        printf("%c",ASCLIB[*in_buff & 0x0f]);
}
回復(fù)

使用道具 舉報(bào)

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

高手間切磋,謙虛豁達(dá),小小白們非常受益。
謝謝各位賜教。
關(guān)注了!
回復(fù)

使用道具 舉報(bào)

21#
ID:1097337 發(fā)表于 2023-11-2 11:17 | 只看該作者

果然簡單又易懂。收藏了。
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表