test porta seriale

sto testando la porta seriale, con arduino uno, versione 1 con questo esempio.

da linea di comando, funziona se eseguo in successione queste due istruzioni:

$ head -n 10 </dev/arduino
$ echo 1234567890 >/dev/arduino

se però cerco di accodare in pipe i due comandi di bash, come accade all’interno di uno script:

$ head -n 10</dev/arduino & echo 1234567890 >/dev/arduino

osservo dei comportamenti non del tutto prevedibili.
in questo caso, infatti, capita spesso che il comando echo non viene ricevuto e il comando head resta appeso, in attesa di un head successivo.
evidentemente, esiste un ritardo tra head e echo che non è gestito correttamente.

un modo, che però a me sembra goffo e poco pulito di affrontare il problema è quello di ripetere echo ad oltranza, come in questo script:

#!/bin/bash

stringa=$1
count=0
head -n"${#stringa}" </dev/arduino &
headPid=$!
#ripetizione ad oltranza
while ( $(ps -p $headPid -o stat|grep -v STAT -qs ) );do {
        echo $((count+=1))
        echo $stringa > /dev/arduino
}
done

cosa si può fare di meglio, usando bash o correggendo lo sketch?

Non so molto di bash ma la pipe è |, non &
Al max conosco poi && per far eseguire il secondo comando dopo che è terminato il primo.

forse ho trovato il modo giusto.

sono stato costretto a usare il comando exec, di cui fino ad ora non capivo il funzionamento.
questo mini script di esempio illustra la soluzione:

#!/bin/bash

exec 5<> /dev/arduino
stringa="$1"
echo "aspetto un po'"
sleep 5

echo "adesso provo"
for i in 1 2 3; do {
        head -n3 <&5 & echo -e "${stringa} $i" >&5
        }
done
exec 5<&-

aggiungo anche di avere fatto una prova con le pipe, ma non risolvevo il problema dei ritardi.