Svetelektro.com

Svetelektro.com

Meno:
Heslo:
SVETELEKTRO • Raspberry PI - prijem dat z dvoch UARTov

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

Raspberry PI - prijem dat z dvoch UARTov

Odoslaťod 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.
Náš rodinný blog http://www.ajmysmetu.com
Moja osobná webstránka http://www.pablox.net
Moja meteostanica http://www.teplomer.pablox.net
pablox
Obrázok používateľa
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1293
Vek: 29.1
Založený: 19.07.2006
Bydlisko: Ruzomberok
Paragraf: 23
Karma: 17

Re: Raspberry PI - prijem dat z dvoch UARTov

Odoslaťod 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ý.
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.
peterple
Ultimate člen
Ultimate člen
Príspevky: 2031
Vek: 53.6
Založený: 25.06.2013
Bydlisko: Krajné
Karma: 54

Re: Raspberry PI - prijem dat z dvoch UARTov

Odoslaťod 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...
mac26
Obrázok používateľa
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1142
Založený: 01.02.2010
Bydlisko: Martin
Karma: 8

Re: Raspberry PI - prijem dat z dvoch UARTov

Odoslaťod 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.
Intel, Nvidia, Ubuntu, Firefox, Asus, Nissan, Jelinek 52%, Metal
---------------------------------------------------------------------------------------------
Jedním z největších projevů nedůvěry v Boha je hromosvod na kostele.
pocitujlasku
Ultimate člen
Ultimate člen
Príspevky: 4977
Vek: 37.32
Založený: 20.07.2007
Bydlisko: Poprad
Karma: 19

Re: Raspberry PI - prijem dat z dvoch UARTov

Odoslaťod 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
Náš rodinný blog http://www.ajmysmetu.com
Moja osobná webstránka http://www.pablox.net
Moja meteostanica http://www.teplomer.pablox.net
pablox
Obrázok používateľa
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1293
Vek: 29.1
Založený: 19.07.2006
Bydlisko: Ruzomberok
Paragraf: 23
Karma: 17

Re: Raspberry PI - prijem dat z dvoch UARTov

Odoslaťod 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.
Náš rodinný blog http://www.ajmysmetu.com
Moja osobná webstránka http://www.pablox.net
Moja meteostanica http://www.teplomer.pablox.net
pablox
Obrázok používateľa
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1293
Vek: 29.1
Založený: 19.07.2006
Bydlisko: Ruzomberok
Paragraf: 23
Karma: 17

Re: Raspberry PI - prijem dat z dvoch UARTov

Odoslaťod 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=""
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)
zen
Obrázok používateľa
Stály člen
Stály člen
Príspevky: 430
Založený: 22.11.2013
Bydlisko: Cadca
Karma: 5


Naspäť na Softvér

Kto je prítomný

Užívatelia prezerajúci si toto fórum: Žiadny registrovaný používateľ a 0 hostí.

Forums ©
Autor stránky je Ondrej Závodský(zawin), o graficky design sa stará Ľuboš Fabo(BUFU).

TOPlist

Powered by Copyright © UNITED-NUKE CMS. All Rights Reserved.
Čas potrebný k spracovaniu stránky 0.32 sekúnd