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

这是端口参数的故意更改吗?外部设备端口设置是否也已更改?