单片机板有8个输入信号以及若干个输出信号。客户提出要求,希望能通过上位机来配置这8个信号的逻辑关系实现与或操作。头大,不知道该怎么实现。想过如下办法:
1,上位机传递输入信号的序号,然后将所有逻辑关系按序号排出来,将逻辑关系序号也发给单片机,单片机按需要去反推逻辑关系。但是可能的逻辑关系也太多了...
因为只有与和或两种逻辑关系,有群友指出有2^8种排列。
2,上位机发送输入信号的序号,然后再发送几组数据,每组数据包含两个参与操作的信号打序号,再包含一个逻辑关系。这样的话,需要上位机先推算出运算打先后顺序。上位机这里有点麻烦。
3,上位机直接将逻辑运算发送给单片机,包括括号以及运算符,这样上位机就简单了,但是单片机这里就很难了。
如果单片机收到的是类似“x1 && (x2 || x3)"这样的字符串,能否直接转化为可执行语句来执行?
请大家给个思路。
最近编辑记录 Gentlepig (2023-10-11 14:49:11)
离线
传真值表呗,
8in 8out 也就256字节
输入是8个,输出不确定,可能更多。
离线
感谢各位。
关于1里的真值表,我是没搞明白的,分别用1和0表示输入信号的有无,8个输入信号的话,组合就是2^8=256种。那么需要上位机算出这种比如(x1||x2)&&(x3||x4)这种情况下,对应的8个输入有那几种组合,如何输入满足的话,就控制输出。
问了gpt,列出来上式的真值表:
x1 | x2 | x3 | x4 | Output
---------------------------
0 | 0 | 0 | 0 | 0
0 | 0 | 0 | 1 | 1
0 | 0 | 1 | 0 | 1
0 | 0 | 1 | 1 | 1
0 | 1 | 0 | 0 | 0
0 | 1 | 0 | 1 | 1
0 | 1 | 1 | 0 | 1
0 | 1 | 1 | 1 | 1
1 | 0 | 0 | 0 | 0
1 | 0 | 0 | 1 | 1
1 | 0 | 1 | 0 | 1
1 | 0 | 1 | 1 | 1
1 | 1 | 0 | 0 | 1
1 | 1 | 0 | 1 | 1
1 | 1 | 1 | 0 | 1
1 | 1 | 1 | 1 | 1
可以看到output是1的就有13项,那么我需要判断输入信号是否是这13项里的其中一个,是的话,就满足。
这种方法的话,需要上位机计算出真值表里output为1的项目,把对应的输入状态,发给单片机吧?比如上式,就需要将
x1 | x2 | x3 | x4 | Output
---------------------------
0 | 0 | 0 | 1 | 1
0 | 0 | 1 | 0 | 1
0 | 0 | 1 | 1 | 1
0 | 1 | 0 | 1 | 1
0 | 1 | 1 | 0 | 1
0 | 1 | 1 | 1 | 1
1 | 0 | 0 | 1 | 1
1 | 0 | 1 | 0 | 1
1 | 0 | 1 | 1 | 1
1 | 1 | 0 | 0 | 1
1 | 1 | 0 | 1 | 1
1 | 1 | 1 | 0 | 1
1 | 1 | 1 | 1 | 1
这些发给单片机去进行判断吧?
这样倒是简单些,但是实际应该把8个输入都考虑进去,这样最后就是就是一种输出结果可能对应着非常多的输入情况,比如几十个。
又想了想,应该真值表里的256项都写入单片机。单片机里利用switch()判断输入是否在真值表里对应的output是否为1,为1的话,说明输入满足逻辑关系。
最近编辑记录 Gentlepig (2023-10-12 14:32:40)
离线
Gentlepig 说:4610 说:传真值表呗,
8in 8out 也就256字节输入是8个,输出不确定,可能更多。
线性的,不是指数关系
32个输出 表1kb
没明白这里为啥是1kb?
输入的每种逻辑关系,只对应一种输出形式。所以表应该还是按输入的数量8来决定大小吧?输出只是一个4字节变量来控制32个输出,这样?
离线
对于方法3,别墅业主群里很多群友推荐了。其中有朋友推荐了c4.c,我看到简介里写的c in four function。我以为是四则运算呢?结果晚上刷知乎搜c4.c才知道是实现了编译器...虽然里边也有四则运算符,也有与或逻辑运算符,但是我觉得对于我来说内容有深度了...
搜 使用栈完成算术表达式 搜到这么一篇文章,觉得不多:
https://www.cnblogs.com/inghzhang/p/3901334.html
还没仔细看。
最近编辑记录 Gentlepig (2023-10-12 16:25:47)
离线
@Gentlepig
才发现gpt给的真值表不对...
(x1|x2)&(x3|x4),就是1和2中有一个输入有效,且3和4中有一个输入有效,则满足条件。
结果发现2、3、4行,x1和x2都是零的情况下,out为1了...
离线
@4610
可是,单片机c语言没有map这种数据结构啊...
另外的问题就是,上位机如何根据输入逻辑关系,计算出真值表来...
-------------------------------------
好像有一点明白了,这是上位机计算真值表的方式,上位机枚举出256种组合,然后代入到表达式里看结果。
最近编辑记录 Gentlepig (2023-10-13 09:02:40)
离线
可以通过多维数字实现,定义一个多维数组uint32 map[2][2][2][2][2][2][2][2];上位机生成遍历数值,不就行了,8路输入,依次填入下标,输出值完成,最多是1K的真值表,搞定
看不懂这个map[2][2][2][2][2][2][2][2],每一个[2]对应一个输入的0和1两种状态吗?
依次填入下标,这句话也没看明白。是将遍历输入值,代入逻辑表达式吗?
离线
@Gentlepig
不需要map,普通的线性表,数组表示
3in:map[8]
8in:map[256]
明白了,感谢。
@skrlaoshiren @小智
感谢。
最近编辑记录 Gentlepig (2023-10-13 15:11:22)
离线
https://blog.csdn.net/crr411422/article/details/130306750
按这个文章里的代码抄了一遍,没用malloc申请栈空间,而是用了固定数组,把浮点数变量改成了uint8类型,在pc上gcc编译后,可以运行进行整数四则运算。
又将里边的“+-*/”改成了“&|”,可以进行逻辑运算。
$ ./test5
Enter an infix expression: 1&1
infix notation: 1&1
Postfix notation: 1 1 &
Result: 1
$ ./test5
Enter an infix expression: 1&(0|1)
infix notation: 1&(0|1)
Postfix notation: 1 0 1 | &
Result: 1
$ ./test5
Enter an infix expression: (1|1)&(0|1)
infix notation: (1|1)&(0|1)
Postfix notation: 1 1 | 0 1 | &
Result: 1
$ ./test5
Enter an infix expression: (0|1)&(1&0)
infix notation: (0|1)&(1&0)
Postfix notation: 0 1 | 1 0 & &
Result: 0
$ ./test5
Enter an infix expression: (0|1)&(1|0)
infix notation: (0|1)&(1|0)
Postfix notation: 0 1 | 1 0 | &
Result: 1
最近编辑记录 Gentlepig (2023-10-14 15:00:04)
离线
@kin
这是专门为了我的需求写了个程序?太感谢了。
-----------------------------------
因为没有注释,有不少地方没看明白,比如各函数的用途,rpnbuf[ ]数组的用途。
reverse_polish_nnotatio_append_char()这个函数,
如果给的是'(',则压入stk里;
如果是')',则从stk里取出数据放到rpnbuf里;
如果是'&'或者'|',如果栈里没数据,则入栈,如果有数据,取栈顶数据,如果是'(',则将符号入栈,否则,将栈顶字符串出栈,存到rpnbuf数组里,不知道这里为什么要存到rpnbuf里。
如果是字符1-8,则直接存到rpnbuf里。
感觉rpnbuf像是完成后缀表达式的存放位置,但不确定。
run_exp( )函数里也有不明白的地方:
while((chr = exp[0])){...}这里只是判断下表达式的第一个字符吗?(这个明白了,while循环里有exp+=2,这样就会遍历整个输入字符串了)
那么这个while循环里,就会把输入表达式里的‘0-9, & , | ( )'分别代入到reverse_polish_notatio_append_chr( )函数里去处理
根据我在上一段落分析,‘0-9’是存到rpnbuf数组里的,‘(xxxx)'括号里的内容,也会存到rpnbuf里。
我的理解是,rpnbuf数组存放的是后缀表达式,但没看明白什么时候把逻辑符号放进去的。而stk是中缀转后缀时存放临时数据的,比如有括号情况下,将左括号及数据先放到stk里,如果再遇到右括号,则将数据从stk里取出来放到rpnbuf数组里。
最近编辑记录 Gentlepig (2023-10-16 10:47:13)
离线
@kin 感谢,讲得很详细了,使我进一步加深了对栈和后缀表达式的理解。
最近编辑记录 Gentlepig (2023-10-17 09:23:35)
离线
@xiaohui
感谢。
离线