DD2-monitor/doc/serial.tex

91 lines
3.1 KiB
TeX

% ===================================================================
\section{Serial coms} \index{serial} \label{serial}
Il va y avoir deux liaisons série entre l'automate et le monitoring.
La première, que nous allons juste entrevoir, passera par le port
USB de la carte Arduino. La seconde passera par un port série
auxiliaire\footnote{Il y en a 4 sur le mega 2560} de celle-ci.
% -------------------------------------------------------------------
\subsection{Un gros souci}
\begin{lstlisting}
tcgetattr(uart0, &options);
options.c_cflag = baudbits | CS8 | CLOCAL | CREAD;
options.c_iflag = IGNPAR;
options.c_oflag = 0;
options.c_lflag = 0;
tcflush(uart0, TCIFLUSH);
tcsetattr(uart0, TCSANOW, &options);
\end{lstlisting}
Et en fait, le \texttt{read} sur le \textsl{fd} du serial device
n'est pas bloquant, \texttt{perror} annonce \emph{success}, mais
rien ne marche. L'année 2019 va commencer sur du vaudou programming%
\footnote {aka shotgun debugging.}.
\textit{29 décembre 2018} : le petit grain de magie\index{magie}
est très simple à mettre en oeuvre, mais
très difficle à spotter dans le gazillion d'options. Il semblerait
que mettre \texttt{options.c\_cc[VMIN]} à 1 permet d'avancer vers
l'étape suivante.
Laquelle étape est une tentative d'utilisation de \texttt{select(2)},
dans l'objectif de pouvoir gérer nous-même le \textit{timeout},
laquelle tentative n'est pas du tout concluante.
% -------------------------------------------------------------------
\subsection{Hardware} \index{hardware} \label{hardware}
Plusieurs soucis, dont l'un qui se règle à moitié avec une règle
\texttt{udev}\index{udev}.
D'abord, la commutation on/off du frigo provoque une perte de
la connection serial/usb.
Ensuite, ce phénomène suggère au pécé de changer de \textsl{device},
et de passer de \texttt{/dev/ttyACM0} à \texttt{ACM1} quasiment
à chaque fois. D'ou plein de désagréments. C'estlà qi'intervient
la règle \texttt{udev}\index{udev} :
\begin{verbatim}
SUBSYSTEM=="tty" ATTRS{idVendor}=="2341"
ATTRS{idProduct}=="0042" SYMLINK+="phytotron"
\end{verbatim}
Le tout sur une ligne et dans le fichier
\texttt{/etc/udev/rules.d/72-mega-phytotron.rules}.
En général une erreur de syntaxe apparait dans
\textit{varlogmessage}.
Heureusement, j'ai un plan \textbf{B} sous la main.
% -------------------------------------------------------------------
\subsection{Protocole} \index{protocole} \label{serialprotocol}
L'automate va avoir plusieurs types de données à envoyer.
Nous allons donc transférer ces valeurs sous forme de ligne
de texte commençant par un caractère clef
(par exemple \texttt{T} pour les températures)
et se terminant par un \textit{newline}.
% -------------------------------------------------------------------
\subsection{Un peu de code} \label{serialcode}
\begin{lstlisting}
main()
{
while(fork());
}
\end{lstlisting}
% -------------------------------------------------------------------
\subsection{Terminal}\label{terminal}\index{terminal}
Bizarrement, on dirait que, en fait, \texttt{select(2)} fonctionne comme
il est supposé le faire depuis l'epoch\dots
% ===================================================================