Raspberry PI - prijem dat z dvoch UARTov

Ak hľadáte nejaký softvér do PC prípadne ak s ním máte nejaký problém.

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
pablox
Ultimate člen
Ultimate člen
Príspevky: 1736
Dátum registrácie: 19 Júl 2006, 00:00
Bydlisko: Ruzomberok
Vek: 32
Kontaktovať používateľa:

Raspberry PI - prijem dat z dvoch UARTov

Príspevok od používateľa pablox » 03 Jún 2020, 21:57

Zdravim,
v Pythone mam napísaný script, ktorý prijme dáta z UARtu (Arduino nano pripojené cez USB) a cez PHP get odošle dáta na web.

Kód: Vybrať všetko

#!/usr/bin/env python

import telnetlib;
import time;
import os;
import RPi.GPIO as GPIO
import subprocess;
import serial;
import datetime;
import urllib2;
from time import sleep


#define serial port
ser = serial.Serial(
port='/dev/ttyUSB0',\
baudrate=9600,\
parity=serial.PARITY_NONE,\
stopbits=serial.STOPBITS_ONE,\
bytesize=serial.EIGHTBITS,\
           timeout=0)

print("connected to: " + ser.portstr)

#this will store the line
line = []
seq = []
#date and time stamp
dtstamp = []
fname = []

for c in ser.read():
        seq.append(c)
        joined_seq = ''.join(str(v) for v in seq)

        if c == '\n':
            print(joined_seq)
            dtstamp =  datetime.datetime.now() #create datetime stamp
            response = urllib2.urlopen('http://'+joined_seq) #call phpget and send data to web
            seq = []
        break

ser.close()
Teraz sa snažím script rozšíriť na príjem dát z druhého portu - formát je rovnaký, len údaje iné. Nefunguje to ale dobre, občas sa dáta prijmú a odošlú, inokedy zas neprijme dáta z niektoŕého z portov. Vie mi niekto poradiť, ako spraviť príjem z dvoch UARtov tak, aby sa to medzi sebou nebilo? Prikladám upravený script, ktorý funguje, ako sa mu chce:

Kód: Vybrať všetko

#!/usr/bin/env python

import telnetlib;
import time;
import os;
import RPi.GPIO as GPIO
import subprocess;
import serial;
import datetime;
import urllib2;
from time import sleep


#define srial port
ser = serial.Serial(
    port='/dev/ttyUSB0',\
    baudrate=9600,\
    parity=serial.PARITY_NONE,\
    stopbits=serial.STOPBITS_ONE,\
    bytesize=serial.EIGHTBITS,\
        timeout=0)

ser2 = serial.Serial(
    port='/dev/ttyUSB1',\
    baudrate=9600,\
    parity=serial.PARITY_NONE,\
    stopbits=serial.STOPBITS_ONE,\
    bytesize=serial.EIGHTBITS,\
        timeout=0)


print("connected to: " + ser.portstr)
print("connected to: " + ser2.portstr)

#this will store the line
line = []
seq = []
seq2 = []

while True :

   for c in ser.read():
        seq.append(c)
        joined_seq = ''.join(str(v) for v in seq)

        if c == '\n':
            print(joined_seq)
            dtstamp =  datetime.datetime.now() #create datetime stamp
            response = urllib2.urlopen('http://'+joined_seq) #call phpget and send data to web
            seq = []
            break

   for c2 in ser2.read():
        seq2.append(c2)
        joined_seq2 = ''.join(str(v2) for v2 in seq2)

        if c2 == '\n':
            print(joined_seq2)
            dtstamp =  datetime.datetime.now() #create datetime stamp
            response2 = urllib2.urlopen('http://'+joined_seq2) #call phpget and send data to web
            seq2 = []
            break

ser.close()
ser2.close()
Ďakujem za rady.
0
Meranie radiačného pozadia https://radmon.pablox.net/
Moja osobná webstránka http://www.pablox.net
Moja meteostanica http://www.teplomer.pablox.net

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Raspberry PI - prijem dat z dvoch UARTov

Príspevok od používateľa peterple » 03 Jún 2020, 22:23

Nie som pytonista takže neviem ako to funguje s tým timeout=0 čo by malo byť neblokujúce ale podla toho prvého príkladu trčíš v tom for dovtedy dokiaľ nepríde znak CR. To znamená že do toho druhého cyklu preskakuješ až na znak CR a to sa potom môže stať že v tom druhom porte ti ujdú znaky. Neviem aké dlhé buffre to má. Teda by si tam nemal mať žiadne cykly for. Alebo ak ich tam chceš tak ich treba pustiť v inom vlákne.

Veď si to printuj na konzolu a uvidiš ktoré znaky kedy berieš a kedy preskakuješ z jedného for na druhý.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
mac26
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1298
Dátum registrácie: 01 Feb 2010, 00:00
Bydlisko: Martin

Re: Raspberry PI - prijem dat z dvoch UARTov

Príspevok od používateľa mac26 » 03 Jún 2020, 22:44

Sice ti neporadim ku kodu, ale slova GET a odosle nejdu vobec ku sebe. GETom nikdy nic neodosielaj, nato su metody POST a PUT.

edit: Preco jednoducho nespustis druhy skript upraveny pre iny seriak? Kazdy bude bezat vlastnym procesom a vobec o sebe nemusia vediet...
0

pocitujlasku
Ultimate člen
Ultimate člen
Príspevky: 6201
Dátum registrácie: 20 Júl 2007, 00:00
Vek: 41

Re: Raspberry PI - prijem dat z dvoch UARTov

Príspevok od používateľa pocitujlasku » 04 Jún 2020, 06:35

ja ked potrebujem robit viac veci v pythone, tak rovno idem cez thread. a kazde vlakno sa hra na svojom piesocku. hlavny program len sleduje ci bezia
pripadne kazdy thread cita zo svojho portu, a vysledok hadze do queue, odkial si dalsi thread vybera a spracuva. ak su tie data +- rovnaky format.
0
Jedním z největších projevů nedůvěry v Boha je hromosvod na kostele.

Používateľov profilový obrázok
pablox
Ultimate člen
Ultimate člen
Príspevky: 1736
Dátum registrácie: 19 Júl 2006, 00:00
Bydlisko: Ruzomberok
Vek: 32
Kontaktovať používateľa:

Re: Raspberry PI - prijem dat z dvoch UARTov

Príspevok od používateľa pablox » 04 Jún 2020, 10:40

PHP get som myslel na strane servera, ktorý prijme tie dáta.

S tým for mi to nenapadlo, skúsim teda spustiť každý script osobitne. S jedným portom to ide v pohode už 5 rokov :D
0
Meranie radiačného pozadia https://radmon.pablox.net/
Moja osobná webstránka http://www.pablox.net
Moja meteostanica http://www.teplomer.pablox.net

Používateľov profilový obrázok
pablox
Ultimate člen
Ultimate člen
Príspevky: 1736
Dátum registrácie: 19 Júl 2006, 00:00
Bydlisko: Ruzomberok
Vek: 32
Kontaktovať používateľa:

Re: Raspberry PI - prijem dat z dvoch UARTov

Príspevok od používateľa pablox » 10 Jún 2020, 21:17

Chyba bola nakoniec nejako tak medzi stoličkou a počítačom :D

Script pre príjem dát z dvoch UARTov z prvého príspevku je funkčný. Občas nastane situácia, že sa niečo neprijme tak, ako má a script padne.
Nato som spravil BASH script, ktorý sa spustí raz za minútu z crontab-u.

Kód: Vybrať všetko

#! /bin/bash

case "$(pidof python script.py | wc -w)" in

0)  echo "SCRIPT RESTART"
    sudo python /home/pi/script.py &
    ;;
1)  echo "SCRTIPT BEZI" # all ok
    ;;
esac
Do crontab-u treba pridať

Kód: Vybrať všetko

*/1 * * * * /home/pi/monitor.sh
Prenos z obidvoch portov na web funguje.
0
Meranie radiačného pozadia https://radmon.pablox.net/
Moja osobná webstránka http://www.pablox.net
Moja meteostanica http://www.teplomer.pablox.net

Používateľov profilový obrázok
zen
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 22 Nov 2013, 14:33
Bydlisko: Cadca

Re: Raspberry PI - prijem dat z dvoch UARTov

Príspevok od používateľa zen » 11 Jún 2020, 22:15

peterple napísal:trčíš v tom for dovtedy dokiaľ nepríde znak CR. To znamená že do toho druhého cyklu preskakuješ až na znak CR a to sa potom môže stať že v tom druhom porte ti ujdú znaky.
Ja som hadal overflow. Dost by ma zaujimalo, co sa presne stane.

Ja by som to pisal asi takto (zial netestovane, neviem, co sa stane, ak nie je nic ku citanie):

Kód: Vybrať všetko

line_1=""
Line_2=""
while 1:
   c=ser_1.read()
   line_1+=c
   if c == '\n':
     send(line_1)
     line_1=""

   c=ser_2.read()
   line_2+=c
   if c == '\n':
     send(line_2)
     line_2=""
0
Samozřejmě, že dědeček nemá kapesní hodinky poháněné elektřinou. Takový nesmysl si může vymyslit jen Saturnin. (Zdenek Jirotka, 1942)

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok