Puncte:2

scrieți pe dispozitiv și capturați răspunsul

drapel br

Am un dispozitiv care este /dev/ttyACM0. Pot „ecran” la acest dispozitiv ecranul /dev/ttyACM0 și interacționează cu dispozitivul. Trebuie să fiu capabil să scriu trimiterea unei comenzi simple și să capturez răspunsul. Comanda este simplă, ca tip „ver” și apăsați return, dispozitivul răspunde cu o valoare numerică a versiunii. Funcționează pe ecran.

Încerc să scriu asta în bash și nu îmi dau seama cum să funcționeze. chestii de genul echo "ver" > /dev/ttyACM0 nu produce nimic. Am incercat sa printez, acelasi lucru. Îmi poate indica cineva cum să fac asta?

waltinator avatar
drapel it
`așteaptă` este un instrument bun pentru asta. Citiți „omul aștept”.
jpbrain avatar
drapel ca
salut @alabamatoy. Am o intrebare. dispozitivul tău este un Ardunio Mega?. Arduino se resetează de fiecare dată când comutați DTR. așa că deschiderea/închiderea prin bash va reporni dispozitivul. ecranul deschide o conexiune și nu o închideți până când nu închideți fereastra. Deci va fi ușor să faci un mic program c pentru asta. Toate acestea presupunând că nu aveți probleme de acces „rw”.
alabamatoy avatar
drapel br
@jpbrain nu este un arduino, este o placă Numato USB IO. https://numato.com/product/8-channel-usb-gpio-module-with-analog-inputs/
Puncte:1
drapel ca

În Unix/Linux totul este un fișier. De fiecare dată când ecou la un dispozitiv (/dev), deschideți pentru scriere, apoi scrieți și închideți. O modalitate simplă de a capta ieșirea unui dispozitiv este la fel de simplă ca

tail -f /dev/ttyACM0 (-f menține linia deschisă)

aceasta va bloca ieșirea și va menține dispozitivul deschis.
De exemplu, în cazul meu, am un proiect care citește senzorii într-un Arduino și în paralel trimite informațiile către un server și, de asemenea, către portul serial.

Acum, tty-urile seriale trebuie să se potrivească cu viteza de pe sistemul de operare și pe dispozitiv. Deci, uneori, nu obțineți ieșire decât dacă aveți viteza și setarea potrivite. dacă introduceți un terminal

stty /dev/ttyACM0

veți obține configurația curentă a vitezei.
Deci, puteți încerca așa ceva (dar nu funcționează întotdeauna)
actualizat ++

#!/bin/bash

input="/dev/ttyACM1" #setează dispozitivul

stty -F $input 115200 min 0
#adăugat pentru a inițializa linia
stty -F $input -brkint -icrnl -imaxbel -opost -onlcr -isig 
stty -F $input -icanon -iexten -echo -echoe -echok -echoctl -echoke

echo "ver" >>$input #trimite comanda
tail -f $input & #citește și așteptați pentru totdeauna
dormi 2 secunde
Killall tail #Ar putea fi o problemă dacă altă coadă rulează

în cazul meu, shell-ul scoate acest lucru (nu va lua comanda ver, deoarece nu este implementată, dar după aceea citește din tty orice trimite tty-ul). Cu coada de schimbare se oprește mai devreme și ieșirea este trunchiată la 2 secunde

1970-00-00-00:00:00: Init SDcard...
1970-00-00-00:00:00: SDCard Init finalizată.
1970-00-00-00:00:00: Se citește configurația...
1970-00-00-00:00:00: Gata...
1970-01-01-00:00:01: IP: 192.168.22.199

Din nou, indicatorul -f menține terminalul deschis, dar, dacă îl scot, nu primesc nimic (am pierdut ieșirea bufferului)

De aceea cred că un mic program c va funcționa mai bine.

Sper că acest lucru vă ajută.

alabamatoy avatar
drapel br
cum inchid coada dupa ce a fost deschisa? Și eu cred că un mic program C poate fi mai bun, dar acesta ar fi un proiect de cercetare cu totul nou pentru mine, deoarece C depășește setul meu de abilități. Cred că scenariul tău ar trebui să-mi ofere o mulțime de îndrumări către soluție.
alabamatoy avatar
drapel br
Comanda de coadă nu se finalizează niciodată și nimic nu se întoarce. Am ajuns să opresc procesul pentru comanda tail. Lucrul tare este că, dacă trimit „stty -F /dev/ttyACM0 -cstopb -crtscts cs8 9600 ; echo „ver” >>/dev/ttyACM0” când deschid un „screen /dev/ttyACM0”, valoarea versiunii este așezată acolo, așa că știu că vorbesc cu el, dar nu pare să răspundă la scenariu.
jpbrain avatar
drapel ca
Voi pune o mică schimbare, dar trebuie să fie ajustată în funcție de nevoile dvs. Aceasta este o caracteristică autokill :-)
jpbrain avatar
drapel ca
În cazul meu. Acest lucru ucide carcasa, dar mai primesc câteva mesaje după un timp.
jpbrain avatar
drapel ca
Bună @alabamatoy. Am testat o abordare diferită. Acesta din urmă ucide coada după 2 secunde.
alabamatoy avatar
drapel br
Încă nu primesc nimic de la dispozitiv prin comanda tail. Ecranul funcționează, dar nu cat sau coada /dev/ttyACM0, pur și simplu nu afișează nimic.
jpbrain avatar
drapel ca
care este configuratia ecranului? dacă tastați „stty -F /dev/ttyACM0”. ce primesti?
alabamatoy avatar
drapel br
> stty -F /dev/ttyACM0 viteza 9600 baud; linie = 0; ucide = ^H; min = 100; timp = 2; -icrnl -imaxbel -opost -onlcr -isig -icanon -echo
jpbrain avatar
drapel ca
Salut @alabamatoy. Am facut niste teste. Nu vă puteți reproduce situația. După cum am spus, folosesc un arduino și ubuntu 20.04 folosind shell-ul furnizat. Când rulați shell-ul și ecranul, le rulați separat în terminale diferite?
jpbrain avatar
drapel ca
La naiba @alabamatoy. a adăugat câteva rânduri. cum am ajuns acolo? a executat stty pe dev când nu funcționa și apoi din nou când a funcționat. Asa am pus totul lipsa de la primul. Meyabe nu toate sunt necesare, dar este un pariu sigur.
jpbrain avatar
drapel ca
Îmi pare rău... Mă refeream la Salut în ultimul comentariu. Tocmai am văzut greșeala de scriere.
Puncte:0
drapel it

Multe probleme de acces la dispozitive pot fi rezolvate prin modificări de apartenență la grup.

Mai exact, dacă ls -l arată că permisiunile de grup (al doilea "rwx"triplet) este"rw" (de exemplu."-rw-rw----"), apoi, adăugarea în grupul care deține dispozitivul va acorda rw acces.

Iată cum:

device="/dev/ttyACM0"
sudo adduser $USER $(stat -c „%G” $dispozitiv)

Acest lucru vă permite apartenența la grupul care poate rw dispozitivul, dar mai este un pas.

Pentru a face toate procesele membre ale noului grup, deconectați-vă și autentificați-vă. Membrii grupurilor sunt stabilite la Autentificare timp.

Pentru a crea un singur proces în noul grup (pentru testare, înainte de deconectare/autentificare):

newgrp $(stat -c „%G” $dispozitiv)  

sau, doar introduceți numele grupului. Vedea man newgrp.

alabamatoy avatar
drapel br
> ls -al /dev/ttyACM0 crw-rw---- 1 root dialout 166, 0 sep 1 11:52 /dev/ttyACM0 Nu pot să-mi dau seama cum să formatez acest lucru în stackexchange, dar îmi este destul de clar că problema mea nu este o problemă de permisiuni, mai ales când Eu sunt sudo. Trebuie să știu cum să capturez rezultatul care vine de la o comandă trimisă la ttyACM0....
waltinator avatar
drapel it
Vă rugăm să [editați] postarea pentru a adăuga informații noi, formatate corespunzător. Informațiile adăugate prin comentarii sunt greu de format pentru tine, greu de citit pentru noi și ignorate de viitorii cititori. Dați clic pe [editați] și adăugați acele informații vitale la întrebarea dvs., astfel încât toate faptele de care avem nevoie să fie în întrebare. Vă rugăm să nu utilizați Adăugare comentariu, deoarece acesta este legătura noastră ascendentă către dvs. Toate informațiile despre sistemul dvs. ar trebui să apară în Întrebarea cu[editare]

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.