piBoardRev: Unable to determine board revision {megoldva}

piBoardRev: Unable to determine board revision from /proc/cpuinfo
-> Unable to open /proc/cpuinfo
-> You may want to check:
-> http://www.raspberrypi.org/phpBB3/viewtopic.php?p=184410#p184410

Sziasztok.

A fenti érdekesség egy RPI2-n jön ki egy python-scriptem futtatásakor. Nem értem miért áll le a script, pláne azt, hogy miért hoz ki a prompt visszaadásakor egy ilyen üzenetet.

A forráskód amit futtatok, az parancssorba és egy nokia kijelzőre küld stringeket, mellékesen dumpol is egy fájlba:



#!/usr/bin/env python

from __future__ import print_function
import serial, io, re
import pcd8544.lcd as lcd   #nokia screen cuccai
import time, os, sys, getopt
import textwrap   #szovegformazas cucca

if not os.geteuid() == 0:
    sys.exit('Legyel root...')

addr  = '/dev/ttyAMA0'  # serial port
baud  = 9600            # baud
fname = '/home/pi/gpslogger/gps-log/log-py.nmea'   # log file
fmode = 'a'             # loggolas modja = append
with serial.Serial(addr,9600) as pt, open(fname,fmode) as outf:
 spb = io.TextIOWrapper(io.BufferedRWPair(pt,pt,1),
  encoding='ascii', errors='ignore', newline='\r',line_buffering=True)
 spb.readline()  
 while (1):
  x = spb.readline()  # olvasunk soros portrol
#  z = textwrap.fill(x, 14) # ez kiirja 14 oszlopos sorba a cuccot
  outf.write(x)       # fajlba irunk
  outf.flush()        # urites
  lcd.init()
  if "RMC" in x:      # GNRMC: glonass, GPRMC: gps, ha csak RMC, akkor tokmindegy mi van epp benn
   #print (x)
   sorhossz = 14      #ez a nokija screen szelessege karakterekben merve
   balra = x.ljust(sorhossz)
   kiirni = balra
   #print (textwrap.fill(kiirni, 14))
   
   cucc = kiirni.split(',')  # ez szeletel
   print ("{[0]}".format(cucc))
   print ("{[1]}".format(cucc))
   print ("{[2]}".format(cucc))
   print ("{[3]}".format(cucc))
   print ("{[4]}".format(cucc))
   print ("{[5]}".format(cucc))
   print ("{[6]}".format(cucc))
   print ("{[7]}".format(cucc))
   print ("{[8]}".format(cucc))
   print ("{[9]}".format(cucc))
   print ("{[10]}".format(cucc))
   print ("{[11]}".format(cucc))
   # a csodaszep kiertekelos lcd-csicsakat meg nem irtam meg, mert atlag 10 perc mulva leall az egesz...
   lcd.text(kiirni)      #itt irom ki lcd-re
   time.sleep(5)         # varok, hogy el is tudjam olvasni ami kiirodott
# ennyi.

Tehát 10 perc múlva behal a script.
L80-as és L86-os cucc van rákötve RX/TX-re, egyik csak GPS, másik meg GPS-GLONASS jeleket fogad, szűröm az RMC mondatokat, és mentem is, majd kiiratom a kis képernyőre hogy tudjam, sikeresen fut a logger.

De nem értem, miért áll le.

Amúgy a cpuinfo ez:

processor : 0
model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 57.60
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5

processor : 1
model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 57.60
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5

processor : 2
model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 57.60
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5

processor : 3
model name : ARMv7 Processor rev 5 (v7l)
BogoMIPS : 57.60
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant : 0x0
CPU part : 0xc07
CPU revision : 5

Hardware : BCM2709
Revision : a01041
Serial : 0000000037ad6dad

---------------
Kernelem:
3.18.11-v7+

root@gpslogger:/etc# cat /etc/rpi-issue
Raspberry Pi reference 2015-01-31 (armhf)
Generated using spindle, http://asbradbury.org/projects/spindle/, 56db930, stage4-lxde-edu.qed

root@gpslogger:/etc# cat /etc/os-release
PRETTY_NAME="Raspbian GNU/Linux 7 (wheezy)"
NAME="Raspbian GNU/Linux"
VERSION_ID="7"
VERSION="7 (wheezy)"
ID=raspbian
ID_LIKE=debian
ANSI_COLOR="1;31"
HOME_URL="http://www.raspbian.org/"
SUPPORT_URL="http://www.raspbian.org/RaspbianForums"
BUG_REPORT_URL="http://www.raspbian.org/RaspbianBugs"

--------------

Látott már a fenti jelenséghez hasonlót valaki?

Hozzászólások

Magamnak válaszolok, növelve népszerűségi indexemet:

http://raspi.tv/2013/rpi-gpio-basics-2-how-to-check-what-pi-board-revis…

még ez sem segít, de lám, a google szerint más is kínlódik ezzel..

a python kozolom ezt mondja:

>>> import RPi.GPIO as GPIO
>>> GPIO.RPI_REVISION
3
>>>

...de még alszom egyet a következő próbálkozásomra

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Nem futottal bele veletlenul abba amibe a linkelt forumon a kollega? nezd at a kododat, mert ha loopban initelsz soros portot akkor elobb utobb (nehany perc) elfogy az ulimitben megadott file handle es ezert nem tudja megnyitni a cpuinfot.

Nem értem mit mondasz, életem első python kódját írom éppen, 3 könyv volt előttem egész nap és a google.
Ha összegzem a napomat, sikeresnek mondhatom, természetes, hogy fennakadás van.

Holnap megnézem megint mit írtál (meg a linket is amire rátaláltam), könnyen lehet hogy valami alapdolog lett kihagyva általam

---
--- A gond akkor van, ha látszólag minden működik. ---
---

lcd.init() <- ezt a sort tedd a while-on kívülre. Első tippre ez lesz az ami újranyitja a soros portodat a ciklusban folyamatosan. Mivel a soros port megnyitása is egy "fájl" megnyitása, ezért a megnyitott fájlok (fájlleírók egész pontosan) száma el fogja érnia rendszerben előre definiált limitet. Ennek pedig az az eredménye, hogy innentől a processzed nem fog tudni új fájlt megnyitni (esetedben a /proc/cpuinfo-t prólbálta volna) és így elhalálozik. Az előzőt telefonról pötyögtem, remélem így már érthetőbb :)

GC hogy jön ide? (Érteni értem, hogy mit akarsz mondani, de ódivatú valamikori programozóként eszembe nem jutna azt hinni, hogy ha én megnyitok egy fájlt, akkor majd valaki az én kérésem nélkül a program futása alatt bezárná. Nyilván amit az OS csinál amikor maga az app megszűnik, az egy másik dolog.)

Hát, ha az lcd magán belül használ egy file-t (praktikusan valami soros konzolt), akkor amikor az lcd megszűnik (vagy a régi megnyitott filet tartalmazó adattag felülíródik), az általa fogott file-ra se hivatkozik senki, bezáródik. Gondolná az ember. Nyilván ez egy régi probléma...

Köszi, megnézem.
-----------
Megnéztem.

Azóta fut, letelt a 10 perc is, remegve figyelem még mindig és nem hiszem el.

A kód jelenleg így fest:


#!/usr/bin/env python
from __future__ import print_function
import serial, io, re
import pcd8544.lcd as lcd
import time, os, sys, getopt
import textwrap
import RPi.GPIO as GPIO  
if GPIO.RPI_REVISION == 1:  
    ports = [0, 1, 21]  
elif GPIO.RPI_REVISION == 2:  
    ports = [2, 3, 27]  
else:
    ports = ["whatever the new changes will be"]

lcd.init()


if not os.geteuid() == 0:
    sys.exit('Legyel root')

addr  = '/dev/ttyAMA0' 
baud  = 9600           
fname = '/home/pi/gpslogger/gps-log/log-py.nmea'   # log file
fmode = 'a'            
with serial.Serial(addr,9600) as pt, open(fname,fmode) as outf:
 spb = io.TextIOWrapper(io.BufferedRWPair(pt,pt,1),
  encoding='ascii', errors='ignore', newline='\r',line_buffering=True)
 spb.readline()  
 while (1):
  x = spb.readline()  # read one line of text from serial port
#  z = textwrap.fill(x, 14) # ez kiirja 14 oszlopos sorba a cuccot
  outf.write(x)  
  outf.flush()      
  if "RMC" in x:      # GNRMC: glonass, GPRMC: gps
   #print (x)
   sorhossz = 14
   balra = x.ljust(sorhossz)
   kiirni = balra
   #print (textwrap.fill(kiirni, 14))
   
   cucc = kiirni.split(',')  # ez szeletel
   print ("{[0]}".format(cucc))
   print ("{[1]}".format(cucc))
#   print ("{[2]}".format(cucc))
   #l1="{[3]}".format(cucc)
   #l2="{[4]}".format(cucc)
   #print (l1+l2)
   print ("L: ""{[3]}".format(cucc)+"{[4]}".format(cucc))
   print ("G:""{[5]}".format(cucc)+"{[6]}".format(cucc))
#   print ("{[6]}".format(cucc))
   print ("{[7]}".format(cucc))
   print ("{[8]}".format(cucc))
   print ("{[9]}".format(cucc))
   print ("{[10]}".format(cucc))
   print ("{[11]}".format(cucc))

   lcd.text(kiirni)
   time.sleep(5)
   lcd.cls()   # remelem ez nem fajlmegnyitas :)
   #print ("1-----------",sorhossz)

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Így is kihalt:

Traceback (most recent call last):
File "./dump-nmea_4.py", line 59, in
print ("{[7]}".format(cucc))
IndexError: list index out of range

indíttam lcd.cls() nélkül, az eredmény hasonló, csak más sornál murdál meg:

Traceback (most recent call last):
File "./dump-nmea_4.py", line 63, in
print ("{[11]}".format(cucc))
IndexError: list index out of range

Kipróbáltam az lcd() cuccok nélkül is, ugyanaz a helyzet.
A hiba tehát nem az lcd-kódok közt van

Amúgy fentebb nem írtam, de erről van szó, ha valaki szintén ilyet szeretne:
https://github.com/rm-hull/pcd8544

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Nem hiszem hogy az üres elem miatt állna le, mert akkor már az elején le kellene állnia.

Amúgy a mondatok hibátlanok, de mivel zárt térben vagyok, így csak az óra adatai jönnek a dátummal együtt:

$GPGLL,,,,,144412.168,V,N*73
$GPTXT,01,01,02,ANTSTATUS=OPEN*2B
$GPRMC,144413.168,V,,,,,0.00,0.00,291115,,,N*4A
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPGGA,144413.168,,,,,0,0,,,M,,M,,*40
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,00*79
$GLGSV,1,1,00*65
$GPGLL,,,,,144413.168,V,N*72
$GPTXT,01,01,02,ANTSTATUS=OPEN*2B
$GPRMC,144414.168,V,,,,,0.00,0.00,291115,,,N*4D
$GPVTG,0.00,T,,M,0.00,N,0.00,K,N*32
$GPGGA,144414.168,,,,,0,0,,,M,,M,,*47
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,1,1,00*79
$GLGSV,1,1,00*65
$GPGLL,,,,,144414.168,V,N*75
$GPTXT,01,01,02,ANTSTATUS=OPEN*2B
$GPRMC,144415.168,V,,,,,0.00,0.00,291115,,,N*4C

Amikor kimegyek a szabadba, megtöltött mondatok jönnek, de a behalás úgy is megtörténik.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Szerencsere a szamitastechnika az esetek nagy reszeben nem hit kerdese :-) Illetve a listak elemeinek szamaban a Python ritkan teved, en is belefutok ilyenekbe idonkent, de a vegen mindig kiderul, hogy a Python-nak igaza van - megha faj is beismerni.

Nem lehet, hogy idonkent a sor vege (marmint egy resze a sornak), elvesz?

En a helyedben valami konzolra (ssh?) kiiratnam az 'x' es a 'kiirni' valtozo erteket, akkor latnad amikor megadja magat a programod, hogy mi a hiba es onnan tudnad tovabb debug-olni.

/sza2

Kiirja konzolra.
És pont ssh-t használok közben.

Szerencsére a soros temrinálom már nem ír ki hülyeségeket mint régen. Mindegyik mondat szép végű.

Szóval a fenti kód konzolra kiírja amit a piton a soros portról olvas, majd kiküldi lcd-re is az eredeti RMC mondatot.
Később ha mindent rendben találok, konzolra már nem akarom kiírattatni, lcd-re is csak annyit, hogy megy a loggolás, amiben nincs hiba.

Holnap megnézem, mi van a behalásnál, ha tényleg mindkét stringet külön-külön kiirja. Ma már nem, mert fáradtan nekem tilos géphez nyúlnom. (csapkodok)

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Most ezért meg fognak itt kövezni többen, de akkor is ideírom hátha lesz haszna:
még ilyen kis projektnél is célszerű lenne felosztani a kódodat kisebb részegységekre (ez még nem OOP!) és esetleg ezeket külön-külön letesztelni.
Pl. kipróbálni, hogy hibás bejövő adatra mit csinál és mit kellene csinálnia. Így megoldod rögtön a hibakezelés egy részét is, hiszen erre ígyis-úgyis szükséged lesz ha később folyamatosan akarod ezt a cuccot üzemeltetni. A kijelzőre kiírós résznél ugyan így. Biztos, hogy így több munka van vele az elején, viszont hosszú távon megkíméled magad sok szívástól :)

Ennél kisebb és egyszerűbb részegységekre már nem tudom bontani.

Leírom miért.

Régebben soros porti problémáim voltak, melyre sehogy sem találtam megoldást, bár láttam, hogy más fórumon is szívnak vele. Aztán rájöttem, hogy csak egyetlen raspbian distribnél nem jön a sorosról hülyeség: tovább már nem érdekelt a probléma, azóta azt használom.

Aztán elkészültem egy gpsd nélküli, csupán cat/grep/awk felhasználásával egy bash kódot, ami a kiirandókat és fájlba írandókat külön kitolta ramdrájvra, majd előkészítés után kiírta fájlba az RMC mondatot, kijelzőre, terminálabrakra meg azokat, amik kellettek. Aztán mire elkészült a nyáktervem alapján a kijelzős-cserélhető gps-glonasos lapkám, el is felejtettem a saját kódomat, így újra kellett írnom. Igen ám, de közben elfelejtettem, melyik raspbian nem írt ki anomáliákat a soroson. Ekkor vertem szét egy laptopomat, aminek elszállt a vinyója...

Ma már ott tartok, hogy egyetlen python kódom van, melyben minden sorról tudom, mit művel. Csak hát az awk képeségeit utánozni pythonban sokkal bonyolultabb. Szóval ha újraírtam mindent egy eddig számomra idegen nyelven, de áttekinthetőbbnek tartom minden eddiginél, minek daraboljam, ha a kód effektíve alig 10 soros?

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Attól, hogy a kódod 10 soros még sok sok függvényt hív a háttérben a használt libek miatt. Ha nem akarod nem kell, csak általános tanácsnak írtam. Ha a kódot nem is szeded szét, én abban látom a megoldást, hogy külön-külön teszteled a részeket:
kipróbálod csak a GPS olvasást csak fájlba írással. Ha megy 1 órán keresztül akkor állíthatjuk, hogy jó. Így ha ráereszted a többi kódrészt és elszáll akkor legalább abban biztos lehetsz, hogy nem a beolvasásnál van a hiba.

Igazad van, megnézem így is.
Az lcd-s python kódokhoz ami ehhez a kijelzőhöz van, végképp nem értek, azokat már nem tudom szétszedni, örülök, hogy beindult egyáltalán. Amúgy a példafájlok hozzá stabilak, nem hinném hogy rossz lenne, tele lenne vele a google.

---
--- A gond akkor van, ha látszólag minden működik. ---
---

Megcsináltam a mindent kiirató printet, és rájöttem, tényleg igazad volt, ki kellett iratni.
Így aszem akkor száll el Nepálba a script, amikor egy mondat hibásan érkezik,
azaz nem megfelelő oszlopszámmal (awk-san fogalmazva).
Már csak azt kellene megoldanom, hogy a python dobja a rossz sorokat, azokat is,
amelyek nem tartalmaznak koordinátákat.

$GPRMC,172706.551,V,,,,,0.00,0.00,031215,,,N*4D

$GPRMC,1N*32
$GPRMC,1N*32

$GPRMC
Traceback (most recent call last):
File "./dump-nmea_6.py", line 79, in
print ("L: ""{[3]}".format(cucc)+"{[4]}".format(cucc))
IndexError: list index out of range

ennyi az elszállás.
Megnéztem a dumpot is, íme:

$GPRMC,172630.551,V,,,,,0.00,0.00,031215,,,N*49
$GLGSV,2,2,08,68,24,321,,78,18,$GPRMC,172635.551,V,,,,,0.00,0.00,031215,,,N*4C
$GPRMC,172636.551,V,,,,,0.00,0.00,031215,,,N*4F
...
$GPRMC,172706.551,V,,,,,0.00,0.00,031215,,,N*4D
$GPRMC,1N*32

Érdekes, hogy fentebb is van egy hibás sor, a GSV mondat nem kapott sorvégjelet.
Mivel a sor tartalmazott "RMC" stringet, így kiíródott, pedig nem kellett volna, hanem inkább kidobni.

---
--- A gond akkor van, ha látszólag minden működik. ---
---


except IndexError:
 print('hiba')

Ez lett egyelőre a megoldás.

Itt folytatom: http://hup.hu/node/144355

---
--- A gond akkor van, ha látszólag minden működik. ---
---