Problema comunicazione seriale linux - arduino

Salve,
devo inviare ad arduino dei comandi tramite seriale.

dal terminale do:

echo -n 1 > /dev/ttyACM0

mi sono accorto però che finchè non apro almeno una volta il monitor seriale da Arduino IDE c'è qualcosa che non funziona, nel senso che vedo lampeggiare i led sulla scheda ma arduino non reagisce come dovrebbe. una volta aperto e chiuso il monitor seriale dell'IDE invece il tutto funziona perfettamente.
appena riavvio il pc il problema si ripresenta.

immagino che l'IDE configuri qualche parametro tipo bitrate..

eseguire da terminale

stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts

prima di scrivere sul seriale non ha effetti..

sapete qual è il trucco?
grazie mille

non è capitato a nessuno?

interessante comportamento,
che arduino stai usando ? originale o con ch340 ?
effettivamente il serial monitor dovrebbe essere un rpogramma come un altro, non e' che blocca la counicazione.
Cosa succede se metti in stampa un hello world e lato pc apri un altro monitor seriale, non quello arduinico ? un qualsiasi altro sw per la lettura seriale dei dati

è normale, quando colleghi arduino alla porta usb il pc non può sapere la configurazione della seriale.
Devi quindi dirgli te come configurarsi.

#impostazioni
arduinobaund=9600
arduinodevice=/dev/ttyACM0
#salvo i vecchi settaggi
oldsettingtty="$(stty -F $arduinodevice -g)"
#setto
stty -F $arduinodevice cs8 $arduinobaund ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts

#uso
echo -N 1 > $arduinodevice

#ripristino con i vecchi valori
stty $oldsettingtty

ma lui dice che li fa questi settaggi

windard:
eseguire da terminale

stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts

prima di scrivere sul seriale non ha effetti..

sono sbagliati i settaggi che fa ?

il settaggio sembra giusto.
aspettiamo che riprovi

il procedimento è settare la tty e inviare i dati.

Per Arduino basta questo comando "sudo stty -F /dev/ttyS0 57600", al posto di ttyS0 mettere la seriale di Arduino e al posto di 57600 i bps desiderati (quelli impostati sullo sketch), tutto il resto va bene da default di Linux.

scusate l'enorme ritardo, ho avuto dei problemi.. :confused:

<?php
 header("Access-Control-Allow-Origin: *");
error_reporting(E_ALL); ini_set('display_errors', '1');
exec("stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts");
exec("stty -F /dev/ttyACM1 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts");

if($_GET['s']==0) {
exec("echo -n 0 > /dev/ttyACM1");
exec("echo -n 0 > /dev/ttyACM0");
}
else {
exec("echo -n 1 > /dev/ttyACM1");
exec("echo -n 1 > /dev/ttyACM0");
}

?>

questo scriptino php non funziona se prima non ho aperto manualmente il monitor seriale da Arduino IDE.

[la duplicazione dei comandi per i due dev è per evitare che scollegare e ricollegare arduino - e quindi assegnare un nuovo id alla periferica - faccia saltare il tutto]

Oggi ho scoperto che in alternativa dare

jpnevulator --ascii --timing-print --tty /dev/ttyACM0:SB9600d --read

dal terminale ha lo stesso effetto di aprire il monitor seriale.

Che posso fare?

Usare una marea di exec() da PHP per parlare con la porta seriale è a dir poco orribile. Almeno le scritture potresti rimpiazzarle con delle normali scritture su file.

Ma c'è almeno una libreria per implementare degnamente la comunicazione seriale da PHP: GitHub - Xowap/PHP-Serial: Multi-platform convenience class to access the serial port from PHP.

Se poi funzioni non lo so :D.

SukkoPera:
Usare una marea di exec() da PHP per parlare con la porta seriale è a dir poco orribile. Almeno le scritture potresti rimpiazzarle con delle normali scritture su file.

Ma c'è almeno una libreria per implementare degnamente la comunicazione seriale da PHP: GitHub - Xowap/PHP-Serial: Multi-platform convenience class to access the serial port from PHP.

Se poi funzioni non lo so :D.

Inutile dire che lo stesso identico problema ce l'ho dando quei comandi da terminale :o
il problema non è php >:(

Infatti non ho detto che il problema è PHP, ho detto che è brutto fare le cose in quel modo, ma ciò non ha direttamente a che fare col tuo problema :).

Però usare la libreria potrebbe aiutare, magari basta aprire la porta in lettura.

da terminale dai i seguenti comandi

stty -F /dev/ttyACM0 cs8 9600 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts

echo $?

posta qui quello che ottieni

non è capitato a nessuno?

A me, ma un milione di anni fa, cioè all'epoca di arduino 2009. Ora come ho risolto non me lo ricordo, il forum dovrebbe contenere come ho risolto, ma non lo trovo.

A memoria (ricordo qualcosa vagamente) ricordo che coinvolto il bootloader, poi io l'ho eliminato perché per programmare il chip uso avrispmkII; proverò ancora a cercare sul fourm per un pò.

Ciao.

Per adesso ho trovato solo questo: Strano comportamento seriale - Software - Arduino Forum

Ho trovato quel link (e altri) cercando con google : "maurotec /dev/ttyUSB0 site:http://forum.arduino.cc"; senza apici

Ma non è che facendo delle scritture singole, tramite riga di comando, viene riavviato l'arduino tramite il boot loader?
Il convertitore usb seriale fatto con l'U2 usa i segnali di handshake per resettare il 32
Bisogna vedere cosa combina il kernel quando si apre e chiude la porta al volo, se cambia lo stato di rts/cts e pin vari resetta l'arduino e lo sketch non riceve i comandi perché è in esecuzione il bootloader.
Per le prove consiglio minicom preconfigurato senza handshake hardware (senza nessun handshake).
Appena installato sulla mia suse minicom ha l'handshake hardware attivato di default e manco trasmette/riceve i caratteri se ci sono solo i pin tx/rx collegati.
Poi aggiungere all'inizio dello schetch il codice per accendere un led per un secondo e poi spegnerlo appena dopo il reset.
Così si vede bene se viene resettato l'arduino.

In teoria -crtscts dovrebbe prevenire il reset. Però in effetti converrebbe aggiungere anche -cdtrdsr, mi era sfuggito che mancasse.

Mi sa che usa il dtr

da Arduino-usbserial.c

void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
{
	bool CurrentDTRState = (CDCInterfaceInfo->State.ControlLineStates.HostToDevice & CDC_CONTROL_LINE_OUT_DTR);

	if (CurrentDTRState)
	  AVR_RESET_LINE_PORT &= ~AVR_RESET_LINE_MASK;
	else
	  AVR_RESET_LINE_PORT |= AVR_RESET_LINE_MASK;
}