论坛元老
 
- 积分
- 3571
- 金钱
- 3571
- 注册时间
- 2014-12-2
- 在线时间
- 365 小时
|
发表于 2016-5-6 15:29:27
|
显示全部楼层
只是两个数加减乘除,应该不太难。。
刚写了一个,支持:加、减、乘、除、模、与、或、异或、左移、右移等运算
第一步,串口数据处理:
主要将数据一个一个地接收到缓冲区中,直到遇上换行,然后交给USART2_GetPacket函数处理。
[mw_shl_code=c,true]
static char buf[80];
static uint32_t buf_i = 0;
extern void USART2_GetPacket(char *);
void USART2_IRQHandler(void)
{
char ch = USART2->DR;
if (ch=='\r'||ch=='\n')
{
buf[buf_i] = '\0';
if (buf_i) USART2_GetPacket(buf);
buf_i = 0;
}
else buf[buf_i++] = ch;
}[/mw_shl_code]
第二步,处理运算表达式:
这里用了一个结构体,
一个成员是表达式匹配字符串,用于给sscanf作操作数的提取,
另一个成员是该表达式对应的处理函数,先匹配到正确的操作数,然后调用该操作数的处理函数。
[mw_shl_code=c,true]
typedef struct
{
char *s;
uint32_t (*p)(uint32_t,uint32_t);
} calc_t;
uint32_t my_add(uint32_t a, uint32_t b) {return a+b;}
uint32_t my_sub(uint32_t a, uint32_t b) {return a-b;}
uint32_t my_mul(uint32_t a, uint32_t b) {return a*b;}
uint32_t my_div(uint32_t a, uint32_t b) {return a/b;}
uint32_t my_mod(uint32_t a, uint32_t b) {return a%b;}
uint32_t my_and(uint32_t a, uint32_t b) {return a&b;}
uint32_t my_or (uint32_t a, uint32_t b) {return a|b;}
uint32_t my_xor(uint32_t a, uint32_t b) {return a^b;}
uint32_t my_lsh(uint32_t a, uint32_t b) {return a<<b;}
uint32_t my_rsh(uint32_t a, uint32_t b) {return a>>b;}
void USART2_GetPacket(char *s)
{
const calc_t CALC_EXP[] = {{"%d+%d",my_add},
{"%d-%d",my_sub},
{"%d*%d",my_mul},
{"%d/%d",my_div},
{"%d%%d",my_mod},
{"%d&%d",my_and},
{"%d|%d",my_or },
{"%d^%d",my_xor},
{"%d<<%d",my_lsh},
{"%d>>%d",my_rsh}};
uint32_t i;
uint32_t a, b;
uint32_t err = 1;
for (i = 0; i < sizeof(CALC_EXP)/sizeof(CALC_EXP[0]); i++)
{
if (2 == sscanf(s, CALC_EXP.s, &a, &b))
{
printf(CALC_EXP.s, a, b);
printf("=%d\r\n", CALC_EXP.p(a,b));
err = 0;
break;
}
}
if (err)
{
printf("error command!\r\n");
printf("command example:\r\n");
for (i = 0; i < sizeof(CALC_EXP)/sizeof(CALC_EXP[0]); i++)
{
printf(CALC_EXP.s, 3, 5);
printf("\r\n");
}
}
}[/mw_shl_code]
整个逻辑看起来是比较简单的,但效率就不好说了,
我的串口在PA2和PA3,芯片型号是STM32F103RB,
12-calc.zip
(78.32 KB, 下载次数: 860)
|
|