标签: micropython

python - 如何实现一个C函数作为等待(协同程序)

环境:C和micropython虚拟机中的协作RTOS是其中的任务之一.

为了使虚拟机不会阻止其它RTOS的任务,我插入RTOS_sleep()vm.c:DISPATCH(),这样,每次执行字节码后,虚拟机放弃控制到下一个RTOS任务.

我创建了一个uPy接口,使用生产者 - 消费者设计模式从物理数据总线异步获取数据 - 可以是CAN,SPI,以太网.

在uPy中的用法:

can_q = CANbus.queue()
message = can_q.get()
Run Code Online (Sandbox Code Playgroud)

C中的实现can_q.get()不会阻止RTOS:它轮询C队列,如果没有收到消息,它会调用RTOS_sleep()给另一个任务填充队列的机会.事物是同步的,因为C队列仅由另一个RTOS任务更新,而RTOS任务仅在RTOS_sleep()被调用时切换,即协作

C实现基本上是:

// gives chance for c-queue to be filled by other RTOS task
while(c_queue_empty() == true) RTOS_sleep(); 
return c_queue_get_message();
Run Code Online (Sandbox Code Playgroud)

尽管Python语句can_q.get()不会阻止RTOS,但它会阻止uPy脚本.我想重写它,所以我可以使用async defie coroutine并让它不阻止uPy脚本.

不确定语法,但这样的事情:

can_q = CANbus.queue()
message = await can_q.get()
Run Code Online (Sandbox Code Playgroud)

如何编写C函数以便我可以await使用它?

我更喜欢CPython和micropython的答案,但我会接受仅限CPython的答案.

c python coroutine async-await micropython

14
推荐指数
1
解决办法
1450
查看次数

不使用库而在Python中进行CRC32计算

我一直在尝试绕过CRC32计算而没有太大的成功,我似乎得到的值与我应该得到的值不匹配.

我知道Python有能够生成这些校验和的库(即zlib和binascii)但我没有能够使用它们的奢侈,因为在micropython上不存在CRC功能.

到目前为止,我有以下代码:

import binascii
import zlib
from array import array

poly = 0xEDB88320

table = array('L')
for byte in range(256):
    crc = 0
    for bit in range(8):
        if (byte ^ crc) & 1:
            crc = (crc >> 1) ^ poly
        else:
            crc >>= 1
        byte >>= 1
    table.append(crc)

def crc32(string):
    value = 0xffffffffL

    for ch in string:
        value = table[(ord(ch) ^ value) & 0x000000ffL] ^ (value >> 8)

    return value

teststring = "test"

print "binascii calc:  0x%08x" % (binascii.crc32(teststring) …
Run Code Online (Sandbox Code Playgroud)

python crc32 checksum micropython

10
推荐指数
1
解决办法
6810
查看次数

Micropython 获取正确的当前时间

因为 micropython 不导入日期时间。

我想使用 time 或 utime 模块来获取当前时间。

但 time.localtime() 结果就像(2000, 1, 1, 0, 12, 35, 5, 1)

我猜时间是从 开始的2000/1/1

如何设置开始时间?

或者其他推荐的方法可以得到正确的结果?

谢谢!

python micropython

8
推荐指数
2
解决办法
2万
查看次数

ESP8266 + Micropython:为什么我会定期用i2c读取来获得相同的值?

我写使用一些简单的代码MicroPython上Digistump橡树,这基本上是一个ESP8266接口板运行.我试图了解通过i2c定期读取传感器时看到的行为.

下面的代码(读取ACCEL_XOUT_HACCEL_XOUT_L寄存器的值)工作得很好:

>>> from machine import Pin, I2C
>>> bus = I2C(scl=Pin(2), sda=Pin(0))
>>> while True: 
...     h, l = bus.readfrom_mem(0x68, 0x3b, 2)
...     print (-((((h<<8)+l)^0xFFFF) + 1) if (h & (1<<7)) else (h<<8)+l)
Run Code Online (Sandbox Code Playgroud)

(该print语句只是从两个补码执行转换.)

正如预期的那样,当我移动imu时,打印出的加速度计值大致实时变化.

但如果我在循环中引入延迟,例如...

>>> import time
>>> from machine import Pin, I2C
>>> bus = I2C(scl=Pin(2), sda=Pin(0))
>>> while True: 
...     h, l = bus.readfrom_mem(0x68, 0x3b, 2)
...     print (-((((h<<8)+l)^0xFFFF) + 1) if (h & (1<<7)) else (h<<8)+l)
...     time.sleep(1) …
Run Code Online (Sandbox Code Playgroud)

accelerometer esp8266 micropython mpu6050

7
推荐指数
0
解决办法
557
查看次数

如何配置 pylint / python 来检查 MicroPython 语法?

我正在使用 VScode 编写 MicroPython 代码。linting 和代码完成相当不错,但由于 CPython 和 MicroPython 之间存在相当多的差异,我认为它还可以更好。

pylint 有没有办法:

换句话说,我想防止出现如下错误和警告:

警告

我研究了 Thonny 提出的一种很有前景的方法,用于提取模块信息并将其保存在module/APIstubs中,并将其扩展到更完整的原型。然而,这仍然需要 pylint 包含这些内容并将其优先于 CPython。

这是可以在 pylint 和/或 Python 中配置的东西吗?如果可以,我将如何处理?

更新:我在https://github.com/Josverl/micropython-stubber 上有一个不错的部分解决方案,并且也可能有兴趣在 vscode 中更普遍地解决这个问题

python pylint visual-studio-code micropython

6
推荐指数
1
解决办法
3442
查看次数

esptool.py 不被识别为内部或外部命令、可运行程序或批处理文件

我最近尝试在ESP8266板上加载 MicroPython,但失败了。为此,我必须安装 esptool。我成功安装了它,但是当我想使用它时,它不起作用。

例如,

esptool.py --help
'not recognized as internal or external command, operable program or batch file'
Run Code Online (Sandbox Code Playgroud)

我发现了很多关于这个主题的问题,但没有一个答案对我有帮助。我尝试将所有内容添加到 Windows 路径,但仍然不起作用。

micropython esptool

6
推荐指数
2
解决办法
2万
查看次数

为什么 Micropython 'const' 不接受浮点值?

大多数 Micropython 端口都包含一个“ micropython”模块,该模块具有名为“ ”的特定函数const()。我相信它的行为很像#defineC 中的“”,但是,它只接受整数。有人知道为什么吗?你可以在 C 中声明浮点常量,那么为什么在 micropython 中不可用呢?

我想有效地存储用于在单位之间转换的值,但其中许多是浮点值...(我考虑将它们乘以 10^x,然后在运行时除以该值,但这可能需要像只要将浮点数存储在变量中并让代码使用查找表即可)。

为什么我们只能用 声明整数micropython.const()

干杯:)

python constants micropython

6
推荐指数
1
解决办法
697
查看次数

从 micropy 运行 urequests.get 时出现 OSError -202

你好,我的代码有错误,但它在 python shell 中运行,任何人都可以帮助我吗

from machine import Pin
import time
import network
import urequests
p0 = Pin(0,Pin.OUT)
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('ssid', 'pass')
response = urequests.get('http://jsonplaceholder.typicode.com/albums/1')
while True:
    ans = response.json()['userId']
    p0.value(1)
    time.sleep(1)
    p0.off()
    time.sleep(1)
    print('ok')
Run Code Online (Sandbox Code Playgroud)

这是错误:

Traceback (most recent call last):
  File "<stdin>", line 9, in <module>
  File "urequests.py", line 108, in get
  File "urequests.py", line 53, in request
OSError: -202
Run Code Online (Sandbox Code Playgroud)

python micropython esp32

6
推荐指数
1
解决办法
3574
查看次数

如何在树莓派 pico 自动运行上编写 micropython 程序?

我使用Thonny软件将程序发送到我的树莓派pico。我正在尝试在插入 pico 时自动运行特定程序。目前 pico 上的另一个程序会自动运行,但我希望运行另一个程序。

micropython thonny raspberry-pi-pico

6
推荐指数
1
解决办法
4453
查看次数

操作系统错误:[Errno 12] ENOMEM

我使用这里的代码。从 Thonny 运行多次后没有出现问题,我得到:

操作系统错误:[Errno 12] ENOMEM

我使用 nuke.uf2 清除 Raspberry Pi Pico W 上的存储。运行该文件太多次后,错误再次出现。nuke.uf2 是一个临时修复。

###############################################################
# WS2812 RGB LED Ring Light Breathing
# with the Raspberry Pi Pico Microcontroller
#
# by Joshua Hrisko, Maker Portal LLC (c) 2021
#
# Based on the Example neopixel_ring at:
# https://github.com/raspberrypi/pico-micropython-examples
###############################################################
#
import array, time
from machine import Pin
import rp2

#
############################################
# RP2040 PIO and Pin Configurations
############################################
#
# WS2812 LED Ring Configuration
led_count = …
Run Code Online (Sandbox Code Playgroud)

led micropython raspberry-pi-pico

6
推荐指数
1
解决办法
4632
查看次数