Vill du vara del av diskussionerna i forumet, ställa frågor eller hjälpa andra? Registrera dig här!

Skriva till filer över serial?

Trädvy Permalänk
Medlem
Registrerad
Okt 2011

Skriva till filer över serial?

Så jag försöker skriva 3 filer genom en TTL kabel. Men jag hittar inget bra sätt att skriva till filerna. Just ny använder jag python med pyserial för att skriva. Fast det är med vanlig navigering eg.

serial.write('username\n'.encode()) time.sleep(1) serial.write('password\n'.encode()) time.sleep(1) serial.write('nano /etc/host\n'.encode()) time.sleep(1) serial.write('test\n'.encode())

etc...

Fast om den inte svarar eller tar mer än sleep tiden så blir allt fel. Finns det något bättre sätt att skriva till en fil genom serial då det inte går att överföra filer?

Trädvy Permalänk
Hedersmedlem
Registrerad
Jul 2001

cat <<EOF >>/file
Bla bla
Bla blahaj
EOF

Men du ska nog använda serial.read lite så att programmet inte gör saker förrän det är på rätt ställe.

I care because you do

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2004
Skrivet av Frejoh466:

Fast om den inte svarar eller tar mer än sleep tiden så blir allt fel. Finns det något bättre sätt att skriva till en fil genom serial då det inte går att överföra filer?

Använd paketet lrzsz på linuxburken (efter installation så skriv rz i konsollen för att ta emot filer) och sen skicka filerna med zmodem-protokollet från Python.
https://pypi.org/project/modem/ typ.

Trädvy Permalänk
Medlem
Registrerad
Okt 2011

Vet inte varför jag glömde att echo finns.

ser.write(str.encode('echo "{}, {}" > /etc/file\n'.format(TEXT1,TEXT2)))

Jag fick också till att den kollar om enheten har tagit emot kommandot, så nu ser det ut som,

def find(TEXT): while True: sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser)) sio.flush() STR = sio.readline() if TEXT == STR return time.sleep(1) ser.write(str.encode('username\n')) TEXT = 'username' find(TEXT) ser.write(str.encode('password\n')) TEXT = 'password' find(TEXT) time.sleep(0.5) ser.write(str.encode('echo "{}, {}" > /etc/file\n'.format(TEXT1,TEXT2))) time.sleep(1) serial.write('reboot\n') sys.exit()

Kanske borde lägga till en exit i def så att programmet inte hänger sig.

Vet dock inte om jag borde byta ut io till något liknande

buffer = "" while True: oneByte = ser.read(1) if oneByte == b"\r": print(buffer) break else: buffer += oneByte.decode("ascii")

Trädvy Permalänk
Medlem
Registrerad
Okt 2011

Men koden att läsa från seriell är ju lite värdelös. Om jag skriver "cd /etc" så ser jag att den svarar med "cd /etc" men jag vill ju ha svaret från att skicka "cd /etc" inte att den har tagit emot kommandot. Annars vet jag ju inte om jag verkligen är i /etc

Skickades från m.sweclockers.com

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Jan 2004
Skrivet av Frejoh466:

Men koden att läsa från seriell är ju lite värdelös. Om jag skriver "cd /etc" så ser jag att den svarar med "cd /etc" men jag vill ju ha svaret från att skicka "cd /etc" inte att den har tagit emot kommandot. Annars vet jag ju inte om jag verkligen är i /etc
Skickades från m.sweclockers.com

Använda kommandot "pwd" (print working directory) för att se vart du är i filsystemet.

Trädvy Permalänk
Medlem
Registrerad
Jul 2017

Har du funderat på att använda PPP för att sätta upp en IP-anslutning mot din inbäddade Linuxburk? Beroende på din applikaton så kan det ju vara en möjlig llsning.

Annars, precis som @iXam var inne på, lrzsz och en terminal med stöd för Zmodem. Försök inte återuppfinna hjulet, allt det här var vardagsmat på 80-talet och tidigt 90-tal.

Eller handlar detta om en burk som du inte kan installera eget på?

Trädvy Permalänk
Medlem
Registrerad
Okt 2011
Skrivet av iXam:

Använda kommandot "pwd" (print working directory) för att se vart du är i filsystemet.

Problemet är att jag får för svar "pwd" allt jag skickar får jag som svar.

Men jag löste problemet,

LOGIN_TIME = time.time() while True: response = ser.readline() response = response.decode() response = response.rstrip('\n\r') if (response.find('login:') != -1): ser.write(str.encode('username\n')) if (response.find('Password:') != -1): ser.write(str.encode('password\n')) A = 1 if (response.find('root@') != -1) & A == 1: A = 0 break if (time.time() - LOGIN_TIME) > 35: print(' ',end='\r') print('restart', end='\r') time.sleep(10) LOGIN_TIME = time.time() print(' ', end='\r') print(response, end='\r') print(' ', end='\r') ser.write(str.encode('shutdown -P now\n'))

Skickades från m.sweclockers.com