在python中从不同函数通过串行方式发送数据 我用C++和C语言编程,我想习惯Python工作,所以如果这是一个相当基本的问题,请原谅我。

在python中从不同函数通过串行方式发送数据 我用C++和C语言编程,我想习惯Python工作,所以如果这是一个相当基本的问题,请原谅我。,python,pyserial,Python,Pyserial,我想在python中通过RS-232打开一个串行连接,并从各种函数发送数据。以下是我必须打开串行端口并发送数据的功能: def sendData(data): ser = serial.Serial('/dev/ttyUSB0', 115200) data += "\r\n" ser.write(data.encode()) 非常简单,但是我想把ser=serial.serial('/dev/ttyUSB0',115200)行移到函数外部,这样我就可以自己调用这个函数了

我想在python中通过RS-232打开一个串行连接,并从各种函数发送数据。以下是我必须打开串行端口并发送数据的功能:

def sendData(data):
    ser = serial.Serial('/dev/ttyUSB0', 115200)
    data += "\r\n"
    ser.write(data.encode())
非常简单,但是我想把
ser=serial.serial('/dev/ttyUSB0',115200)
行移到函数外部,这样我就可以自己调用这个函数了

现在在其他语言中,我只是将ser变量公开,以便其他函数可以访问它,但我不确定我是否理解变量在python中如何正常工作。理想情况下,我想要这样的东西:

def main():
    ser = serial.Serial('/dev/ttyUSB0', 115200)
    while 1:
        #misc code here
        sendData(data)
我知道我可以通过函数调用传递ser变量并使其发送数据(ser,data),但这似乎是不必要的。最好的方法是什么


谢谢

您可以在
main
函数中使用
global
关键字来分配公共变量:

ser = None

def sendData(data):
    data += "\r\n"
    ser.write(data.encode())

def main():
    global ser
    ser = serial.Serial('/dev/ttyUSB0', 115200)
    while 1:
        #misc code here
        sendData(data)
或者更好,使用类:

class SerialWrapper:
    def __init__(self, device):
        self.ser = serial.Serial(device, 115200)

    def sendData(self, data):
        data += "\r\n"
        self.ser.write(data.encode())

def main():
    ser = SerialWrapper('/dev/ttyUSB0')
    while 1:
        #misc code here
        ser.sendData(data)

为什么没有必要?这是一个标准的实践。@ IvnPoZeDeV与C++相比,我可以做一个静态或公共变量,它看起来是过度的或混乱的IMO。查看答案,它更可读,所有的变量和函数都会被组织成一个类。只是语法不同。您甚至可以显式地传递一个实例-
SerialWrapper.sendData(ser,data)
-这就是它的相同之处。我想要的部分是更清晰的语法,这样我就可以缩减代码。所以现在不用传递ser引用,我只需调用函数,代码看起来简单多了。我的代码中大约有30个“sendData”部分。我的初始化函数调用OptionParser,OptionParser调用另一个函数来计算金额,完成后会执行“sendData”部分。我希望在初始化过程中启动串行发送设置信息,然后在以后使用,而不必重新创建串行,也不必通过3个不同的函数传递。我喜欢将函数分开,因为我的代码的许多部分将根据条件重新使用,因此,将其拆分为一个全局类,允许所有函数调用ser.sendData(data),而无需直接传递ser对象。这样,如果我删除了初始化代码,就不会丢失对对象的引用。希望这有意义<仅当函数希望重新分配变量时,才需要代码>全局。从全局范围读取变量不需要任何特殊语法。2个解决方案,既优雅又干净!比通过函数调用传递变量要好得多。在python中还不知道全局变量!不过我还是喜欢上课。这只是我代码的一小段,使用类可以进行更多的组织。非常感谢。我也赞成班级选项。重复的代码就像俄罗斯方块一样消失了!:)@没错!另外,我刚刚编写了代码,并最终使用了两者的组合!创建了一个类,但随后使
ser=SerialWrapper('/dev/ttyUSB0')
global,这样我就可以从任何函数使用
ser.sendData(data)
,而不仅仅是main函数。比以前好多了:)