如何解决python和Micropython之间存在差异的Uart问题
我有一个风速表,每秒发送一次数据。我使用的是while循环,循环1秒钟,读取uart端口并获取数据。在Windows和raspberyPi上的Python中,它都能完美运行。我试图在运行micropython的Pyboard上运行相同的代码。 在python中,而在循环乳清中,uart上没有数据时,它将返回一个空字节- b'',直到接收到数据为止。在MicroPython中,在循环中而不是空字节时,它返回 None ,这是发生错误消息时的情况。 TypeError:“ NoneType”类型的对象没有len() 查看下面的python和MicroPython代码
Python代码完美运行:
import serial
from statistics import mean
import time
#import utime
ser_gauge = serial.Serial('COM6',timeout=0.1)
ser_gauge.baudrate = 9600 # set Baud rate
ser_gauge.bytesize = 8 # Number of data bits = 8
ser_gauge.parity = 'E' # No parity
ser_gauge.stopbits = 1 # Number of Stop bits = 1
start_reading = True
if start_reading:
t0 = time.time()
while time.time() - t0 <1:
print(t0)
print(time.time() - t0)
data = ser_gauge.readline()
print(data)
if len(data) > 0:
command = data
print(command)
在没有数据的情况下,在1秒循环通知空字节后返回。 1597162713.5983248 0.0 b'' 1597162713.5983248 0.10153698921203613 b'' 1597162713.5983248 0.20209956169128418 b'' 1597162713.5983248 0.30266332626342773 b'' 1597162713.5983248 0.4032254219055176 b'' 1597162713.5983248 0.503786563873291 b'' 1597162713.5983248 0.6043491363525391 b'' 1597162713.5983248 0.7049119472503662 b'$ WIMWV,82,R,3.1,M,A 06 \ r \ n' b'$ WIMWV,82,R,3.1,M,A 06 \ r \ n' 1597162713.5983248 0.7820417881011963 b'' 1597162713.5983248 0.8826048374176025 b'' 1597162713.5983248 0.9831666946411133 b''
MicroPython代码:
from statistics import mean
import time
import utime
from pyb import UART
ser_gauge = UART(4,9600)
ser_gauge.init(9600,bits=7,parity=None,stop=1,timeout=100)
start_reading = True
if start_reading:
t0 = time.ticks_ms()
while time.ticks_ms()/1000 - t0 <1:
print(t0)
print(time.ticks_ms() - t0)
data = ser_gauge.readline()
print(data)
if len(data) > 0:
#TypeError: object of type 'NoneType' has no len()
command = data
print(command)
如果我继续循环,数据将如下所示: 113412 2078年 b'$ WIMWV,82,R,3.2,M,A 05 \ r \ n' b'$ WIMWV,82,R,3.2,M,A 05 \ r \ n' 113412 2178 没有 没有 113412 2278 没有 没有 113412 2378 没有 没有 113412 2478 没有 没有 113412 2578 没有 没有 113412 2678 没有 没有 113412 2778 没有 没有 我在编程方面非常环保,将不胜感激。我尝试了多种不同的if语句来绕过无而没有成功。
解决方法
我找到了上面无问题的答案。没有一个像null,因此它不会响应==这样的普通操作数,因此必须使用单词is。如果数据为空:则使用pass语句。然后脚本将继续。
t0 = time.ticks_ms()
while time.ticks_ms()/1000 - t0 <1:
print(t0)
print(time.ticks_ms() - t0)
data = ser_gauge.readline()
if data is None:
Pass
print(data)
elif len(data) > 0:
command = data
print(command)
,
您的Python代码将串行端口设置为9600、8,E,1
但是uPy代码使用9600、7,无,1
这是端口参数的故意更改吗?外部设备端口设置是否也已更改?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。