OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16356|回复: 8

STM32制作一个基于串口通信的计算器

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-5-6
在线时间
1 小时
发表于 2016-5-6 15:29:26 | 显示全部楼层 |阅读模式
1金钱
是这样的,我想用STM32mini板子制作一个基于串口通信的简单四则整数运算的计算器,连括号都不用
比如,通过XCOM串口通信助手发送

12+12

那么板子计算以后返回一个24
现在思路是一位一位读取输入的数字,转化为int型,然后计算。
计算完后把答案再转回字符串发送回去。
程序就是根据原子哥的串口通信实验来更改吧,毕竟初学。

现在的问题是我改怎么判断数字和加减乘除符号呢?
还有就是int转字符串这些,似乎itoa atoin不能用,那么有什么快捷的转换办法吗,我现在用ASCII来计算转,效率特别低。
如果之前有程序例子的话,希望大家能给个链接参考参考。谢谢

最佳答案

查看完整内容[请看2#楼]

只是两个数加减乘除,应该不太难。。 刚写了一个,支持:加、减、乘、除、模、与、或、异或、左移、右移等运算 第一步,串口数据处理: 主要将数据一个一个地接收到缓冲区中,直到遇上换行,然后交给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; ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-5-6 15:29:27 | 显示全部楼层
只是两个数加减乘除,应该不太难。。
刚写了一个,支持:加、减、乘、除、模、与、或、异或、左移、右移等运算

c.png

第一步,串口数据处理:
主要将数据一个一个地接收到缓冲区中,直到遇上换行,然后交给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, 下载次数: 856)
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-5-7 22:22:42 | 显示全部楼层
xkwy 发表于 2016-5-6 15:29
只是两个数加减乘除,应该不太难。。
刚写了一个,支持:加、减、乘、除、模、与、或、异或、左移、右移等 ...

屌炸天
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-5-8 09:53:41 | 显示全部楼层

原子哥谬赞
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2016-5-6
在线时间
1 小时
 楼主| 发表于 2016-5-12 19:38:35 | 显示全部楼层
xkwy 发表于 2016-5-6 15:29
只是两个数加减乘除,应该不太难。。
刚写了一个,支持:加、减、乘、除、模、与、或、异或、左移、右移等 ...

厉害!!!
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
25
金钱
25
注册时间
2019-4-21
在线时间
9 小时
发表于 2019-4-23 20:55:41 | 显示全部楼层
xkwy 发表于 2016-5-6 15:29
只是两个数加减乘除,应该不太难。。
刚写了一个,支持:加、减、乘、除、模、与、或、异或、左移、右移等 ...

我学的库函数,就是我想跟他一样,然后进行Y=X2+2X+1的运算,请问有解决方法吗,刚开始学
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2019-8-9
在线时间
5 小时
发表于 2019-8-21 14:41:14 | 显示全部楼层
本帖最后由 鬼彻懒人 于 2019-8-21 14:43 编辑

新手上路看都看不懂
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
21
金钱
21
注册时间
2019-8-9
在线时间
5 小时
发表于 2019-8-21 14:45:00 | 显示全部楼层
zhaimin 发表于 2019-4-23 20:55
我学的库函数,就是我想跟他一样,然后进行Y=X2+2X+1的运算,请问有解决方法吗,刚开始学

你最后计算器的程序,写出来没,新手上路,哈哈哈哈,写出来了能不能发我一份
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
2
金钱
2
注册时间
2021-7-9
在线时间
0 小时
发表于 2021-7-9 09:29:05 | 显示全部楼层
xkwy 发表于 2016-5-6 15:29
只是两个数加减乘除,应该不太难。。
刚写了一个,支持:加、减、乘、除、模、与、或、异或、左移、右移等 ...

太棒了吧哥哥,正好需要,感谢大佬
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 09:20

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表