函数中定义的变量稍后在 Python 中变为未定义

问题描述 投票:0回答:1

只是一个关于小脚本的快速问题,该脚本由于某种原因无法正常工作

我运行了这个脚本:

import serial
import time
import turtle


def serialreading():
    
    serialPort = serial.Serial(
    port="COM5", baudrate=9600, bytesize=8, timeout=2, stopbits=serial.STOPBITS_ONE
    )
    # Read data out of the buffer until a carraige return / new line is found
    serialString = serialPort.readline()
    turtlenumber = serialString.decode("Ascii")

    # Print the contents of the serial data to ASCII
    try:
        print(turtlenumber)
    except:
        pass


def roomview():
    
    t = turtle.Turtle()
    t.speed(0) # 1:slowest, 3:slow, 5:normal, 10:fast, 0:fastest
    t.forward(turtlenumber)
    time.sleep(1)
    turtle.reset()
    

while 1 > 0:
    
    serialreading()
    roomview()

海龟的目标是简单地画一条线,只要进入串行通信的数字(其变量是turtlenumber)即可。对于这个例子,数字应该是 1192,但我从来没有看到它的实际情况,因为 shell 告诉我“NameError:名称'turtlenumber'未定义

请帮帮我

python serial-port pyserial
1个回答
0
投票

turtlenumber
serialreading()
范围内的局部变量,这意味着该变量不能被
serialreading()
之外的代码访问。一旦
serialreading()
完成,
turtlenumber
就会被摧毁。

要让

roomview()
访问这个值,我们可以在
serialreading()
中返回它,并将返回值作为参数传递给
roomview()

import serial
import time
import turtle

def serialreading():
    serialPort = serial.Serial(
    port="COM5", baudrate=9600, bytesize=8, timeout=2, stopbits=serial.STOPBITS_ONE
    )
    # Read data out of the buffer until a carriage return / new line is found
    serialString = serialPort.readline()
    turtlenumber = serialString.decode("Ascii")
    print(turtlenumber)

    return turtlenumber

def roomview(turtlenumber):
    t = turtle.Turtle()
    t.speed(0) # 1:slowest, 3:slow, 5:normal, 10:fast, 0:fastest
    t.forward(turtlenumber)
    time.sleep(1)
    turtle.reset()
    
while 1 > 0:
    turtlenumber = serialreading()
    roomview(turtlenumber)

旁注:我不明白为什么

print(turtlenumber)
会引发异常,所以我放弃了那里的错误处理。但是,如果连接由于某种原因中断,
serialPort.readline()
可能会引发错误。如果数据损坏,
serialString.decode("Ascii")
也可能会引发错误。我会让你弄清楚是否值得处理这些场景。

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.