作者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