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