作者deo2000 (800IM)
看板ASM
標題[問題] UART收到的字元(ASCII)如何轉為Bin或Hex?
時間Wed Jul 25 09:15:59 2012
目前用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)
1F:推 lion21:1改通訊協定2用查表法 07/25 10:32
2F:推 cortex1234:把長串if-else if改成switch-case會讓效能變好 07/25 11:50
3F:→ cortex1234:compiler會把switch-case翻譯成table access 07/25 11:50
4F:→ cortex1234:virtually 就是一樓說的查表法 07/25 11:50
5F:→ cortex1234:'0' - 'F' 轉二進位很簡單, P2 = SBUF-'0'; 07/25 11:51
6F:推 MaxHaru:1)'0'~'F'==>0x00~0x0F存入n, 2)P2=set[n]; 07/25 11:58
7F:→ cortex1234:上面寫錯: P2=SBUF<'A'?(SBUF-'0'):(SBUF-'A'+10); 07/25 12:03
8F:→ ksmrt0123:把16個狀態編成'A'到'P', 51就 P2=SBUF-'A'; 07/25 19:01
謝謝,真是個好方法,但是我認為會降低程式可讀性,
我怕三個月之後自己會看不懂
※ 編輯: deo2000 來自: 118.168.14.52 (07/25 19:38)
9F:推 cortex1234:我有個疑問 何不直接傳數字 而要編碼成字元? 07/25 19:43
10F:→ cortex1234:一個 unsigned char 就可以放 0-255 的 8-bit 數字了 07/25 19:44
11F:推 WolfLord:我猜是Windows端使用的comport元件問題吧?(stream queue) 07/25 19:50
因為我不知道怎麼讓SBUF收一串字 Orz...
※ 編輯: deo2000 來自: 118.168.14.52 (07/25 19:55)
12F:→ MasterChang:queue 07/25 22:45
13F:推 jheli:我也覺得在ISR應該先往queue塞,回到main後再讀出來處理 07/25 23:11