[問題] UART收到的字元(ASCII)如何轉為Bin或Hex?

看板ASM (組合語言)作者 (800IM)時間12年前 (2012/07/25 09:16), 編輯推噓6(607)
留言13則, 7人參與, 最新討論串1/2 (看更多)
目前用PC -> rs232 -> 8051 控制兩顆直流馬達的運動平台 每顆馬達 正 逆 停 煞 四個狀態 2bit,兩顆就有4bit,接在 P2^0,P2^1 和 P2^2,P2^3 也就是這個運動平台共有 16 種狀態, 在VS2010中編碼成 "0"~"F"傳送給8051 (因為我只會一次傳一個字元) 因為我不會直接把字元轉成對應的Bin或Hex,所以解碼的相當沒效率 (聽說分支指令在單晶片中,比PC要來得沒效率很多,真的嗎?) 8051端: if(RI) { RI=0; if(SBUF==0x30) //0,1111純停止 P2=0x00; else if(SBUF==0x31) //1 P2=0x01; else if(SBUF==0x32) //2 P2=0x02; : : else if(SBUF==0x46) //F,1111 煞車 P2=0x0F; } 請問ASCII可以直接解碼嗎? 或者其他更有效率的寫法? 目前速度還不錯,但是還有其他功能想加入,而且是real time,怕這裡中斷太久 PC大約每 30ms 會中斷一次8051 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.25.108 ※ 編輯: deo2000 來自: 140.112.25.108 (07/25 09:21)

07/25 10:32, , 1F
1改通訊協定2用查表法
07/25 10:32, 1F

07/25 11:50, , 2F
把長串if-else if改成switch-case會讓效能變好
07/25 11:50, 2F

07/25 11:50, , 3F
compiler會把switch-case翻譯成table access
07/25 11:50, 3F

07/25 11:50, , 4F
virtually 就是一樓說的查表法
07/25 11:50, 4F

07/25 11:51, , 5F
'0' - 'F' 轉二進位很簡單, P2 = SBUF-'0';
07/25 11:51, 5F

07/25 11:58, , 6F
1)'0'~'F'==>0x00~0x0F存入n, 2)P2=set[n];
07/25 11:58, 6F

07/25 12:03, , 7F
上面寫錯: P2=SBUF<'A'?(SBUF-'0'):(SBUF-'A'+10);
07/25 12:03, 7F

07/25 19:01, , 8F
把16個狀態編成'A'到'P', 51就 P2=SBUF-'A';
07/25 19:01, 8F
謝謝,真是個好方法,但是我認為會降低程式可讀性, 我怕三個月之後自己會看不懂 ※ 編輯: deo2000 來自: 118.168.14.52 (07/25 19:38)

07/25 19:43, , 9F
我有個疑問 何不直接傳數字 而要編碼成字元?
07/25 19:43, 9F

07/25 19:44, , 10F
一個 unsigned char 就可以放 0-255 的 8-bit 數字了
07/25 19:44, 10F

07/25 19:50, , 11F
我猜是Windows端使用的comport元件問題吧?(stream queue)
07/25 19:50, 11F
因為我不知道怎麼讓SBUF收一串字 Orz... ※ 編輯: deo2000 來自: 118.168.14.52 (07/25 19:55)

07/25 22:45, , 12F
queue
07/25 22:45, 12F

07/25 23:11, , 13F
我也覺得在ISR應該先往queue塞,回到main後再讀出來處理
07/25 23:11, 13F
文章代碼(AID): #1G3qZIOy (ASM)
文章代碼(AID): #1G3qZIOy (ASM)