RPi 3b+ commando end'\r' niet gelezen in python 3.5.3

Ik zit iets te proberen met de raspberry pi 3b+ maar het vreemde is dat alle gevonden info hetzelfde verteld en op een of andere manier werkt dat niet.

Wat ik wil klinkt vrij simpel: ik tel de waarde van een aantal keer drukken op een knopje en wil dit in de terminal weergeven. Alleen telkens op dezelfde regel en niet onder elkaar.

Wat ik lees is dat je dan

code:

print(variable, end='\r')

maar dit geeft het volgende resultaat
1o2o3o

Met enkel end'' zorgt voor
1234567

Hier het hele programma

code:

import PRi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setup(7,GPIO.IN) #pin7 is gpio4
counter = 0

#interrupt called function
def counterplus(channel):
  global counter
  if GPIO.input*channel) > 0.5:
    counter +=1
    print(counter, end='')

#interruptcall
GPIO.aa)event_detect(7,GPIO.RISING, callback=counterplus, bouncetime=200)

#keep up for 10 minutes
time.sleep(1) #some init time
for x in range (0,600):
  time.sleep(1) 

GPIO.cleanup
print("done")

Het lijkt wel of het end commando niet word gelezen als dusdanig, het is ook niet verkleurd.
Misschien kan iemand mij vertellen waarom het niet werkt?

Every machine is a smoke machine if you operate it wrong enough

Probeer dit:
print('\r', counter, end='')

Vervangen DOOR.

'\r' is een stuurcode die door je terminal programma wordt afgevangen en verwerkt.
Een nieuwe regel is doorgaans de code '\n'.

Fan van Samsung (en repareer ook TV's). :)
LetterHenk

Golden Member

Of '\n' Dat is een 'new line'
edit MNM(tm) was mij voor :)

[Bericht gewijzigd door LetterHenk op maandag 1 oktober 2018 16:34:05 (33%)

Action expresses priorities LH

De optie van Boudie geeft dit resultaat:

\n is voor een nieuwe regel en dat is dus juist niet de bedoeling.

Die kleine blokjes zijn de verwerking van '\r'

\r heet een carriage return.

Every machine is a smoke machine if you operate it wrong enough
LetterHenk

Golden Member

Ah, verkeerd gelezen dus.
Maar je schrijft zelf:

Op 1 oktober 2018 16:09:30 schreef MAH: Met enkel end'' zorgt voor
1234567

Dat is dan toch precies wat je wil?

Action expresses priorities LH

Nee, ik denk dat de TS wil dat elk nieuw geprint getal OVER de oude wordt geschreven.
Nogmaals: '\r' is een stuurcode die door het terminal programma wordt afgehandeld. Als daarin de ternimal settings niet juist zijn (bijv. VT100 in plaats van VT100+), dan begrijpt de terminal die stuurcode(s) niet over interpreteert die niet op de gewenste wijze.

Fan van Samsung (en repareer ook TV's). :)

Blijkbaar was ik niet zo duidelijk als ik dacht.
Wat ik graag wil is bij de eerste druk komt er 1 te staan, weer drukken zorgt er voor dat er een 2 op de plaats van de 1 komt. Dus cursor terug voor aan de lijn en wissen en schrijven of overschrijven.

De RPi is schone install zonder vreemde wijzigingen.

@MNM(tm): dat zou dus betekenen dat mijn terminal verkeerd staat ingesteld?

[Bericht gewijzigd door MAH op maandag 1 oktober 2018 17:47:10 (11%)

Every machine is a smoke machine if you operate it wrong enough
Shiptronic

Overleden

Je kan toch met print at x,y een positie op geven waar je cijfer terecht komt?
dan print hij ze op dezelfde plek, wel opletten met cijfer lengte als er al 107 stond en je doet dan bv 50 , blijft de laatste 7 van 107 staan

97
98
99
101
102
103
104
105
106
107
507
517
527
537

hiervoor moet je paar extra blanko's na je getal printen

Wie de vraag stelt, zal met het antwoord moeten leren leven.

Welk terminal programma gebruik je?

Fan van Samsung (en repareer ook TV's). :)

Zo... weer wat geleerd. Net niet my /first/ python program maar wel een van de eerste:

code:


import time
import sys


for x in range (0,10):
  sys.stdout.write (str(x))
  sys.stdout.write ('\r')
  sys.stdout.flush()
  time.sleep(1)

Update: In python 3.6 (kennelijk is bij mij een oudere versie onder "python" geinstalleerd), kan jou constructie ook:

code:

for x in range (0,10):
  print(x, end = '\r')
  time.sleep(1)

Dan zou de oplossing in de openingspost ook moeten werken, en dan heeft MNM gelijk dat het aan het terminal programma ligt.

Met dien verstande dat de "carriage return", '\r' niet een "optionele" code is die verschilt van terminal tot terminal. Dit is 1 van de alleroudste.

Eigenlijk wil je normaliter meestal naar het begin van de volgende nieuwe regel. Bij uitzondering wil je alleen recht naar beneden of alleen terug naar het begin. En dat "alleen recht naar beneden" is eigenlijk heel erg uitzonderlijk. Dus eigenlijk hadden we begin-huidige-regel en begin-volgende-regel als codes moeten hebben.

Doordat de eerste printers serieel waren en GEEN fifo hadden (8 bits storage dat moet maar genoeg zijn, ok, misschien 16 bits dan...) moesten die ieder karakter kunnen printen in de tijd dat de seriele lijn er over deed om hem te kunnen sturen. Door te eisen dat "begin volgende regel" altijd met minimaal TWEE karakters ging, konden de printers van toen dat NET bijbenen......

Het schijnt lollig geweest te zijn om dat soort printers een tiental formfeeds (ga naar volgende pagina) achter mekaar te sturen....

[Bericht gewijzigd door rew op dinsdag 2 oktober 2018 09:30:55 (72%)

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Bedankt! Ik draai met python(idle) 3.5.3 maar ook constructie die jij noemt werkt niet helaas. Het lijkt erop dat IDLE gewoon het \r commando niet snapt.

Ergens kwam ik tegen dat ze dit hebben gedaan zodat het eenvoudiger was bij het programmeren omdat het een leeromgeving is.

Ik heb nog geprobeerd om versie 3.6.0 te installeren maar die krijg ik op een of andere manier niet opgestart helaas.

Bedankt voor de hulp, ik kijk wel gewoon naar een lange lap tekst die gegenereerd word.

Every machine is a smoke machine if you operate it wrong enough

Kun je dan niet gewoon PuTTY gebruiken dan?!

Fan van Samsung (en repareer ook TV's). :)

Op 2 oktober 2018 12:41:32 schreef MAH:
Ergens kwam ik tegen dat ze dit hebben gedaan zodat het eenvoudiger was bij het programmeren omdat het een leeromgeving is.

Een terminal programma die moedwillig \r niet correct implementeert moet je weggooien. Gebruik putty of iets dergelijks, zoals MNM ook al voorstelt.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Als ik rew's prog in IDLE draai (soort python IDE - shell)
krijg ik 0123456789 als output.
Start ik het met python.exe first.py is de output wel correct.

buckfast_beekeeper

Golden Member

Hex code D (ASCII 13) invoegen kan dat? \xD volgens deze info. Ik weet een beetje stupide als er \r bestaat maar het is het proberen waard.

Van Lambiek wordt goede geuze gemaakt.
Shiptronic

Overleden

kan je een aantal keren een Backspace versturen?

[edit] \b ASCII Backspace (BS) <-- deze dus

[Bericht gewijzigd door Shiptronic op dinsdag 2 oktober 2018 23:37:29 (34%)

Wie de vraag stelt, zal met het antwoord moeten leren leven.

Stel je koopt een auto en als je voor het eerst boodschappen bent gaan doen bij de albertheijn en je wilt je parkeervak uit, blijkt dat ie geen achteruit heeft. Je belt de fabrikant en die zegt: Ja, we verkopen hem veel aan rijschoolhouders. Voor de opleidingen is het handig dat er geen achteruit op zit. Dan pleur je dat ding toch weg? Dat is toch niet bruikbaar?

Een terminal programma wat een B toont als je een A (0x41) stuurt moet je ook weg doen. Een terminal programma die de standaard control codes als \r, \n en \b niet snapt ook.

Als je een terminal programma nodig hebt en d'r zijn dit soort problemen, dan kan je in 3 minuten op "putty" overstappen. Klaar. Als jij een workaround verzint die op dat stomme terminal programma van jou blijkt te werken, wie garandeert dat het dan op andere wel-standaard terminal programmas werkt? Je bent jezelf stomme niet-standaard truuks aan het aanleren die maar een beperkt gebruiks-nut hebben.

Zit je in een commerciele omgeving en gebruiken ze dat ding voor hun planning pakket en moet je iets maken wat dan "ook" gebruikt kan worden op dezelfde terminal, tja, dan kan je adviseren: "Dat terminal programma is niet goed, houdt zich niet aan de standaard, doe het alsjeblieft weg", maar daar blijft het dan bij. Het 20 jaar oude programma kan niemand meer veranderen en zal altijd blijven.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
buckfast_beekeeper

Golden Member

@REW: het is al tig maal aangetoond dat IE en EDGE de 2 browsers zijn die zich het minst houden aan de HTML standaard zoals voorgeschreven door W3.org. Toch blijven honderdduizenden zweren bij beide programma's. Het kost hen maar enkele seconden FF, Opera of Chrome op de PC te zetten.

Ook vandaag zijn er nog zaken die op 1 platform geschreven worden. We hebben webbased applicaties die alleen goed werken met IE. Anderen werken dan weer goed met FF.

Een terminal programma wat \r correct verwerkt moet ook \xD correct verwerken. Beiden dienen geïmplementeerd te zijn. Een terminal die wel \r verstaat en niet \xD is even slecht geschreven.

Heb je een voorbeeld van een wagen waar geen achteruit op staat? Neen? Je antwoord is dan ook gewoon hypothetisch en heel ver gezocht. Kan ik net zo goed zeggen, heb je een auto die geen 3t5 mag trekken? Wat ben je daar mee, pleur die toch gewoon weg.

Van Lambiek wordt goede geuze gemaakt.

Jammer dat het dus niet out-of-the-box werkt. Ik dacht dat dit juist er compleet op was ingericht om het makkelijker te maken voor mensen.

Ik ben niet erg thuis in deze systemen, daarom dacht ik ook een compleet systeem aan te schaffen. Ik zal eens kijken hoe ik putty kan gebruiken met python.

@Rd12tf: Hoe bedoel je dat: 'Start ik het met python.exe first.py is de output wel correct.'? Eerst in de raspberry, via de explorer python.exe opzoeken en dan het programma nog eens draaien?

Every machine is a smoke machine if you operate it wrong enough

Open een terminalscherm.
Ga eens naar de directory waar je script staat.
Tik daar chmod +x scriptnaam
Tik dan ./scriptnaam

(Ik heb het getest onder windows, vandaar .exe! :-) )

Edit
Je kan natuurlijk ook in dat terminalscherm gewoon:

python scriptnaam

tikken ...

Testscript:

code:


#!/usr/bin/python

import time
import sys


for x in range (0,10):
  sys.stdout.write (str(x))
  sys.stdout.write ('\r')
  sys.stdout.flush()
  time.sleep(1)

[Bericht gewijzigd door Rd12tf op maandag 8 oktober 2018 13:01:54 (26%)