Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2015-05-29T15:34:53+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Perte d'octets, message #588762015-05-29T15:34:53+02:00Emmflo/@Emmflohttps://zestedesavoir.com/forums/sujet/3284/perte-doctets/?page=1#p58876<p>Bonjour,</p>
<p>Depuis quelques jours j’affronte quelques problèmes de communication série entre un Atmega328 et mon PC si bien que j'ai décidé de faire le test qui me semble le plus simple pour vérifier cela : un simple programme "loopback" sur l'Atmega.</p>
<p>J'ai donc d'un côté un Atmega328 qui tourne avec le code affiché ci-après, et de l'autre côté l'adaptateur USB<->série présent sur ma vielle carte "Arudino UNO" (non peuplé par son propre Atmega), un Atmega8U2. De plus j'utilise pour ces tests un très petit bitrate (1200bit/s) afin d'écarter les problèmes d'imprécisions de l'horloge interne.</p>
<p>Le code :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32</pre></div></td><td class="code"><div class="codehilite"><pre><span class="cp">#define F_CPU 8000000</span>
<span class="cp">#include <avr/io.h></span>
<span class="cp">#include <avr/interrupt.h></span>
<span class="cp">#define USART_BAUDRATE 1200</span>
<span class="cp">#define BAUD_PRESCALE (((( F_CPU / 16) + ( USART_BAUDRATE / 2) ) / ( USART_BAUDRATE ) ) - 1)</span>
<span class="k">typedef</span> <span class="kt">uint8_t</span> <span class="n">u8</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">uint16_t</span> <span class="n">u16</span><span class="p">;</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">UCSR0B</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">RXEN0</span><span class="p">)</span><span class="o">|</span><span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">TXEN0</span><span class="p">);</span>
<span class="n">UCSR0C</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="o"><<</span><span class="n">USBS0</span><span class="p">)</span><span class="o">|</span><span class="p">(</span><span class="mi">3</span><span class="o"><<</span><span class="n">UCSZ00</span><span class="p">);</span>
<span class="n">UBRR0H</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">char</span><span class="p">)(</span><span class="n">BAUD_PRESCALE</span><span class="o">>></span><span class="mi">8</span><span class="p">);</span>
<span class="n">UBRR0L</span> <span class="o">=</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">char</span><span class="p">)</span><span class="n">BAUD_PRESCALE</span><span class="p">;</span>
<span class="n">UCSR0B</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1</span> <span class="o"><<</span> <span class="n">RXCIE0</span><span class="p">);</span>
<span class="n">sei</span><span class="p">();</span>
<span class="k">while</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{}</span>
<span class="p">}</span>
<span class="n">ISR</span><span class="p">(</span><span class="n">USART_RX_vect</span><span class="p">,</span> <span class="n">ISR_BLOCK</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">u8</span> <span class="n">received_byte</span><span class="p">;</span>
<span class="n">received_byte</span> <span class="o">=</span> <span class="n">UDR0</span><span class="p">;</span>
<span class="n">UDR0</span> <span class="o">=</span> <span class="n">received_byte</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</td></tr></table>
<p>Du côté du python j'utilise la bibiothèque "serial".
Lorsque je teste l'envoi de bits individuels je ne perd rien :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16</pre></div></td><td class="code"><div class="codehilite"><pre><span class="n">ser</span> <span class="o">=</span> <span class="n">serial</span><span class="o">.</span><span class="n">Serial</span><span class="p">(</span><span class="s">"/dev/ttyACM0"</span><span class="p">,</span> <span class="mi">1200</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">ok</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">ko</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">nb_bytes</span><span class="p">):</span>
<span class="n">char</span> <span class="o">=</span> <span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">)</span>
<span class="n">ser</span><span class="o">.</span><span class="n">write</span><span class="p">([</span><span class="n">char</span><span class="p">])</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">ser</span><span class="o">.</span><span class="n">read</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="n">char</span><span class="p">:</span>
<span class="n">ok</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">ko</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">print</span><span class="p">(</span><span class="s">"nb_chars = {}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">nb_bytes</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">"ok = {}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ok</span><span class="p">))</span>
<span class="k">print</span><span class="p">(</span><span class="s">"ko = {}"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ko</span><span class="p">))</span>
</pre></div>
</td></tr></table>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4</pre></div></td><td class="code"><div class="codehilite"><pre><span class="o">>>></span> <span class="n">test3</span><span class="o">.</span><span class="n">test_indiv</span><span class="p">(</span><span class="mi">100</span><span class="p">)</span>
<span class="n">nb_chars</span> <span class="o">=</span> <span class="mi">100</span>
<span class="n">ok</span> <span class="o">=</span> <span class="mi">100</span>
<span class="n">ko</span> <span class="o">=</span> <span class="mi">0</span>
</pre></div>
</td></tr></table>
<p>En revanche quand j'envoie directement "un paquet" de plusieurs octets, certains n'arrivent pas (ou ne reviennent pas en tout cas) de manière semble-t-il aléatoire:</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11</pre></div></td><td class="code"><div class="codehilite"><pre><span class="o">>>></span> <span class="n">ser</span> <span class="o">=</span> <span class="n">serial</span><span class="o">.</span><span class="n">Serial</span><span class="p">(</span><span class="s">'/dev/ttyACM0'</span><span class="p">,</span> <span class="mi">1200</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="o">>>></span> <span class="n">data</span> <span class="o">=</span> <span class="p">[</span><span class="n">random</span><span class="o">.</span><span class="n">randint</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">255</span><span class="p">)</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">100</span><span class="p">)]</span>
<span class="o">>>></span> <span class="n">ser</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
<span class="mi">100</span>
<span class="o">>>></span> <span class="n">data2</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">ser</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">100</span><span class="p">))</span>
<span class="o">>>></span> <span class="n">data</span>
<span class="p">[</span><span class="mi">178</span><span class="p">,</span> <span class="mi">193</span><span class="p">,</span> <span class="mi">217</span><span class="p">,</span> <span class="mi">98</span><span class="p">,</span> <span class="mi">243</span><span class="p">,</span> <span class="mi">147</span><span class="p">,</span> <span class="mi">153</span><span class="p">,</span> <span class="mi">73</span><span class="p">,</span> <span class="mi">191</span><span class="p">,</span> <span class="mi">191</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">190</span><span class="p">,</span> <span class="mi">141</span><span class="p">,</span> <span class="mi">94</span><span class="p">,</span> <span class="mi">133</span><span class="p">,</span> <span class="mi">121</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">56</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">139</span><span class="p">,</span> <span class="mi">77</span><span class="p">,</span> <span class="mi">211</span><span class="p">,</span> <span class="mi">56</span><span class="p">,</span> <span class="mi">216</span><span class="p">,</span> <span class="mi">182</span><span class="p">,</span> <span class="mi">159</span><span class="p">,</span> <span class="mi">201</span><span class="p">,</span> <span class="mi">156</span><span class="p">,</span> <span class="mi">235</span><span class="p">,</span> <span class="mi">96</span><span class="p">,</span> <span class="mi">144</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">73</span><span class="p">,</span> <span class="mi">216</span><span class="p">,</span> <span class="mi">196</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">201</span><span class="p">,</span> <span class="mi">183</span><span class="p">,</span> <span class="mi">204</span><span class="p">,</span> <span class="mi">212</span><span class="p">,</span> <span class="mi">145</span><span class="p">,</span> <span class="mi">182</span><span class="p">,</span> <span class="mi">59</span><span class="p">,</span> <span class="mi">186</span><span class="p">,</span> <span class="mi">191</span><span class="p">,</span> <span class="mi">191</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="mi">161</span><span class="p">,</span> <span class="mi">252</span><span class="p">,</span> <span class="mi">103</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">177</span><span class="p">,</span> <span class="mi">204</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">205</span><span class="p">,</span> <span class="mi">245</span><span class="p">,</span> <span class="mi">51</span><span class="p">,</span> <span class="mi">59</span><span class="p">,</span> <span class="mi">83</span><span class="p">,</span> <span class="mi">136</span><span class="p">,</span> <span class="mi">105</span><span class="p">,</span> <span class="mi">224</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="mi">116</span><span class="p">,</span> <span class="mi">98</span><span class="p">,</span> <span class="mi">199</span><span class="p">,</span> <span class="mi">79</span><span class="p">,</span> <span class="mi">240</span><span class="p">,</span> <span class="mi">52</span><span class="p">,</span> <span class="mi">224</span><span class="p">,</span> <span class="mi">78</span><span class="p">,</span> <span class="mi">92</span><span class="p">,</span> <span class="mi">178</span><span class="p">,</span> <span class="mi">122</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="mi">184</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="mi">83</span><span class="p">,</span> <span class="mi">190</span><span class="p">,</span> <span class="mi">197</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">235</span><span class="p">,</span> <span class="mi">147</span><span class="p">,</span> <span class="mi">58</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">80</span><span class="p">,</span> <span class="mi">248</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">224</span><span class="p">,</span> <span class="mi">146</span><span class="p">,</span> <span class="mi">225</span><span class="p">,</span> <span class="mi">158</span><span class="p">,</span> <span class="mi">72</span><span class="p">,</span> <span class="mi">70</span><span class="p">,</span> <span class="mi">118</span><span class="p">]</span>
<span class="o">>>></span> <span class="n">data2</span>
<span class="p">[</span><span class="mi">178</span><span class="p">,</span> <span class="mi">193</span><span class="p">,</span> <span class="mi">217</span><span class="p">,</span> <span class="mi">98</span><span class="p">,</span> <span class="mi">243</span><span class="p">,</span> <span class="mi">147</span><span class="p">,</span> <span class="mi">153</span><span class="p">,</span> <span class="mi">73</span><span class="p">,</span> <span class="mi">191</span><span class="p">,</span> <span class="mi">191</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">190</span><span class="p">,</span> <span class="mi">94</span><span class="p">,</span> <span class="mi">133</span><span class="p">,</span> <span class="mi">121</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">56</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">139</span><span class="p">,</span> <span class="mi">77</span><span class="p">,</span> <span class="mi">211</span><span class="p">,</span> <span class="mi">216</span><span class="p">,</span> <span class="mi">182</span><span class="p">,</span> <span class="mi">159</span><span class="p">,</span> <span class="mi">201</span><span class="p">,</span> <span class="mi">156</span><span class="p">,</span> <span class="mi">235</span><span class="p">,</span> <span class="mi">96</span><span class="p">,</span> <span class="mi">144</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">73</span><span class="p">,</span> <span class="mi">196</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">201</span><span class="p">,</span> <span class="mi">183</span><span class="p">,</span> <span class="mi">204</span><span class="p">,</span> <span class="mi">212</span><span class="p">,</span> <span class="mi">145</span><span class="p">,</span> <span class="mi">182</span><span class="p">,</span> <span class="mi">59</span><span class="p">,</span> <span class="mi">186</span><span class="p">,</span> <span class="mi">191</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="mi">161</span><span class="p">,</span> <span class="mi">252</span><span class="p">,</span> <span class="mi">103</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">177</span><span class="p">,</span> <span class="mi">204</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">205</span><span class="p">,</span> <span class="mi">245</span><span class="p">,</span> <span class="mi">59</span><span class="p">,</span> <span class="mi">83</span><span class="p">,</span> <span class="mi">136</span><span class="p">,</span> <span class="mi">105</span><span class="p">,</span> <span class="mi">224</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="mi">116</span><span class="p">,</span> <span class="mi">98</span><span class="p">,</span> <span class="mi">199</span><span class="p">,</span> <span class="mi">240</span><span class="p">,</span> <span class="mi">52</span><span class="p">,</span> <span class="mi">224</span><span class="p">,</span> <span class="mi">78</span><span class="p">,</span> <span class="mi">92</span><span class="p">,</span> <span class="mi">178</span><span class="p">,</span> <span class="mi">122</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="mi">184</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="mi">83</span><span class="p">,</span> <span class="mi">190</span><span class="p">,</span> <span class="mi">197</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">235</span><span class="p">,</span> <span class="mi">147</span><span class="p">,</span> <span class="mi">58</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">80</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">224</span><span class="p">,</span> <span class="mi">146</span><span class="p">,</span> <span class="mi">225</span><span class="p">,</span> <span class="mi">158</span><span class="p">,</span> <span class="mi">72</span><span class="p">,</span> <span class="mi">70</span><span class="p">,</span> <span class="mi">118</span><span class="p">]</span>
<span class="o">>>></span> <span class="n">data</span> <span class="o">==</span> <span class="n">data2</span>
<span class="bp">False</span>
</pre></div>
</td></tr></table>
<p>On pourrait supposer que le problème provienne d'un dépassement de buffer quelque part (sur l'adaptateur USB<->série ?), sauf que dans ce cas comment expliquer le placement random des manques (dans cet exemple le premier octet manquant est le 13ème) ?</p>
<p>L’imprécision de l'horloge parait être une éventualité mais… à ce faible bitrate ?<br>
Est-ce que la lib python envoie "trop vite" pleins d'octets et le micro n'a "pas le temps" de suivre ? Ça parait curieux.</p>
<p>En tout cas quand les octets sont envoyés individuellement c'est vraiment lent.</p>
<p>Voilà, si quelqu'un a une piste je suis preneur <img alt=":)" src="/static/smileys/smile.png"><br>
Merci d'avance<br>
Emmflo</p>
<p>EDIT: En fait je suis un débile, j'avais pas le bon format de frame série.</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1</pre></div></td><td class="code"><div class="codehilite"><pre><span class="o">>>></span> <span class="n">ser</span> <span class="o">=</span> <span class="n">serial</span><span class="o">.</span><span class="n">Serial</span><span class="p">(</span><span class="s">'/dev/ttyACM2'</span><span class="p">,</span> <span class="mi">9600</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">bytesize</span><span class="o">=</span><span class="mi">8</span><span class="p">,</span> <span class="n">stopbits</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
</pre></div>
</td></tr></table>
<p>Et pouf tout va mieux. Donc oui pour ceux qui ne le savaient pas (comme moi :> Même si en fait c'est logique…) ça peut marcher à moitié si on met pas le bon format :></p>