您尚未登录。

楼主 # 2023-10-11 13:56:19

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,226
积分: 1162.5

单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现?

单片机板有8个输入信号以及若干个输出信号。客户提出要求,希望能通过上位机来配置这8个信号的逻辑关系实现与或操作。头大,不知道该怎么实现。想过如下办法:
1,上位机传递输入信号的序号,然后将所有逻辑关系按序号排出来,将逻辑关系序号也发给单片机,单片机按需要去反推逻辑关系。但是可能的逻辑关系也太多了...
因为只有与和或两种逻辑关系,有群友指出有2^8种排列。
2,上位机发送输入信号的序号,然后再发送几组数据,每组数据包含两个参与操作的信号打序号,再包含一个逻辑关系。这样的话,需要上位机先推算出运算打先后顺序。上位机这里有点麻烦。
3,上位机直接将逻辑运算发送给单片机,包括括号以及运算符,这样上位机就简单了,但是单片机这里就很难了。
如果单片机收到的是类似“x1 && (x2 || x3)"这样的字符串,能否直接转化为可执行语句来执行?

请大家给个思路。

最近编辑记录 Gentlepig (2023-10-11 14:49:11)

离线

楼主 #2 2023-10-11 15:12:58

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,226
积分: 1162.5

Re: 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现?

4610 说:

传真值表呗,
8in 8out 也就256字节

输入是8个,输出不确定,可能更多。

离线

楼主 #9 2023-10-12 14:07:08

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,226
积分: 1162.5

Re: 单片机有8个信号输入,想通过上位机配置这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)

离线

楼主 #10 2023-10-12 14:35:44

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,226
积分: 1162.5

Re: 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现?

4610 说:
Gentlepig 说:
4610 说:

传真值表呗,
8in 8out 也就256字节

输入是8个,输出不确定,可能更多。

线性的,不是指数关系
32个输出  表1kb

没明白这里为啥是1kb?
输入的每种逻辑关系,只对应一种输出形式。所以表应该还是按输入的数量8来决定大小吧?输出只是一个4字节变量来控制32个输出,这样?

离线

楼主 #11 2023-10-12 14:48:25

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,226
积分: 1162.5

Re: 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现?

对于方法3,别墅业主群里很多群友推荐了。其中有朋友推荐了c4.c,我看到简介里写的c in four function。我以为是四则运算呢?结果晚上刷知乎搜c4.c才知道是实现了编译器...虽然里边也有四则运算符,也有与或逻辑运算符,但是我觉得对于我来说内容有深度了...
搜  使用栈完成算术表达式  搜到这么一篇文章,觉得不多:
https://www.cnblogs.com/inghzhang/p/3901334.html
还没仔细看。

最近编辑记录 Gentlepig (2023-10-12 16:25:47)

离线

楼主 #12 2023-10-12 17:29:26

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,226
积分: 1162.5

Re: 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现?

@Gentlepig

才发现gpt给的真值表不对...
(x1|x2)&(x3|x4),就是1和2中有一个输入有效,且3和4中有一个输入有效,则满足条件。
结果发现2、3、4行,x1和x2都是零的情况下,out为1了...

离线

楼主 #14 2023-10-12 19:14:17

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,226
积分: 1162.5

Re: 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现?

@4610
可是,单片机c语言没有map这种数据结构啊...

另外的问题就是,上位机如何根据输入逻辑关系,计算出真值表来...

-------------------------------------

好像有一点明白了,这是上位机计算真值表的方式,上位机枚举出256种组合,然后代入到表达式里看结果。

最近编辑记录 Gentlepig (2023-10-13 09:02:40)

离线

楼主 #17 2023-10-13 12:11:41

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,226
积分: 1162.5

Re: 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现?

小智 说:

可以通过多维数字实现,定义一个多维数组uint32 map[2][2][2][2][2][2][2][2];上位机生成遍历数值,不就行了,8路输入,依次填入下标,输出值完成,最多是1K的真值表,搞定

看不懂这个map[2][2][2][2][2][2][2][2],每一个[2]对应一个输入的0和1两种状态吗?

依次填入下标,这句话也没看明白。是将遍历输入值,代入逻辑表达式吗?

离线

楼主 #19 2023-10-13 15:10:55

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,226
积分: 1162.5

Re: 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现?

4610 说:

@Gentlepig
不需要map,普通的线性表,数组表示
3in:map[8]
8in:map[256]

明白了,感谢。

@skrlaoshiren @小智
感谢。

最近编辑记录 Gentlepig (2023-10-13 15:11:22)

离线

楼主 #20 2023-10-14 14:59:41

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,226
积分: 1162.5

Re: 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现?

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)

离线

楼主 #22 2023-10-16 09:17:01

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,226
积分: 1162.5

Re: 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现?

@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)

离线

楼主 #25 2023-10-17 09:23:13

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,226
积分: 1162.5

Re: 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现?

@kin 感谢,讲得很详细了,使我进一步加深了对栈和后缀表达式的理解。

最近编辑记录 Gentlepig (2023-10-17 09:23:35)

离线

楼主 #28 2023-10-21 08:41:32

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,226
积分: 1162.5

Re: 单片机有8个信号输入,想通过上位机配置这8个信号与、或操作,该如何实现?

@xiaohui

感谢。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn