@nomads: Tutorials lesen reicht nicht, man muss die durcharbeiten, also den Code auch selber ausprobieren, verändern, überlegen was passiert und vergleichen mit dem was tatsächlich passiert und verstehen warum das so ist.
`esc1` ist wie schon gesagt nicht global. Das wäre es in C auch nicht, und Du solltest überlegen warum Du das erwartet hast, und auch was passieren würde wenn Du ein Modul mit 50 Funktionen hast und alle Namen global wären. Würde das überhaupt Sinn machen?
Warum ``ser.write(esc1 + '\r\n')`` nicht funktioniert hat, sollte die Ausnahme die man bekommt, ziemlich deutlich sagen: Der Name `esc1` ist an der Stelle nicht definiert. Da hättest Du dann darauf kommen können, dass der Name durch eine Zuweisung in einer Funktion nicht global zur Verfügung steht.
Ohne Funktion mag es klappen, aber ohne Funktion sollte man es nicht schreiben. Wenn Du Funktionen vermeidest, lernst Du nicht wie Python funktioniert, und Programme ohne Funktionen können kaum über simple "Hallo, Welt!"-Schnippsel wachsen. Auf Modulebene sollten nur Definitionen von Konstanten, Funktionen, und Klassen stehen. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst und die so aufgerufen wird, dass man das Modul auch importieren kann ohne dass das Hauptprogramm automatisch abläuft.
Die Einrückung sollte vier Leerzeichen pro Ebene betragen.
Um sicherzustellen, dass die Verbindung unter allen Umständen am Ende geschlossen wird, bietet sich die ``with``-Anweisung an. Oder man benutzt ``try``/``finally`` dafür.
Namen sollten nicht kryptisch abgekürzt werden. Steht `ser` für `serial` oder für `servo`? So etwas sollte man nicht raten müssen.
`input` ist der Name einer eingebauten Funktion. Den sollte man nicht an etwas anderes binden.
Das Semikolon dient in Python nicht wie in C als Abschluss einer Anweisung, sondern um Anweisungen in der gleichen Zeile voneinander zu trennen. Da man das in der Regel nicht macht, ist das Semikolon sehr selten in Python-Quelltexten zu finden.
Das ``exit`` am Ende hat keinen Effekt. Man muss Funktionen auch aufrufen wenn man sie denn aufrufen möchte. Aber selbst dann hätte es keinen sichtbaren Effekt, denn das Programm wird an der Stelle ja sowieso verlassen weil es zuende ist. Ausserdem ist der Name zwar einfach so verfügbar, sollte er laut Dokumentation aber nicht. Deshalb sollte man ihn besser explizit aus `sys` importieren wenn man das Programm tatsächlich mit `exit()` verlassen muss/will, beispielsweise weil man den Rückgabewert des Prozesses setzen möchte.
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python
# coding: utf-8
from __future__ import absolute_import, division, print_function
import random
import time
import serial
def random_esc():
return str(random.randint(1000, 2000))
def main():
#
# Configure the serial connections (the parameters differ on the
# device you are connecting to).
#
with serial.Serial(
port='/dev/ttyUSB0',
baudrate=115200,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
) as connection:
command = '3'
connection.write(command + '\r\n')
time.sleep(1)
connection.write(random_esc() + '\r\n')
print('ESC Done')
if __name__ == '__main__':
main()