<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=3693&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-07-28T22:48:54+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=3693&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-07-28T21:22:06+01:00</updated>
<published>2013-07-28T21:22:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43780#p43780</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43780#p43780"/>
<title type="html"><![CDATA[Re: Pytanie o zależności pomiędzy libsami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43780#p43780"><![CDATA[
Nie musisz z tego korzystać w swoim projekcie, ale warto wiedzieć. Twój podpis zobowiązuje.<br />A wracając do tematu to zrobisz to na funkcjach zwrotnych (callback) ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 28 lip 2013, o 21:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-07-28T22:48:54+01:00</updated>
<published>2013-07-28T21:02:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43767#p43767</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43767#p43767"/>
<title type="html"><![CDATA[Re: Pytanie o zależności pomiędzy libsami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43767#p43767"><![CDATA[
W końcu przerobiłem bibliotekę Antystatycznego. Mam nadzieję, że niczego nie popsułem  <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /> Pliki uart.c i uart.h tylko leciutko zmodyfikowane przy użyciu <em>#ifdef</em>, aby zmniejszyć rozmiar kodu.<br />Wyniki:<br />- bez użycia strumieni:<br />Program:    2320 bytes (3.5% Full)<br />(.text + .data + .bootloader)<br />Data:        114 bytes (2.8% Full)<br />(.data + .bss + .noinit)<br /><br />- przy wykorzystaniu strumieni:<br />Program:    4056 bytes (6.2% Full)<br />(.text + .data + .bootloader)<br />Data:        168 bytes (4.1% Full)<br />(.data + .bss + .noinit)<br />Pliki:<br />-main.c:<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *      Author: Antystatyczny<br /> *      Mod: Krauser<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &quot;uart.h&quot;<br />#include &lt;stdio.h&gt;<br />#include &lt;string.h&gt;<br /><br /><br />#if USE_STREAM == 1<br />#if (USART_NUMBER==0)||(USART_NUMBER==2)<br />char work_buffer0&#91;RX0_BUFFER_SIZE&#93;;<br />int my_putchar0(char data, FILE *stream) //przerobienie funkcji<br />{<br />uart_put_char(0, data);<br />return 0;<br />}<br />int my_getchar0(FILE *stream) //przerobienie funkcji<br />{<br />return uart_get_char(0);<br />}<br />//zdefiniowanie strumieni<br />FILE my_stream0 = FDEV_SETUP_STREAM (my_putchar0, my_getchar0, _FDEV_SETUP_RW);<br />#endif<br /><br />#if (USART_NUMBER==1)||(USART_NUMBER==2)<br />char work_buffer1&#91;RX1_BUFFER_SIZE&#93;;<br />int my_putchar1(char data, FILE *stream) //przerobienie funkcji<br />{<br />uart_put_char(1, data);<br />return 0;<br />}<br />int my_getchar1(FILE *stream) //przerobienie funkcji<br />{<br />return uart_get_char(1);<br />}<br />//zdefiniowanie strumieni<br />FILE my_stream1 = FDEV_SETUP_STREAM (my_putchar1, my_getchar1, _FDEV_SETUP_RW);<br />#endif<br />#else<br />char work_buffer0&#91;RX0_BUFFER_SIZE&#93;;<br />char work_buffer1&#91;RX1_BUFFER_SIZE&#93;;<br />#endif<br /><br />int main(void)<br />{<br />#if (USART_NUMBER==0)||(USART_NUMBER==2)<br />uart_init(0, __UBRR0);<br />#endif<br />#if (USART_NUMBER==1)||(USART_NUMBER==2)<br />uart_init(1, __UBRR1);<br />#endif<br />sei();<br />/* test funkcji */<br />#if USE_STREAM == 1<br />#if (USART_NUMBER==0)||(USART_NUMBER==2)<br /><br />fputs(&quot;\r\nS&quot;, &amp;my_stream0);<br />stdout = &amp;my_stream0; //przekierowanie strumienia<br />puts(&quot;TART\r&quot;);<br />puts_P(PSTR (&quot;USART0\r&quot;));<br />printf(&quot;decimal=%d\r\n&quot;, -12345);<br />printf_P(PSTR(&quot;hex=%x\r\n&quot;), 0xABcd);<br />#endif<br />#if (USART_NUMBER==1)||(USART_NUMBER==2)<br /><br />fputs(&quot;\r\nST&quot;, &amp;my_stream1);<br />stdout = &amp;my_stream1; //przekierowanie strumienia<br />puts(&quot;ART\r&quot;);<br />puts_P(PSTR (&quot;USART1\r&quot;));<br />printf(&quot;decimal=%d\r\n&quot;, 6789);<br />printf_P(PSTR(&quot;hex=%X\r\n&quot;), 0xef01);<br />#endif<br /><br />while(1)<br />{<br />#if (USART_NUMBER==2)<br />//pobierz ze strumienia 1<br />if( strlen(fgets( work_buffer1, sizeof(work_buffer1)-1, &amp;my_stream1)) )<br />{<br />fputs(work_buffer1, &amp;my_stream0);//wyślij do strumienia 0<br />}<br />//pobierz ze strumienia 0<br />if( strlen(fgets( work_buffer0, sizeof(work_buffer0)-1, &amp;my_stream0)) )<br />{<br />fputs(work_buffer0, &amp;my_stream1); //wyślij do strumienia 1<br />}<br />#endif<br />#if (USART_NUMBER==0)<br />if( strlen(fgets( work_buffer0, sizeof(work_buffer0)-1, &amp;my_stream0)) )<br />{<br />fputs(work_buffer0, &amp;my_stream0);<br />}<br />#endif<br />#if (USART_NUMBER==1)<br />if( strlen(fgets( work_buffer1, sizeof(work_buffer1)-1, &amp;my_stream1)) )<br />{<br />fputs(work_buffer1, &amp;my_stream1);<br />}<br />#endif<br /><br />_delay_ms(100);<br />}<br />#else<br />#if (USART_NUMBER==0)||(USART_NUMBER==2)<br />uart_put_char(0, 'S');<br />uart_put_string(0,&quot;TART\r\n&quot;);<br />uart_put_string_P(0,PSTR(&quot;USART0\r\n&quot;));<br />uart_put_int(0,-12345);<br />uart_put_hex(0,0xABCD);<br />#endif<br />#if (USART_NUMBER==1)||(USART_NUMBER==2)<br />uart_put_char(1, 'S');<br />uart_put_string(1,&quot;TART\r\n&quot;);<br />uart_put_string_P(1,PSTR(&quot;USART1\r\n&quot;));<br />uart_put_int(1,6789);<br />uart_put_hex(1,0xEF01);<br />#endif<br /><br /><br />while (1) {<br />#if (USART_NUMBER==0)<br />uart_get_string(0, work_buffer0);<br />uart_put_string(0, work_buffer0);<br />#elif (USART_NUMBER==1)<br />uart_get_string(1, work_buffer1);<br />uart_put_string(1, work_buffer1);<br />#else<br />uart_get_string(0, work_buffer0);<br />uart_put_string(1, work_buffer0);<br /><br />uart_get_string(1, work_buffer1);<br />uart_put_string(0, work_buffer1);<br />#endif<br />_delay_ms(100);<br />}<br />#endif<br />}[/syntax]<br />-uart.h:<br />[syntax=c]/*<br /> * uart.h<br />*<br /> *      Author: Antystatyczny<br /> *      Mod: Krauser<br /> */<br /><br />#ifndef UART_H_<br />#define UART_H_<br /><br />/************************************************************************************<br /> *                                                      Compilation options                                                                             *<br /> ************************************************************************************/<br />/************************************************************************************<br /> * Enable/disable stream<br /> * 0 - Disabled                                                                                                                                         *<br /> * 1 - Enabled                                                                                                                                          *<br /> *///<br />#define USE_STREAM 1<br />/************************************************************************************/<br />#if USE_STREAM == 0<br />/************************************************************************************<br /> * Enable/disable transmitting strings from flash memory                                                        *<br /> * 0 - Disabled                                                                                                                                         *<br /> * 1 - Enabled                                                                                                                                          *<br /> *///                                                                                                                                                           *<br />#define USE_PROGMEM     1                                                                                                                       //  *<br />//***********************************************************************************<br /><br /><br />/************************************************************************************<br /> * Enable/disable transmitting integers in decimal format (ASCII transmission)          *<br /> * 0 - Disabled                                                                                                                                         *<br /> * 1 - Enabled                                                                                                                                          *<br /> * By disabling this function you can save ca. 200 bytes of flash.                                      *<br /> *///                                                                                                                                                           *<br />#define USE_INT 1                                                                                                                               //      *<br />//***********************************************************************************<br /><br /><br />/************************************************************************************<br /> * Enable/disable transmitting integers in hexadecimal format (ASCII transmission)      *<br /> * 0 - Disabled                                                                                                                                         *<br /> * 1 - Enabled                                                                                                                                          *<br /> * By disabling this function you can save ca. 200 bytes of flash.                                      *<br /> *///                                                                                                                                                           *<br />#define USE_HEX 1                                                                                                                               //  *<br />//***********************************************************************************<br /><br />/************************************************************************************<br /> * Enable/disable string transmitting                                                                                                      *<br /> * 0 - Disabled                                                                                                                                         *<br /> * 1 - Enabled                                                                                                                                          *<br /> *///                                                                                                                                                           *<br />#define USE_PUT_STRING 1                                                                                                                //      *<br />//***********************************************************************************<br /><br /><br />/************************************************************************************<br /> * Enable/disable string receiving                                                                                                      *<br /> * 0 - Disabled                                                                                                                                         *<br /> * 1 - Enabled                                                                                                                                          *<br /> *///                                                                                                                                                           *<br />#define USE_GET_STRING 1                                                                                                                //      *<br />//***********************************************************************************<br />#endif //USE_STREAM<br /><br />/************************************************************************************<br /> * In some MCU's like ie. ATmega644 you can use usart0,usart1 or both of them.          *<br /> * Available options:                                                                                                                           *<br /> * 0 - For USART0                                                                                                                                       *<br /> * 1 - For USART1                                                                                                                                       *<br /> * 2 - For USART0 and USART1                                                                                                            *<br /> *///                                                                                                                                                           *<br />#define USART_NUMBER 2                                                                                                                  //      *<br />//***********************************************************************************<br /><br /><br />/************************* Buffers and speeds ***************************************<br /> * Below you can change size of usart buffers                                                                           *<br /> * Available sizes: 4, 8, 16, 32, 64, 128, 256 bytes.                                                           *<br /> ************************************************************************************/<br />#if(USART_NUMBER==0)||(USART_NUMBER==2)<br />/************************************************************************************<br /> *                                                      USART0 receiver                                                                                 *<br /> ************************************************************************************/<br />#define RX0_BUFFER_SIZE 16<br />#define RX0_BUFFER_MASK (RX0_BUFFER_SIZE-1)//do not change<br /><br /><br />/************************************************************************************<br /> *                                                      USART0 transmitter                                                                              *<br /> ************************************************************************************/<br />#define TX0_BUFFER_SIZE 16<br />#define TX0_BUFFER_MASK (TX0_BUFFER_SIZE-1)//do not change<br /><br /><br />/************************************************************************************<br /> *                                                      Define USART0 speed                                                                             *<br /> ************************************************************************************/<br />#define USART0_BAUD 115200<br />#define __UBRR0 ((F_CPU+USART0_BAUD*8UL) / (16UL*USART0_BAUD)-1)//do not change<br />#endif//USART_NUMBER<br /><br /><br />#if(USART_NUMBER==1)||(USART_NUMBER==2)<br />/************************************************************************************<br /> *                                                      USART1 receiver                                                                                 *<br /> ************************************************************************************/<br />#define RX1_BUFFER_SIZE 16<br />#define RX1_BUFFER_MASK (RX1_BUFFER_SIZE-1)//do not change<br /><br /><br />/************************************************************************************<br /> *                                                      USART1 transmitter                                                                              *<br /> ************************************************************************************/<br />#define TX1_BUFFER_SIZE 16<br />#define TX1_BUFFER_MASK (TX1_BUFFER_SIZE-1)//do not change<br /><br /><br />/************************************************************************************<br /> *                                                      Define USART1 speed                                                                             *<br /> ************************************************************************************/<br />#define USART1_BAUD 115200<br />#define __UBRR1 ((F_CPU+USART1_BAUD*8UL) / (16UL*USART1_BAUD)-1)//do not change<br />#endif//USART_NUMBER<br /><br /><br />/************************************************************************************<br /> *                                                      Transmitter functions                                                                   *<br /> ************************************************************************************/<br />void uart_init(uint8_t usart_nr, uint16_t speed);<br />void uart_put_char(uint8_t usart_nr, char data);<br /><br />#if USE_PUT_STRING == 1<br />void uart_put_string(uint8_t usart_nr, char * string);<br />#endif //USE_PUT_STRING<br /><br />#if USE_PROGMEM == 1<br />void uart_put_string_P(uint8_t usart_nr, const char *string);<br />#endif //USE_PROGMEM<br /><br />#if USE_INT == 1<br />void uart_put_int(uint8_t usart_nr, int16_t data);<br />#endif//USE_INT<br /><br />#if USE_HEX == 1<br />void uart_put_hex(uint8_t usart_nr, int16_t data);<br />#endif//USE_HEX<br /><br /><br />/************************************************************************************<br /> *                                                      Receiver functions                                                                              *<br /> ************************************************************************************/<br />char uart_get_char(uint8_t usart_nr);<br /><br />#if USE_GET_STRING == 1<br />void uart_get_string(uint8_t usart_nr, char *buffer);<br />#endif//USE_GET_STRING<br /><br /><br /><br />/************************* MCU dependent section ************************************/<br /><br />#if defined(__AVR_ATtiny2313__)||defined(__AVR_ATtiny2313A__)||defined(__AVR_ATtiny4313)<br />#define RX0_INTERRUPT USART_RX_vect<br />#define TX0_INTERRUPT USART_TX_vect<br />#define UDR0_REGISTER UDR<br />#define UBRR0L_REGISTER UBRRL<br />#define UBRR0H_REGISTER UBRRH<br />#define UCSR0B_REGISTER UCSRB<br />#define TXCIE0_BIT              TXCIE<br />#define RXCIE0_BIT              RXCIE<br />#define TXEN0_BIT               TXEN<br />#define RXEN0_BIT               RXEN<br />#endif<br /><br /><br />#if   defined(__AVR_ATmega48__)||defined(__AVR_ATmega88__)||defined(__AVR_ATmega168__)||defined(__AVR_ATmega328__)<br />#define RX0_INTERRUPT USART_RX_vect<br />#define TX0_INTERRUPT USART_TX_vect<br />#define UDR0_REGISTER UDR0<br />#define UBRR0L_REGISTER UBRR0L<br />#define UBRR0H_REGISTER UBRR0H<br />#define UCSR0B_REGISTER UCSR0B<br />#define TXCIE0_BIT              TXCIE0<br />#define RXCIE0_BIT              RXCIE0<br />#define TXEN0_BIT               TXEN0<br />#define RXEN0_BIT               RXEN0<br />#endif<br /><br />#if defined(__AVR_ATmega8__)||defined(__AVR_ATmega8P__)||defined(__AVR_ATmega16__)||defined(__AVR_ATmega32__)<br />#define RX0_INTERRUPT USART_RXC_vect<br />#define TX0_INTERRUPT USART_TXC_vect<br />#define UDR0_REGISTER UDR<br />#define UBRR0L_REGISTER UBRRL<br />#define UBRR0H_REGISTER UBRRH<br />#define UCSR0B_REGISTER UCSRB<br />#define TXCIE0_BIT              TXCIE<br />#define RXCIE0_BIT              RXCIE<br />#define TXEN0_BIT               TXEN<br />#define RXEN0_BIT               RXEN<br />#endif<br /><br />#if defined(__AVR_ATmega644__)||defined(__AVR_ATmega644P__)||defined(__AVR_ATmega644PA__)\<br />        ||defined(__AVR_ATmega1284P__)||defined(__AVR_ATmega128__)<br />#if(USART_NUMBER==0)||(USART_NUMBER==2)<br />#define RX0_INTERRUPT USART0_RX_vect<br />#define TX0_INTERRUPT USART0_TX_vect<br />#define UDR0_REGISTER UDR0<br />#define UBRR0L_REGISTER UBRR0L<br />#define UBRR0H_REGISTER UBRR0H<br />#define UCSR0B_REGISTER UCSR0B<br />#define TXCIE0_BIT              TXCIE0<br />#define RXCIE0_BIT              RXCIE0<br />#define TXEN0_BIT               TXEN0<br />#define RXEN0_BIT               RXEN0<br />#endif//USART_NUMBER<br /><br />#if(USART_NUMBER==1)||(USART_NUMBER==2)<br />#define RX1_INTERRUPT USART1_RX_vect<br />#define TX1_INTERRUPT USART1_TX_vect<br />#define UDR1_REGISTER UDR1<br />#define UBRR1L_REGISTER UBRR1L<br />#define UBRR1H_REGISTER UBRR1H<br />#define UCSR1B_REGISTER UCSR1B<br />#define TXCIE1_BIT              TXCIE1<br />#define RXCIE1_BIT              RXCIE1<br />#define TXEN1_BIT               TXEN1<br />#define RXEN1_BIT               RXEN1<br />#endif//USART_NUMBER<br />#endif//MCU def's<br /><br />#endif /* UART_H_ */[/syntax]<br />-uart.c<br />[syntax=c]/*<br />* uart.c<br />*<br />*      Author: Antystatyczny<br />*<br />*/<br /><br />#include&lt;avr/io.h&gt;<br />#include&lt;avr/interrupt.h&gt;<br />#include&lt;avr/pgmspace.h&gt;<br />#include&lt;stdlib.h&gt;<br />#include&quot;uart.h&quot;<br /><br />/************************ USART0 ************************************/<br />enum {locked, unlocked};<br />#if(USART_NUMBER==0)||(USART_NUMBER==2)<br />volatile uint8_t interrupt_init_semaphore0 = unlocked;<br /><br />volatile uint8_t rx0_first_byte, rx0_last_byte;<br />volatile uint8_t tx0_first_byte, tx0_last_byte;<br /><br />char rx0_buffer&#91;RX0_BUFFER_SIZE&#93;;<br />char tx0_buffer&#91;TX0_BUFFER_SIZE&#93;;<br />#endif//USART_NUMBER<br /><br />/************************ USART1 ************************************/<br />#if(USART_NUMBER==1)||(USART_NUMBER==2)<br />volatile uint8_t interrupt_init_semaphore1 = unlocked;<br /><br />volatile uint8_t rx1_first_byte, rx1_last_byte;<br />volatile uint8_t tx1_first_byte, tx1_last_byte;<br /><br />char rx1_buffer&#91;RX1_BUFFER_SIZE&#93;;<br />char tx1_buffer&#91;TX1_BUFFER_SIZE&#93;;<br />#endif//USART_NUMBER<br /><br /><br />/***************************** Init ********************************/<br />void uart_init(uint8_t usart_nr, uint16_t speed)<br />{<br />#if(USART_NUMBER==0)||(USART_NUMBER==2)<br />        if(usart_nr==0)<br />        {<br />                UBRR0L_REGISTER = (uint8_t) speed;<br />                UBRR0H_REGISTER = (speed&gt;&gt;8);<br />                UCSR0B_REGISTER = (1&lt;&lt;TXCIE0_BIT)|(1&lt;&lt;RXCIE0_BIT)|(1&lt;&lt;TXEN0_BIT)|(1&lt;&lt;RXEN0_BIT);<br />        }<br />#endif//USART_NUMBER<br /><br />#if(USART_NUMBER==1)||(USART_NUMBER==2)<br />        if(usart_nr==1)<br />        {<br />                UBRR1L_REGISTER = (uint8_t) speed;<br />                UBRR1H_REGISTER = (speed&gt;&gt;8);<br />                UCSR1B_REGISTER = (1&lt;&lt;TXCIE1_BIT)|(1&lt;&lt;RXCIE1_BIT)|(1&lt;&lt;TXEN1_BIT)|(1&lt;&lt;RXEN1_BIT);<br />        }<br />#endif//USART_NUMBER<br />}<br /><br />/********************************** TX ****************************/<br />void uart_put_char(uint8_t usart_nr, char data)<br />{<br />#if(USART_NUMBER==0)||(USART_NUMBER==2)<br />        if(usart_nr == 0)<br />        {<br />                tx0_buffer&#91;tx0_last_byte&#93; = data;//pakujemy bajt do bufora<br />                tx0_last_byte = (tx0_last_byte + 1) &amp; TX0_BUFFER_MASK;<br /><br />                while(tx0_first_byte == tx0_last_byte);//niech przerwanie cokolwiek wysle w swiat<br /><br />                if(interrupt_init_semaphore0 == unlocked)<br />                {<br />                        interrupt_init_semaphore0 = locked;<br />                        UDR0_REGISTER = tx0_buffer&#91;tx0_first_byte&#93;;//wywolujemy pierwsze przerwanie<br />                }<br />        }<br />#endif//USART_NUMBER<br /><br />#if(USART_NUMBER==1)||(USART_NUMBER==2)<br />        if(usart_nr == 1)<br />        {<br />                tx1_buffer&#91;tx1_last_byte&#93; = data;//pakujemy bajt do bufora<br />                tx1_last_byte = (tx1_last_byte + 1) &amp; TX1_BUFFER_MASK;<br /><br />                while(tx1_first_byte == tx1_last_byte);//niech przerwanie cokolwiek wysle w swiat<br /><br />                if(interrupt_init_semaphore1 == unlocked)<br />                {<br />                        interrupt_init_semaphore1 = locked;<br />                        UDR1_REGISTER = tx1_buffer&#91;tx1_first_byte&#93;;//wywolujemy pierwsze przerwanie<br />                }<br />        }<br />#endif//USART_NUMBER<br />}<br /><br />#if USE_INT == 1<br />void uart_put_int(uint8_t usart_nr, int16_t data)<br />{<br />        char temp_buffer&#91;7&#93;;//znak wiodacy, 5 bajtow na cyfry oraz NULL<br />        itoa(data, temp_buffer, 10);<br />        switch(usart_nr)<br />        {<br /><br />#if(USART_NUMBER==0)||(USART_NUMBER==2)<br />        case 0:<br />                uart_put_string(0, temp_buffer);<br />                break;<br />#endif//USART_NUMBER<br /><br />#if(USART_NUMBER==1)||(USART_NUMBER==2)<br />        case 1:<br />                uart_put_string(1, temp_buffer);<br />                break;<br />#endif//USART_NUMBER<br /><br />#if(USART_NUMBER==1)||(USART_NUMBER==2)<br />        case 2:<br />                uart_put_string(0, temp_buffer);<br />                uart_put_string(1, temp_buffer);<br />                break;<br />#endif//USART_NUMBER<br />        }<br />}<br />#endif//USE_INT<br /><br />#if USE_HEX == 1<br />void uart_put_hex(uint8_t usart_nr, int16_t data)<br />{<br />        char temp_buffer&#91;6&#93;;//znak wiodacy, 4 bajty na cyfry oraz NULL<br />        itoa(data, temp_buffer, 16);<br />        switch(usart_nr)<br />        {<br /><br />#if(USART_NUMBER==0)||(USART_NUMBER==2)<br />        case 0:<br />                uart_put_string(0, temp_buffer);<br />                break;<br />#endif//USART_NUMBER<br /><br />#if(USART_NUMBER==1)||(USART_NUMBER==2)<br />        case 1:<br />                uart_put_string(1, temp_buffer);<br />                break;<br />#endif//USART_NUMBER<br /><br />#if(USART_NUMBER==1)||(USART_NUMBER==2)<br />        case 2:<br />                uart_put_string(0, temp_buffer);<br />                uart_put_string(1, temp_buffer);<br />                break;<br />#endif//USART_NUMBER<br />        }<br />}<br />#endif//USE_HEX<br />#if USE_PUT_STRING == 1<br />void uart_put_string(uint8_t usart_nr, char *string)<br />{<br />        switch(usart_nr)<br />        {<br />#if(USART_NUMBER==0)||(USART_NUMBER==2)<br />        case 0:<br />                while(*string) uart_put_char(0, *string++);<br />                break;<br />#endif//USART_NUMBER<br /><br />#if(USART_NUMBER==1)||(USART_NUMBER==2)<br />        case 1:<br />                while(*string) uart_put_char(1, *string++);<br />                break;<br />#endif//USART_NUMBER<br /><br />#if(USART_NUMBER==2)<br />        case 2:<br />                while(*string) uart_put_char(0, *string++);<br />                while(*string) uart_put_char(1, *string++);<br />                break;<br />#endif//USART_NUMBER<br />        }<br />}<br />#endif<br />#if USE_PROGMEM == 1<br />void uart_put_string_P(uint8_t usart_nr, const char *string)<br />{<br />        switch(usart_nr)<br />        {<br />#if (USART_NUMBER==0)||(USART_NUMBER==2)<br />        case 0:<br />                while(pgm_read_byte(string)) uart_put_char(0, pgm_read_byte(string++));<br />                break;<br />#endif//USART_NUMBER<br /><br />#if (USART_NUMBER==1)||(USART_NUMBER==2)<br />        case 1:<br />                while(pgm_read_byte(string)) uart_put_char(1, pgm_read_byte(string++));<br />                break;<br />#endif//USART_NUMBER<br /><br />#if (USART_NUMBER==2)<br />        case 2:<br />                while(pgm_read_byte(string)) uart_put_char(0, pgm_read_byte(string++));<br />                while(pgm_read_byte(string)) uart_put_char(1, pgm_read_byte(string++));<br />                break;<br />#endif//USART_NUMBER<br />        }<br />}<br />#endif//USE_PROGMEM<br /><br />/**************************** RX ***********************/<br />char uart_get_char(uint8_t usart_nr)<br />{<br />        register char temp = 0;<br />        switch(usart_nr)<br />        {<br />#if (USART_NUMBER==0)||(USART_NUMBER==2)<br />        case 0:<br />                temp = (rx0_first_byte == rx0_last_byte)?   0:rx0_buffer&#91;rx0_first_byte&#93;;<br />                if(rx0_first_byte != rx0_last_byte) rx0_first_byte = (rx0_first_byte+1) &amp; RX0_BUFFER_MASK;<br />                break;<br />#endif//USART_NUMBER<br /><br />#if (USART_NUMBER==1)||(USART_NUMBER==2)<br />        case 1:<br />                temp = (rx1_first_byte == rx1_last_byte)?   0:rx1_buffer&#91;rx1_first_byte&#93;;<br />                if(rx1_first_byte != rx1_last_byte) rx1_first_byte = (rx1_first_byte+1) &amp; RX1_BUFFER_MASK;<br />                break;<br />#endif//USART_NUMBER<br />        }<br />        return temp;<br />}<br /><br />#if USE_GET_STRING == 1<br />void uart_get_string(uint8_t usart_nr, char *buffer)<br />{<br />        switch(usart_nr)<br />        {<br />#if(USART_NUMBER==0)||(USART_NUMBER==2)<br />        case 0:<br />                do *buffer = uart_get_char(0);<br />                while(*buffer++);<br />                break;<br />#endif//USART_NUMBER<br /><br />#if(USART_NUMBER==1)||(USART_NUMBER==2)<br />        case 1:<br />                do *buffer = uart_get_char(1);<br />                while(*buffer++);<br />                break;<br />#endif//USART_NUMBER<br />        }<br />}<br />#endif//USE_GET_STRING<br /><br />#if(USART_NUMBER==0)||(USART_NUMBER==2)<br /><br />//*************************** Interrupts *************************************<br />ISR(TX0_INTERRUPT)<br />{<br />        tx0_first_byte = (tx0_first_byte + 1) &amp; TX0_BUFFER_MASK;<br />        if(tx0_first_byte != tx0_last_byte)<br />        {<br />                UDR0_REGISTER = tx0_buffer&#91;tx0_first_byte&#93;;<br />        }<br />        else<br />        {<br />                interrupt_init_semaphore0 = unlocked;<br />        }<br />}<br />#endif//USART_NUMBER<br /><br />#if(USART_NUMBER==1)||(USART_NUMBER==2)<br />ISR(TX1_INTERRUPT)<br />{<br />        tx1_first_byte = (tx1_first_byte + 1) &amp; TX1_BUFFER_MASK;<br />        if(tx1_first_byte != tx1_last_byte)<br />        {<br />                UDR1_REGISTER = tx1_buffer&#91;tx1_first_byte&#93;;<br />        }<br />        else<br />        {<br />                interrupt_init_semaphore1 = unlocked;<br />        }<br />}<br />#endif//USART_NUMBER<br /><br />#if(USART_NUMBER==0)||(USART_NUMBER==2)<br />ISR(RX0_INTERRUPT)<br />{<br />        register char rx0_temp;<br /><br />        rx0_temp = UDR0_REGISTER;<br /><br />        if(rx0_first_byte != (rx0_last_byte+1))<br />        {<br />                if((rx0_temp != '\r') &amp;&amp; (rx0_temp != '\n'))<br />                {<br />                        rx0_buffer&#91;rx0_last_byte&#93; = rx0_temp;//txt<br />                        rx0_last_byte = (rx0_last_byte+1) &amp; RX0_BUFFER_MASK;<br />                }<br />                if(rx0_temp == '\r')<br />                {<br />                        rx0_buffer&#91;rx0_last_byte&#93; = 0;//null<br />                        rx0_last_byte = (rx0_last_byte+1) &amp; RX0_BUFFER_MASK;<br />                }<br />        }<br />}<br />#endif//USART_NUMBER<br /><br />#if(USART_NUMBER==1)||(USART_NUMBER==2)<br />ISR(RX1_INTERRUPT)<br />{<br />        register char rx1_temp;<br /><br />        rx1_temp = UDR1_REGISTER;<br /><br />        if(rx1_first_byte != (rx1_last_byte+1))<br />        {<br />                if((rx1_temp != '\r') &amp;&amp; (rx1_temp != '\n'))<br />                {<br />                        rx1_buffer&#91;rx1_last_byte&#93; = rx1_temp;//txt<br />                        rx1_last_byte = (rx1_last_byte+1) &amp; RX1_BUFFER_MASK;<br />                }<br />                if(rx1_temp == '\r')<br />                {<br />                        rx1_buffer&#91;rx1_last_byte&#93; = 0;//null<br />                        rx1_last_byte = (rx1_last_byte+1) &amp; RX1_BUFFER_MASK;<br />                }<br />        }<br />}<br />#endif//USART_NUMBER[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 28 lip 2013, o 21:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2013-07-28T18:28:47+01:00</updated>
<published>2013-07-28T18:28:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43732#p43732</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43732#p43732"/>
<title type="html"><![CDATA[Re: Pytanie o zależności pomiędzy libsami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43732#p43732"><![CDATA[
w zasadzie jeśli robisz pod konkretny model to możesz zrobić wyłuskiwanie danych (rozbić zdania na konkretne informacje gotowe do prezentacji)  jak np  Time_GPS();  position_N(); Position_E();  sat_nr();  itd ...<br /><br />co ułatwi wielu interpretację wysyłanych danych przez GPS <br /><br />bo inaczej niema sensu  .... gdyż i tak wysyła wszystko co potrzeba , a zazwyczaj nas interesuje tylko GGA <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 28 lip 2013, o 18:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2013-07-28T18:21:31+01:00</updated>
<published>2013-07-28T18:21:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43729#p43729</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43729#p43729"/>
<title type="html"><![CDATA[Re: Pytanie o zależności pomiędzy libsami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43729#p43729"><![CDATA[
Jest tylko jedno ALE  Anty <br /><br />GPSY różnych firm znacznie się różnią od siebie nie tyle konstrukcyjnie co wysyłanymi danymi <br /><br />głównie chodzi o to że o ile odbiorniki OEM  co prawda co 1s wysyłają komplet danych w zdaniach NMEA <br />to same zdania np najpopularniejsze GGA  może być różnie zbudowane  i  można nie trafić w dane których się spodziewałeś <br />ponadto jeśli trafisz na odbiornik GPS nie OEM  wymagana jest ręczna inicjalizacja i dane otrzymujesz tylko na żądanie poprzez odpytanie modułu o konkretną informację ....  <br /><br />Więc siła rzeczy libs będzie uwiązany z konkretnym typem lub przynajmniej producentem odbiornika GPS<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 28 lip 2013, o 18:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xbary]]></name></author>
<updated>2013-07-28T17:43:45+01:00</updated>
<published>2013-07-28T17:43:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43724#p43724</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43724#p43724"/>
<title type="html"><![CDATA[Re: Pytanie o zależności pomiędzy libsami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43724#p43724"><![CDATA[
no coś w tym rodzaju , poprostu libs od GPS nie musi nic wiedzieć o uart, wystarczy że dane z uart w przerwaniu albo z bufora będą przekazywane przez funkcje do libsa GPS ... tak ja bym to widział.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=447">xbary</a> — 28 lip 2013, o 17:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xbary]]></name></author>
<updated>2013-07-28T17:11:39+01:00</updated>
<published>2013-07-28T17:11:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43719#p43719</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43719#p43719"/>
<title type="html"><![CDATA[Re: Pytanie o zależności pomiędzy libsami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43719#p43719"><![CDATA[
Anty , może libsa od GPS tak zrobić żeby wywoływał ze swojej struktury w której ma wskaźniki funkcji np obsługi wysłania literki i przyjęnia literki drugiej funkcji ... i to by działało na tej zasadzie że w main.c uruchamiasz uart a do GPS libsa dopisujesz tylko funkcje obsługi zdarzenia z gps o wysłanie literki. Zaletą tego jest to że nie konieczne jest później wysyłanie literki uartem, bo można wtedy wysłać czy wpisać do bufora gdzie się chce ... w zależności obsługi zdarzenia od GPS.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=447">xbary</a> — 28 lip 2013, o 17:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-07-28T17:03:32+01:00</updated>
<published>2013-07-28T17:03:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43716#p43716</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43716#p43716"/>
<title type="html"><![CDATA[Re: Pytanie o zależności pomiędzy libsami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43716#p43716"><![CDATA[
<div class="quotetitle">Antystatyczny napisał(a):</div><div class="quotecontent"><br />Zaczynam widzieć w tym pewien dotąd ukrywany przede mną potencjał.<br /></div><br /><br />No ba! to na prawdę jest od dawna bardzo fajnie przemyślane <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ale chyba jak wszystko w naszym ukochanym że tak powiem C.<br /><br />Nie mniej jednak próba korzystania z pritf'a na takim przecież procku który też ma sprzętowy UART jak np ATtiny2313 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> spowoduje że programista poużywa sobie jak przysłowiowy pies w studni <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> .... bo po pierwszym-drugim użyciu zabraknie FLASH'a na wszystko inne.<br /><br />A tymczasem do prostych aplikacji i takie procki się używa z takimi urządzeniami czy to gps czy gsm. Wiadomo też że zależy na jaką drogę decydujemy się przy tworzeniu LIB'sa<br /><br />aha - fajnie ten sposób podmiany strumienia opisany był w serii kursu języka C (jednego z lepszych moim zdaniem), który ukazał się kiedyś na łamach EP. Jeśli może masz dostęp do archiwalnych numerów to śmiało możesz tam zajrzeć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 28 lip 2013, o 17:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-07-28T16:40:39+01:00</updated>
<published>2013-07-28T16:40:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43709#p43709</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43709#p43709"/>
<title type="html"><![CDATA[Re: Pytanie o zależności pomiędzy libsami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43709#p43709"><![CDATA[
Jeśli ja coś mogę zauważyć, to....<br /><br />ale najpierw uprzedzam, że wcale mi nie chodzi o to aby forsować akurat rozwiązania, których ja używałem<br /><br />Anty - chcesz zrobić super uniwersalną bibliotekę - powiedziałbym hermetyczną i czystą ... Super. Czyli na końcu może z niej powstać wręcz prawdziwa biblioteka - bo już kiedyś też gdzieś pisałem ale nie tylko ja, że to co my tu zwykle robimy i sobie używamy określenia że robimy LIB'sy to tak na prawdę nie są żadne lib'sy <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> . Prawdziwie biblioteki to te skompilowane do postaci (bodajże *.a) i można ich używać rzeczywiście tak jak<br /><br />#include &lt;avr/io.h&gt;<br /><br />później. W takim przypadku ja np też może i próbowałbym w tym co mówisz pójść drogą printf'a ... czyli podmianą strumienia itp bo wtedy mamy rzeczywiście pełną uniwersalność i praktycznie na każdy AVR<br /><br />ale czy ty rzeczywiście chcesz taką bibliotekę *.a przygotować ?<br /><br />Jeśli nie, a zależy ci na tym aby była ona np wygodna dla wszystkich to jednak warto pokusić się o dodanie nawet własnego LIB'sa do UART'a który poprzez kilka funkcji styka się z twoim UART'em. I to przecież przez kilka pewnie typowych funkcji takich jak do przesłania znaku, stringa, liczby itp bo czegóż więcej. A zatem na prawdę łatwo byłoby każdemu podłączyć w to miejsce jakąś inną 'ala' własną czy cudzą bibliotekę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />natomiast podmiana strumienia i przystosowanie do printf'a może (ale to TYLKO moje nieobiektywne zdanie) raczej hmmm skomplikować całość do wykorzystania takiego LIB'sa dla przysłowiowego &quot;jana kowalskiego&quot;<br /><br />Jeśli zaś zależy ci na tym aby kod był mega uniwersalny i przenośny między platformami to już można to zrozumieć - chociaż i tu będzie potworny haczyk. Bo czy tak czy siak przeniesienie takiej biblioteki np na PIC'a będzie i tak wymagało ogromnej ingerencji i przeróbek<br /><br />z TRZECIEJ zaś strony - jeśli potraktować to jako samo szkolenie się w opracowywaniu bibliotek *.a - to bardzo fajna okazja <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />zresztą jak znam życie to nie ważne jakim sposobem to zrobisz i tak pewnie jak to zwykle u ciebie bywa niesamowicie zaskoczysz wszystkich pozytywnie i tego ci życzę <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 28 lip 2013, o 16:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-07-28T16:18:48+01:00</updated>
<published>2013-07-28T16:18:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43708#p43708</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43708#p43708"/>
<title type="html"><![CDATA[Re: Pytanie o zależności pomiędzy libsami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43708#p43708"><![CDATA[
Napisz własną <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<p>Statystyki: Napisane przez Gość — 28 lip 2013, o 16:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-07-28T15:58:06+01:00</updated>
<published>2013-07-28T15:58:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43706#p43706</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43706#p43706"/>
<title type="html"><![CDATA[Re: Pytanie o zależności pomiędzy libsami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43706#p43706"><![CDATA[
A to ok, nie zrozumiałem intencji <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. A sam unikam printfa jak ognia <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<p>Statystyki: Napisane przez Gość — 28 lip 2013, o 15:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-07-28T15:45:09+01:00</updated>
<published>2013-07-28T15:45:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43704#p43704</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43704#p43704"/>
<title type="html"><![CDATA[Re: Pytanie o zależności pomiędzy libsami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43704#p43704"><![CDATA[
No ale co za problem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. Wiesz u Mirka też trzeba posiedzieć chwilę by przystosować biblioteki czy soft, do innej biblioteki, ale dzieki temu że wszystko jest przejrzyste nie stwarza to problemu.<br />A tak jak wrzucisz do libsa GPSu obsługę sprzętową AVRowego UARTu to dupa, przerobić to np. na freescale nie będzie już tak łatwo. A tak zmieniasz tylko deklaracje funkcji podpinasz inną bibliotekę UARTa i działa.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br /><div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />Użyj strumienia i w kodzie będziesz miał zawsze printf.<br /></div><br /><br />Ale czy to dobry sposób? 2K kodu dodatkowo tylko dla samego printf?<p>Statystyki: Napisane przez Gość — 28 lip 2013, o 15:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-07-28T15:44:27+01:00</updated>
<published>2013-07-28T15:44:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43703#p43703</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43703#p43703"/>
<title type="html"><![CDATA[Re: Pytanie o zależności pomiędzy libsami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43703#p43703"><![CDATA[
Użyj strumienia i w kodzie będziesz miał zawsze printf.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 28 lip 2013, o 15:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-07-28T15:38:51+01:00</updated>
<published>2013-07-28T15:38:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43701#p43701</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43701#p43701"/>
<title type="html"><![CDATA[Re: Pytanie o zależności pomiędzy libsami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3693&amp;p=43701#p43701"><![CDATA[
Nie no, jak u Mirka bym powiedział jest wzorcowo, po co wyważać otwarte drzwi.<br />Po prostu umieszczamy bibliotekę w libsach potrzebną do obsługi UARTa i tyle.<br />Kod jest wtedy bardziej przenośny.<p>Statystyki: Napisane przez Gość — 28 lip 2013, o 15:38</p><hr />
]]></content>
</entry>
</feed>