V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  mylovesaber  ›  全部回复第 12 页 / 共 12 页
回复总数  224
1 ... 3  4  5  6  7  8  9  10  11  12  
文档中有个 window.timeout(delay)函数,能以非阻塞方式轮询

import time
import curses

screen = curses.initscr()
curses.noecho()
screen.timeout(0) # 设置 screen 为非阻塞读取(无延迟模式)

while True:
char = screen.getch() # 在无延迟模式下,getch 会立即返回不管有没有输入
if char == -1: # 如果没有输入,getch 会返回 -1
print("没有输入")
else:
print("输入了 {} ({})".format(chr(char), char))
time.sleep(0.2) # sleep 避免轮询过快


我滴妈,我的问题终于解决了
网上其他所谓键盘遥控自动避障小车项目好像都没有用到这个函数所以都不完整
此贴终结
@no1xsyzy @wangkai0351
![避障逻辑图]( https://s1.ax1x.com/2020/04/22/JYEuKU.png)
我重读了 curses 的文档,是我疏忽了 getch()函数的特性,
即: `char = screen.getch()` 这行代码功能是等待读取键值

进入这行代码的执行的时候,读取到按键之前一定会出现整个程序的暂停,所以出现一旦我取消注释,一楼程序就进入等待按键的阶段,后面的红外测距判断就不会被执行的情况,但现在发现问题需要解决的逻辑我好像没想出来。。

再说明白点就是这两行代码是先后绑定在一起的,避障生效只能是在运行这两行代码之前,但避障使用的这个红外一直在读取到信息,也就是不停读取非 0 即 1,直接进行 if-else 进行判断的话,一旦小车动起来第一时间树莓派没有读取到 0 的值时就进入了等待输入 ok 键的阶段导致这个避障功能不生效,所以我第一反应是使用一个循环,但后面怎么改善我蒙逼了:
```python
char = screen.getch()
print("这段话绝对不会被打印在屏幕上")
if char == 10:
print("读取到 ok 键被按下这段话就会被输出到屏幕上")
```
请教下二位有没有什么可能的思路来解决呢?
@wangkai0351 谢谢,其实键值不是问题,都是测试能用的,而且这个 curses 库识别键值如果是英文字母直接就是它本身,根本不用考虑,只是这个在子循环加上读取键值就红外失效,不加上按键失效就有点尴尬。。。
问题来源于子循环里面 screen = curses.initscr()和 char = screen.getch(),在同样“小车前进时没有障碍物”的条件下出现:
1. 这俩行注释了,小车在按下 ok 键无反映,只能等快撞上由红外强行停止
2. 这俩行不注释,小车可以通过 ok 键停止,但红外防撞功能失效

另外发现这个 getch()好像会累计你的按键,比如我使用问题 1,我按上,ok,下键,没反映,但靠近红外模块后小车立马停车后紧接着后退

不知道我这逻辑写法哪里出错了,各位前辈如果能看懂的话可否介绍下经验呢?感谢!
1 ... 3  4  5  6  7  8  9  10  11  12  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3590 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 10ms · UTC 04:33 · PVG 12:33 · LAX 20:33 · JFK 23:33
Developed with CodeLauncher
♥ Do have faith in what you're doing.