python pošiljanje na serial port

Vse o programiranju na in za PC

Moderatorji: Kroko, tilz0R

python pošiljanje na serial port

OdgovorNapisal/-a kose19 » 01 Sep 2022, 20:18

Na raspberiju preko serijskega porta berem string in ga shranjujem v data.csv
Do tu vse deluje kot sem si zamislil.
Tudi izpis z "print" dela.

Rad bi še pošiljal podatke v nasprotni smeri.
Če prekinem rutino z CTRL+C mi tudi izvede zadnjo vrstico in izpiše
"Kaj želiš poslati mikrokontrolerju? "

Rad bi poslal nek string npr "parameter 1 = 100"
Sedaj se mi ustavi in ne vem kako naprej.

Koda: Izberi vse
from datetime import datetime
from time import localtime, strftime
import serial

i = 0
while 0 < 1:
    try:
        ser = serial.Serial('/dev/ttyS0', 9600)
        s = ser.readline(100)
        x = strftime("%Y-%m-%d %H:%M:%S", localtime())
        y = strftime("%d-%m-%Y %H:%M:%S", localtime())
        b = s.decode('utf-8')

        c = b[1:][:-5]
       
        str_za_datoteko = str(x) + (",") + str(c) + '\n'

        f = open("data.csv", "a")
        f.write(str_za_datoteko)
        f.close()

        trenutna = open('trenutna.txt', 'w')
        trenutna.write(str_za_datoteko)
        trenutna.close()
       
        # print(str_za_datoteko)
        print(str(x) + (",") + str(c))


    except KeyboardInterrupt as err:
        msg = print(str("\Kaj želiš poslati mikrokontrolerju? "))
       
Nimate dovoljenj za ogled prilog tega prispevka.
kose19
 
Prispevkov: 555
Pridružen: 19 Jan 2015, 18:01
Kraj: Kobarid
Zahvalil se je: 56 krat
Prejel zahvalo: 170 krat
Uporabnika povabil: s54mtb
Število neizkoriščenih povabil: 175

Re: python pošiljanje na serial port

OdgovorNapisal/-a twom » 02 Sep 2022, 04:14

V času razvoja programa odstrani try except, da boš videl napako. Lahko je kaj banalnega, tipkarska napaka, string namesto byte, napačen zamik
twom
 
Prispevkov: 340
Pridružen: 19 Jan 2015, 08:22
Kraj: Ljubljana
Zahvalil se je: 0 krat
Prejel zahvalo: 57 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 14

Re: python pošiljanje na serial port

OdgovorNapisal/-a booxco » 02 Sep 2022, 09:09

Pošiljaš lahko z ukazom

Koda: Izberi vse
ser.write("abc")
booxco
 
Prispevkov: 227
Pridružen: 25 Sep 2016, 21:17
Kraj: Lj okolica
Zahvalil se je: 43 krat
Prejel zahvalo: 95 krat
Uporabnika povabil: radix
Število neizkoriščenih povabil: 19

Re: python pošiljanje na serial port

OdgovorNapisal/-a kose19 » 02 Sep 2022, 09:58

Se pravi lahko direkt vpišem v 'Shell' okno direkt ser.write("abc") ?
Bom poskusil, da vidim če kaj dobim na drugi strani.
kose19
 
Prispevkov: 555
Pridružen: 19 Jan 2015, 18:01
Kraj: Kobarid
Zahvalil se je: 56 krat
Prejel zahvalo: 170 krat
Uporabnika povabil: s54mtb
Število neizkoriščenih povabil: 175

Re: python pošiljanje na serial port

OdgovorNapisal/-a jure94 » 02 Sep 2022, 11:36

Ne vem, če prav razumem, ampak mogoče iščeš tole: https://www.w3schools.com/python/ref_func_input.asp ?
Uporabniški avatar
jure94
 
Prispevkov: 982
Pridružen: 18 Jan 2015, 00:33
Kraj: Ljubljana
Zahvalil se je: 49 krat
Prejel zahvalo: 112 krat
Uporabnika povabil: VolkD
Število neizkoriščenih povabil: 11

Re: python pošiljanje na serial port

OdgovorNapisal/-a booxco » 04 Sep 2022, 20:02

kose19 je napisal/-a:Se pravi lahko direkt vpišem v 'Shell' okno direkt ser.write("abc") ?
Bom poskusil, da vidim če kaj dobim na drugi strani.


Podobno kot v svojem programu uporabljaš ser.readline() za sprejemanje, lahko s ser.write() pišeš na serijski port.
booxco
 
Prispevkov: 227
Pridružen: 25 Sep 2016, 21:17
Kraj: Lj okolica
Zahvalil se je: 43 krat
Prejel zahvalo: 95 krat
Uporabnika povabil: radix
Število neizkoriščenih povabil: 19

Re: python pošiljanje na serial port

OdgovorNapisal/-a kose19 » 05 Sep 2022, 17:43

Poskušam s tem ser.write("qwert") pa mi gre kar v napako.
kose19
 
Prispevkov: 555
Pridružen: 19 Jan 2015, 18:01
Kraj: Kobarid
Zahvalil se je: 56 krat
Prejel zahvalo: 170 krat
Uporabnika povabil: s54mtb
Število neizkoriščenih povabil: 175

Re: python pošiljanje na serial port

OdgovorNapisal/-a dejko1 » 06 Sep 2022, 07:46

Mogoče ser.write("qwert".encode())?

Write zahteva byte array, stringa pa python sam ne zna pretvorit avtomatsko, ker je to odvisno od encodinga.
dejko1
 
Prispevkov: 741
Pridružen: 12 Feb 2015, 12:47
Kraj: Ljubljana
Zahvalil se je: 130 krat
Prejel zahvalo: 320 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 255

Re: python pošiljanje na serial port

OdgovorNapisal/-a peterp » 06 Sep 2022, 08:12

Koda: Izberi vse
        str_za_send = "parameter 1 = " + str(100) + '\n'
        print("writing: " + str_za_send)
        ser.write(str_za_send.encode('utf-8'))

Pa odpiranje porta s
Koda: Izberi vse
ser = serial.Serial('/dev/ttyS0', 9600)
prestavi izven zanke na začetek programa.
peterp
 
Prispevkov: 1144
Pridružen: 23 Feb 2015, 13:52
Kraj: Maribor okolica
Zahvalil se je: 382 krat
Prejel zahvalo: 237 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 241

Re: python pošiljanje na serial port

OdgovorNapisal/-a booxco » 06 Sep 2022, 08:25

kose19 je napisal/-a:Poskušam s tem ser.write("qwert") pa mi gre kar v napako.


Napiši, katero napako točno javi. Če je ser nedefiniran, prej odpri port s "ser = serial.Serial('/dev/ttyS0', 9600)"
Če boš dal tudi več podatkov, kaj sploh želiš narediti, ti bomo lahko bolje pomagali.
booxco
 
Prispevkov: 227
Pridružen: 25 Sep 2016, 21:17
Kraj: Lj okolica
Zahvalil se je: 43 krat
Prejel zahvalo: 95 krat
Uporabnika povabil: radix
Število neizkoriščenih povabil: 19

Re: python pošiljanje na serial port

OdgovorNapisal/-a peterp » 06 Sep 2022, 08:48

Poskusi s tem.

Koda: Izberi vse
from datetime import datetime
from time import localtime, strftime
import serial

ser = serial.Serial('/dev/ttyS0', 9600)

i = 0
while 0 < 1:
    try:
        s = ser.readline(100)
        x = strftime("%Y-%m-%d %H:%M:%S", localtime())
        y = strftime("%d-%m-%Y %H:%M:%S", localtime())
        b = s.decode('utf-8')
        print("readline: " + b)

        c = b[1:][:-5]

        str_za_datoteko = str(x) + "," + str(c) + '\n'

        f = open("data.csv", "a")
        f.write(str_za_datoteko)
        f.close()

        trenutna = open('trenutna.txt', 'w')
        trenutna.write(str_za_datoteko)
        trenutna.close()

        # print(str_za_datoteko)
        print(str(x) + "," + str(c))


    except KeyboardInterrupt as err:
        msg = print(str("\nKaj zelis poslati mikrokontrolerju? "))

        str_za_send = "parameter 1 = " + str(100) + '\n'
        print("write: " + str_za_send)
        ser.write(str_za_send.encode('utf-8'))

Napaka pa je verjetno bila
Koda: Izberi vse
TypeError: unicode strings are not supported, please encode to bytes: 'qwert'
peterp
 
Prispevkov: 1144
Pridružen: 23 Feb 2015, 13:52
Kraj: Maribor okolica
Zahvalil se je: 382 krat
Prejel zahvalo: 237 krat
Uporabnika povabil: gumby
Število neizkoriščenih povabil: 241

Re: python pošiljanje na serial port

OdgovorNapisal/-a kose19 » 06 Sep 2022, 18:14

@peterp hvala, to je pa šlo skozi.
Zdaj moram samo še spraviti v tako obliko, da bo uporabno na strani mikrokontrolerja.

Tudi sam sem poskušal z encode ukazom, pa sem imel očitno že kako vrstico prej v nepravilni obliki.

Bom imel še kako vprašanje ziher, saj je to moj prvi primer v pythonu.
kose19
 
Prispevkov: 555
Pridružen: 19 Jan 2015, 18:01
Kraj: Kobarid
Zahvalil se je: 56 krat
Prejel zahvalo: 170 krat
Uporabnika povabil: s54mtb
Število neizkoriščenih povabil: 175

Re: python pošiljanje na serial port

OdgovorNapisal/-a kose19 » 04 Dec 2022, 16:25

Nadaljujem moj projekt v pythonu.

Podatke, ki jih dobim s strani mikrokontrolerja, bi rad preko MQTT pošiljal na homeassistant.
V glavnem so zaenkrat to temperature in nekaj stanj izhodov (1, 0).

Saj nekaj primerov sem pregledal, pa nevem točno kako to speljat.
Podatke dobim v obliki.csv, iz tega trenutno kar v terminalu izpisujem v tako obliko, da je razvidno.
Vaše izkušnje dobrodošle.
kose19
 
Prispevkov: 555
Pridružen: 19 Jan 2015, 18:01
Kraj: Kobarid
Zahvalil se je: 56 krat
Prejel zahvalo: 170 krat
Uporabnika povabil: s54mtb
Število neizkoriščenih povabil: 175

Re: python pošiljanje na serial port

OdgovorNapisal/-a sundancer » 04 Dec 2022, 22:03

V HomeAssistant poglej, če ti ustreza branje neposredno iz serijskega porta
https://www.home-assistant.io/integrations/serial/

V kolikor vztrajaš pri pythonu predlagam, da si ogledaš tole kodo. Se mi zdi kar solidno spisano.
https://gist.github.com/andypiper/1218932

Če imaš možnost arduino priklopiti neposredno na ESP8266 / NodeMCU potem lahko probaš s temle:
https://github.com/mrizvic/nodemcu-uart2mqtt
Uporabniški avatar
sundancer
 
Prispevkov: 977
Pridružen: 16 Jan 2015, 22:36
Kraj: Ljubljana
Zahvalil se je: 437 krat
Prejel zahvalo: 533 krat
Uporabnika povabil: Vrtni palček
Število neizkoriščenih povabil: 63

Re: python pošiljanje na serial port

OdgovorNapisal/-a kose19 » 05 Dec 2022, 18:38

Na mqtt bi rad pošiljal zato, ker imam homeassistant na drugem PCju.
Ma tej malini berem serijski port in shranjujem v trenutna.txt, ki se prepiše vsakič, ko dobi nov string in data.csv kot log file.
Te trenutne vrednosti bi rad pošiljal dalje. Bi jih pa moral verjetno primerno obdelat, csv nevem, če je za mqtt primerna oblika.

V pythonu pa zato, da bi vse v enem programu to obdelal in da mimam vse raztrešeno v več jezikih, ki jih ne obvladam.

Bom pregledal linke, hvala.
kose19
 
Prispevkov: 555
Pridružen: 19 Jan 2015, 18:01
Kraj: Kobarid
Zahvalil se je: 56 krat
Prejel zahvalo: 170 krat
Uporabnika povabil: s54mtb
Število neizkoriščenih povabil: 175

Re: python pošiljanje na serial port

OdgovorNapisal/-a booxco » 05 Dec 2022, 20:08

Verjetno je najlažje kar v gornji kodi (ki piše v trenutno.txt) taisto poslati še na mqtt strežnik. Pri tem uporabiš modul paho-mqtt (https://pypi.org/project/paho-mqtt/), ključni del bi bil na primer:

Koda: Izberi vse
client.publish("/mytopic/value", c)
client.publish("/mytopic/time", x)


pred tem pa seveda narediš povezavo na ustrezen strežnik:

Koda: Izberi vse
client = mqtt.Client()
client.connect("192.168.0.4")
client.loop_start()

.
.
.

glej pač navodila in primere v dokumentaciji modula.
booxco
 
Prispevkov: 227
Pridružen: 25 Sep 2016, 21:17
Kraj: Lj okolica
Zahvalil se je: 43 krat
Prejel zahvalo: 95 krat
Uporabnika povabil: radix
Število neizkoriščenih povabil: 19


Vrni se na Programski jeziki

Kdo je na strani

Po forumu brska: 0 registriranih uporabnikov in 1 gost