<?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=60&amp;t=21819&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-01-03T19:22:53+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=60&amp;t=21819&amp;mode</id>
<entry>
<author><name><![CDATA[steter]]></name></author>
<updated>2019-01-03T19:22:53+01:00</updated>
<published>2019-01-03T19:22:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215371#p215371</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215371#p215371"/>
<title type="html"><![CDATA[Re: Testowanie RS232 AVR--PC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215371#p215371"><![CDATA[
Szanowni koledzy, dziś w poszukiwaniu rozwiązania mojego problemu, znalazłem podobny temat i przeczytałem &quot;Tutaj masz kody źródłowe (C#,C++,Delphi) , jak korzystać z chip-ów FTDI : <!-- m --><a class="postlink" href="http://www.ftdichip.com/Projects/CodeExamples.htm" >http://www.ftdichip.com/Projects/CodeExamples.htm</a><!-- m -->&quot;     pobrałem więc program testowy do C++ Builder wprost ze strony producenta układu z którego korzystam (że też wcześniej na to nie wpadłem), skompilowałem go i uruchomiłem, po uruchomieniu zobaczyłem przyjazny program do testowania przejściówek i to w dodatku do edycji, jest tak mały że może uda mi się go zrozumieć.<img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Tak więc dziękuję za pomoc i zainteresowaniem tematem, <br />Serdecznie pozdrawiam ludzi którym się chce pomagać. <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=2747">steter</a> — 3 sty 2019, o 19:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marhef]]></name></author>
<updated>2019-01-03T08:31:01+01:00</updated>
<published>2019-01-03T08:31:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215352#p215352</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215352#p215352"/>
<title type="html"><![CDATA[Re: Testowanie RS232 AVR--PC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215352#p215352"><![CDATA[
Możesz spróbować odczytać z rejestru windowsa dane każdego urządzenia widzianego jako port COM. Możesz sprawdzać numery VID i PID dla każdego portu.<br />Prawdopodobnie dla FT232RL wartość VID to 0403 a PID to 6001. Ale to musiałbyś sobie sprawdzić.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12752">Marhef</a> — 3 sty 2019, o 08:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2019-01-02T22:19:23+01:00</updated>
<published>2019-01-02T22:19:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215349#p215349</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215349#p215349"/>
<title type="html"><![CDATA[Testowanie RS232 AVR--PC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215349#p215349"><![CDATA[
Popatrz na komponenty Mirka do Delphi/C++ buildera. Nakręcił do nich różne filmiki. Np. MkUsbDetector<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 2 sty 2019, o 22:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[steter]]></name></author>
<updated>2019-01-02T22:01:38+01:00</updated>
<published>2019-01-02T22:01:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215348#p215348</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215348#p215348"/>
<title type="html"><![CDATA[Re: Testowanie RS232 AVR--PC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215348#p215348"><![CDATA[
Zamysł miałem taki;<br />Mam funkcję SetCommState(hNumPort,&amp;dcd) która zwraca TRUE po prawidłowym podłączeniu się do portu COM lub FALSE gdy nie uda się podłaczyć,<br />Myślę więc - w pętli While() po kolei spróbuję się podłączać do np;15-stu COM-ów, jeśli w końcu funkcja zwróci TRUE to zostanie mi wysłać znak 'a' do AVR aby za chwilę odebrać spodziewane się dane z AVR (bo tak mam napisane nadawanie w AVR) i w ten sposób odfiltruję pożądany COM. Problemem jest użycie funkcji ReadFile(hNumPort,IpBuffor_read,10,&amp;RS_ile,0) ponieważ jeśli jej użyję(aby sprawdzić odebrane dane), a bufor odbiorczy nie jest zapełniony, to funkcja jak by czeka w nieskończoność na dane i blokuje program, nie wiem jak opuścić tą funkcję (np. po jakimś krytycznym czasie) aby kontynuować sprawdzanie portów.<br />Jako ciekawostkę w menadżerze urządzeń widzę aktywny COM4 (to nie moja przejściówka) i mogę się do niej podłączyć i nawet wysłać dane, a już np. próba odczytu z COM4 ,zatrzymuje program. (przypuszczam że nic nie przylatuje do bufora odbiorczego) , robiąc testy na mojej przejściówce wystarczyło że w Atmedze za komentowałem nadawanie po RS232 i program w PC zachowywał się dokładnie tak samo przy próbie użyciu funkcji  ReadFile(hNumPort,IpBuffor_read,10,&amp;RS_ile,0).<br /><br />Jeszcze muszę dużo poczytać, a najlepiej namówić P.Mirka do napisania książki o C++ (ale tak łopatologicznie tłumacząc na przykładach jak AVR-y) aby można było zrozumieć <img src="https://forum.atnel.pl/images/smilies/icon_idea.gif" alt=":idea:" title="Pomysł" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2747">steter</a> — 2 sty 2019, o 22:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2019-01-02T20:33:38+01:00</updated>
<published>2019-01-02T20:33:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215342#p215342</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215342#p215342"/>
<title type="html"><![CDATA[Re: Testowanie RS232 AVR--PC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215342#p215342"><![CDATA[
<div class="quotetitle">steter napisał(a):</div><div class="quotecontent"><br />No i wszystko działa dobrze gdy COM ustawiony w programie PC jest zgodny z moją przejściówką<br /></div>Port COM związany jest z hardwarem (dokładnie to sterownikami, które go obsługują). Więc nie możesz sobie otwierać innego portu niż ten przypisany do sprzętu. Jak nie masz dodatkowych fizycznych portów COM albo kolejnej przejściówki lub skonfigurowanego profilu SPP w bluetooth to nie otworzysz innego portu.<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 2 sty 2019, o 20:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[steter]]></name></author>
<updated>2019-01-02T19:08:02+01:00</updated>
<published>2019-01-02T19:08:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215340#p215340</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215340#p215340"/>
<title type="html"><![CDATA[Testowanie RS232 AVR--PC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21819&amp;p=215340#p215340"><![CDATA[
Witam serdecznie.<br /><br />Napisałem w C na Atmega32 program który wysyła dane po RS232 do PC gdy tylko dostanie znak 'a', i tu wszystko działa;<br />[syntax=c]void transmit(void){<br />    if(wyslij_dane){<br />        wyslij_dane=0;//ustawiam na 0 aby zawartosc była wykonywana tylko na polecenie PC<br />        if(data == 'a'){        // jesli z PC przyszedł znak 'a' to PC prosi o dane<br />    if(typ_przelacznika&lt;0x10)uart_putc(' '); // tu wysyłam typ przełącznika, jesli mniejszy od dwuch znaków ascii to wyslij<br />    uart_putint(typ_przelacznika,16);         // znka ascii 0 aby wypełnic bufor w pc (żeby sie prog w pc nie zawiesil<br /><br />    if(MCPADC_0&lt;0x1000)uart_putc(' ');//<br />    if(MCPADC_0&lt;0x100)uart_putc(' '); // te trzy ify do wypełnienia bufa odbiorczego w PC<br />    if(MCPADC_0&lt;0x10)uart_putc(' ');  //<br />    uart_putint(MCPADC_0,16);          //wyslanie liczby na port rs232 szesnastkowo<br /><br />    if(MCPADC_1&lt;0x1000)uart_putc(' ');//<br />    if(MCPADC_1&lt;0x100)uart_putc(' '); // te trzy ify do wypełnienia bufa odbiorczego w PC<br />    if(MCPADC_1&lt;0x10)uart_putc(' ');   //<br />    uart_putint(MCPADC_1,16);           //wyslanie liczby na port rs232 szesnastkowo<br />    }<br />    MCP_read_buf(MCP_ADR_0,4,buf_0);     //odczyt napiecia z voltomierza<br />    MCPADC_0 = ((buf_0&#91;0&#93;&lt;&lt;8)|buf_0&#91;1&#93;); //zapis odczytanej wartosci do zmiennej 16 bitowej<br />    MCP_read_buf(MCP_ADR_1,4,buf_1);     //odczyt napiecia z voltomierza<br />    MCPADC_1 = ((buf_1&#91;0&#93;&lt;&lt;8)|buf_1&#91;1&#93;); //zapis odczytanej wartosci do zmiennej 16 bitowej<br />    }<br />}<br />// obsługa przerwania read_rs232<br />// jak tylko cos dostane z PC to wygeneruje sie przerwanie w którym zapiszemy bajt do zmiennej dana i ustawi zmienna wyslij_dane<br />// na jeden zeby program zareagowal i wysłał do PC o co prosi, lepszy opis w funkcji transmit<br />ISR(USART_RXC_vect){<br />data=UDR;       // pobieram bajt danych z bufora odbiorczego ( od PC )<br />wyslij_dane=1;  // ustawiam tą zmienną na 1 w celu wysłania danych do PC<br />}[/syntax]<br /><br />Oglądnąłem parę odcinków programowania w C++ Builder6 i postanowiłem przetwarzać dane na PC i oczywiście je wyświetlać.<br />Po długiej walce w końcu UC zaczął gadać z PC po RS232 i to bardzo dobrze, oto kod C++<br />[syntax=c]#include &lt;vcl.h&gt;<br />#pragma hdrstop<br />#include &quot;Unit1.h&quot;<br />#pragma package(smart_init)<br />#pragma resource &quot;*.dfm&quot;<br />TForm1 *Form1;<br /><br />static DCB dcb;         // struktua BCD (device Control Block) definiująca rodzaj połączenia<br />static HANDLE hNumPort; // uchwyt do otwartego portu<br />static char IpBuffor_read&#91;10&#93;,IpBuffor_write&#91;1&#93;; // tablice z danymi odbieranymi oraz wysyłanymi<br />static DWORD RS_ile;    // zmienna trzymająca informację ile czego wysyłamy lub czytamy<br /><br />unsigned short typ_przelacznika; // przechowyje typ badanego przelacznika w 2 bajtach<br />unsigned short MCP_ADC_0;        // zmienna 2 bajtowa do przechowywania adc z woltomierza pierwszego<br />unsigned short MCP_ADC_1;        // zmienna 2 bajtowa do przechowywania adc z woltomierza drugiego<br /><br />int df=0;<br /><br />__fastcall TForm1::TForm1(TComponent* Owner)<br />        : TForm(Owner)<br />{<br />    // ustawienie własciwosci portu com<br />    dcb.DCBlength = sizeof(dcb);<br />    dcb.BaudRate = CBR_115200;<br />    dcb.fParity = 0;<br />    dcb.Parity = NOPARITY;<br />    dcb.StopBits = ONESTOPBIT;<br />    dcb.ByteSize = 8;<br />    dcb.fDtrControl = DTR_CONTROL_ENABLE;<br />    dcb.fRtsControl = DTR_CONTROL_ENABLE;<br /><br />    dcb.fOutxCtsFlow = 0;<br />    dcb.fOutxDsrFlow = 0;<br />    dcb.fDsrSensitivity = 0;<br />    dcb.fAbortOnError = 0;<br />    dcb.fOutX = 0;<br />    dcb.fInX = 0;<br />    dcb.fErrorChar = 0;<br />    dcb.fNull = 0;<br />}<br />//---------------------------------------------------------------------------<br />void __fastcall TForm1::Timer1Timer(TObject *Sender)<br />{<br />    // Otwieranie portu, a te ukosniki zeby otworzyc wirtualny port<br />    hNumPort = CreateFileA(COM_10,GENERIC_WRITE | GENERIC_READ, 0 , 0 , OPEN_EXISTING, 0 , 0);<br />    // podłaczam sie do portu, jesli sie udalo funkcja zwruci 1 jesli nie funkcja zwruci 0<br />    if(SetCommState(hNumPort,&amp;dcb))<br />    {<br />      //  for(int i=0; i&lt;11 ; i++)<br />      //  {   // zerowanie  bufora odbiorczego<br />      //      IpBuffor_read&#91;i&#93;=0;<br />      //  }<br />        strcpy(IpBuffor_write,&quot;a&quot;);     // zapis char-a do bufora aby nadac do AVR (proszenie sie o dane)<br />        WriteFile(hNumPort,IpBuffor_write,strlen(IpBuffor_write),&amp;RS_ile,0);  // nadanie po rs232 do AVR<br />        // funkcja odbioru danych<br />        if(ReadFile(hNumPort,IpBuffor_read,10,&amp;RS_ile,0)){<br />        // zamiana pierwszych dwuch bajtów typu char z rs232 na liczbę<br />        typ_przelacznika=0;<br />        if( IpBuffor_read&#91;0&#93; != ' ' ){   // jesli w buforze sa dane inne od spacji to zacznij konwersje<br />    df=IpBuffor_read&#91;0&#93;;<br />    if(df &lt; 58) typ_przelacznika = ((df-0x30)&lt;&lt;4);<br />            else typ_przelacznika = ((df-87)&lt;&lt;4);<br />        }<br />        if( IpBuffor_read&#91;1&#93; != ' ' ){<br />            df=IpBuffor_read&#91;1&#93;;<br />            if(df &lt; 58) typ_przelacznika |= df-0x30;<br />            else typ_przelacznika |= df-87;<br />        }<br />        // zamiana czterech bajtów typu char do zmiennej 2 bajtowej typu unsigned short(pomiar napiecia na pierwszym voltomierzu)<br />        MCP_ADC_0=0;  // zerowanie zmiennej<br />        if( IpBuffor_read&#91;2&#93; != ' ' ){   // jesli w buforze sa dane inne od spacji to zacznij konwersje<br />    df=IpBuffor_read&#91;2&#93;;<br />    if(df &lt; 58) MCP_ADC_0 = (df-0x30);<br />            else MCP_ADC_0 = (df-87);<br />            MCP_ADC_0&lt;&lt;=4;<br />        }<br />        if( IpBuffor_read&#91;3&#93; != ' ' ){   // jesli w buforze sa dane inne od spacji to kontynuuj konwersje<br />    df=IpBuffor_read&#91;3&#93;;<br />    if(df &lt; 58) MCP_ADC_0 |= (df-0x30);<br />            else MCP_ADC_0 |= (df-87);<br />            MCP_ADC_0&lt;&lt;=4;<br />        }<br />        if( IpBuffor_read&#91;4&#93; != ' ' ){   // jesli w buforze sa dane inne od spacji to kontynuuj konwersje<br />    df=IpBuffor_read&#91;4&#93;;<br />    if(df &lt; 58) MCP_ADC_0 |= (df-0x30);<br />            else MCP_ADC_0 |= (df-87);<br />            MCP_ADC_0&lt;&lt;=4;<br />        }<br />        if( IpBuffor_read&#91;5&#93; != ' ' ){   // jesli w buforze sa dane inne od spacji to kontynuuj konwersje<br />    df=IpBuffor_read&#91;5&#93;;<br />    if(df &lt; 58) MCP_ADC_0 |= (df-0x30);<br />            else MCP_ADC_0 |= (df-87);<br />        }<br />        // zamiana czterech bajtów typu char do zmiennej 2 bajtowej typu unsigned short (pomiar napiecia na drugim voltomierzu)<br />        MCP_ADC_1=0;  // zerowanie zmiennej<br />        if( IpBuffor_read&#91;6&#93; != ' ' ){   // jesli w buforze sa dane inne od spacji to zacznij konwersje<br />    df=IpBuffor_read&#91;6&#93;;<br />    if(df &lt; 58) MCP_ADC_1 = (df-0x30);<br />            else MCP_ADC_1 = (df-87);<br />            MCP_ADC_1&lt;&lt;=4;<br />        }<br />        if( IpBuffor_read&#91;7&#93; != ' ' ){   // jesli w buforze sa dane inne od spacji to kontynuuj konwersje<br />    df=IpBuffor_read&#91;7&#93;;<br />    if(df &lt; 58) MCP_ADC_1 |= (df-0x30);<br />            else MCP_ADC_1 |= (df-87);<br />            MCP_ADC_1&lt;&lt;=4;<br />        }<br />        if( IpBuffor_read&#91;8&#93; != ' ' ){   // jesli w buforze sa dane inne od spacji to kontynuuj konwersje<br />    df=IpBuffor_read&#91;8&#93;;<br />    if(df &lt; 58) MCP_ADC_1 |= (df-0x30);<br />            else MCP_ADC_1 |= (df-87);<br />            MCP_ADC_1&lt;&lt;=4;<br />        }<br />        if( IpBuffor_read&#91;9&#93; != ' ' ){   // jesli w buforze sa dane inne od spacji to kontynuuj konwersje<br />    df=IpBuffor_read&#91;9&#93;;<br />    if(df &lt; 58) MCP_ADC_1 |= (df-0x30);<br />            else MCP_ADC_1 |= (df-87);<br />        }<br />        Volt_1-&gt;Caption=IpBuffor_read; // pokarz zawartosc całego bufora odbiorczego<br />        Volt_2-&gt;Caption=MCP_ADC_0;     // pokarz wartosc zmiennej MCP_ADC_0<br />        CloseHandle(hNumPort); }       // zamknij otwarty PORT COM<br />    }<br />    else Volt_2-&gt;Caption=&quot;Nie udało się podłączyc&quot;;<br />}<br /><br />// jesli ktos zamknie program to wypada zapytac czy napewno chce to zrobic<br />void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &amp;Action)<br />{<br />     if(Application-&gt;MessageBox(&quot;Czy Napewno Zamknąć Program?&quot;,&quot;POTWIERDŹ&quot;,MB_YESNO | MB_ICONQUESTION)==IDNO){<br />           Action=caNone;     // jak wcisnie nie to zaniechaj zamyknia<br />     }<br />}[/syntax]<br />No i wszystko działa dobrze gdy COM ustawiony w programie PC jest zgodny z moją przejściówką , ale używam przejściówki FT232RL i przy zmianie komputera zmienia się COM(więc nie mogę na stałe ustawić nr.COM-a) więc chcę testować porty COM aby nie trza było go wybierać. Niestety jeśli już uda mi się otworzyć port COM(oczywiście jakiś inny niż ten od AVR) to już próba odczytu funkcją &quot;ReadFile&quot; ( aby np sprawdzić czy dane mam od AVR) kończy się brakiem odpowiedzi programu,<br />Bufor read pusty i program stoi.Dodam że pokazany listing C++ jest testowy i tak się bawię, zmienię np nr COM i sprawdzam co się dzieje, Jestem nowicjuszem w tej materii, więc proszę o pomoc, jak mogę sobie z tym problemem poradzić.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2747">steter</a> — 2 sty 2019, o 19:08</p><hr />
]]></content>
</entry>
</feed>