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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-09-29T19:23:31+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=66&amp;t=16330&amp;mode</id>
<entry>
<author><name><![CDATA[Piotrek_P]]></name></author>
<updated>2016-09-29T19:23:31+01:00</updated>
<published>2016-09-29T19:23:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16330&amp;p=169911#p169911</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16330&amp;p=169911#p169911"/>
<title type="html"><![CDATA[Re: Komunikacja po RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16330&amp;p=169911#p169911"><![CDATA[
Nie wiem na ile pomogę ale wykopałem procedurę którą napisałem w 2004 roku w Delphi do pobierania danych wysyłanych z AVRa. Procedura wyświetlała temperaturę na wykresie i zapisywała dane do bazy Firebird. Program na uC był napisany w Bascomie z użyciem typowych funkcji do wysyłania stringów(jakieś print() czy coś, nie pamiętam Bascoma). Nie sprzątałem kodu przed publikacją bo istotne linie można sobie wyłuskać<br /><br />[syntax=delphi]procedure TForm1.CPort_ReceiveRxChar(Sender: TObject; Count: Integer);<br />var<br />        str : string;<br />        i : byte;<br />        temp_tab : array&#91;0..24&#93; of integer;<br />        temper : byte;<br />        t,d : integer;<br />        minus : string&#91;1&#93;;<br />begin<br />   CPort_Receive.ReadStr(str,count);<br />   temper := StrToInt(Copy(str,0,2));<br />//   minus := Copy(str,0,1);<br />//   if minus = '-' then<br />//        t := StrToInt(Copy(str,1,count))<br />//   else<br />   t := StrToInt(Copy(str,0,Length(str)-2));<br />   d := t mod 10;<br />   t := t div 10;<br />   Matrix.Text := IntToStr(t)+'.'+IntToStr(d);//Copy(str,0,3);<br />//   Label1.Caption := IntToStr(temper);<br />   for i := 0 to 24 do<br />    begin<br />    temp_tab&#91;i&#93; := tab&#91;i+1&#93;;<br />    tab&#91;i&#93; := temp_tab&#91;i&#93;;<br />    end;<br />    tab&#91;i&#93; := temper;<br />    try<br />    with DM_Temper do<br />    if IBTrans_Temper.InTransaction then<br />    begin<br />  //       IbTrans_Temper.StartTransaction;<br />//         IBQry_Temper.SQL.Add(&#91;date,time,temper&#93;);<br />//         DM_Temper.IBTrans_Temper.Commit;<br />    end;<br />    except<br />//         ShowMessage('Transakcja nie aktywna');<br />//         DM_Temper.IBTrans_Temper.Rollback;<br />    end;<br />end;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=290">Piotrek_P</a> — 29 wrz 2016, o 19:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-09-29T18:19:36+01:00</updated>
<published>2016-09-29T18:19:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16330&amp;p=169898#p169898</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16330&amp;p=169898#p169898"/>
<title type="html"><![CDATA[Re: Komunikacja po RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16330&amp;p=169898#p169898"><![CDATA[
Pierwszym mega podstawowym problemem jaki tu widzę to jest fakt, że ty próbujesz programować totalnie LINIOWO ... i to cię gubi a wręcz uniemożliwia żeby jakkolwiek to rozwinąć ... A liniowo piszesz soft zarówno w procku ... ale także w PC a to to już katastrofa niestety.<br /><br />Przyznam też, że chociaż próbowałem to w ogóle nie rozumiem tego fragmentu kodu w Bascomie ... ale też bascomem to ja zajmowałem się już chyba 6 lat temu więc praktycznie nic nie pamiętam... Chociaż ... wiem że i w Bascomie można sobie programować w oparciu o zdarzenia i sam to kiedyś robiłem ... no ale nie taką liniową funkcją INKEY() <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />-------------------------------------------------------------------------------<br /><br />ciężko mi zatem pomóc bo ty tutaj ściśle sprzęgasz komunikację procka z programem na PC a jak się z jednej strony źle pisze to z drugiej ciężko nawet reagować<br /><br />Mi zaś ciężko podpowiadać jak rozwiązać coś w Bascomie - nie to że nie chcę tylko po prostu nie wiem - nie pamiętam na dzisiaj. Tu musi ktoś z Bascoma może coś podpowiedzieć .... ?<br /><br />Ty nawet sam potrafisz dostrzec i DOKŁADNIE określić swój problem, bo piszesz:<br /><br /><div class="quotetitle">MaciejF napisał(a):</div><div class="quotecontent"><br />Problem takiego rozwiazania polega na tym ze z gory musze znac ilosc znakow wyslanych przez uC do konkretnego Labela czy Panelu.<br /></div><br />I masz tu 100000% racji<br /><br />więc może jednak czas na próbę nauki jak to robić w sposób &quot;nieblokujący&quot; w oparciu o zdarzenia .... ?<br /><br />Od strony procka to mógłbym ci polecić Greenbooka i tam opisaną komunikację przez RS232 no ale jaki to ma sens jeśli ty tworzysz w Bascomie ? <br /><br /><div class="quotetitle">MaciejF napisał(a):</div><div class="quotecontent"><br />Wolałbym wysyłać z uC ciągiem wszystkie dane rozdzielane separatorem a w aplikacji rozdzielać je<br /></div><br />I to jest dobry pomysł ... dobra droga - ważne że to już przynajmniej czujesz przez skórę ... dalsze kroki musisz podjąć sam <br /><br />Bo procek powinien formować jakieś dane, zaś raz na sekundę jakaś procedura typu zdarzenie wywoływane niezależnie od pozostałej części programu powinna je zbierać, formować w ramkę ASCII i wysyłać do PC. To NAJLEPSZA droga ... Ale jeśli ty na razie jesteś na etapie GoSub , Goto to hmmm no może być to ciężko zrealizować ... a przecież nawet Bascom ma funkcje - tylko nie wiedzieć czemu mnóstwo ludzi piszących soft w tym języku z nich nie korzysta na rzecz właśnie goto, gosub, goto, goto, gosub itd Nie mówię tego broń Boże ironicznie - raczej wskazuję kierunek ...<br /><br />W programie na PC - też kompletnie zapomnij o takim pisaniu linijka po linijce odbieraniu pojedynczych znaków czy coś bo - tu sam widzisz że wychodzi ci MASAKRA po prostu MASAKRA - tak nie można...<br /><br />Zapoznaj się z komponentem z którego korzystasz i mogę się założyć, że posiada on zdarzenia - np OnRxData czy coś w tym stylu - i to te zdarzenia trzeba oprogramować <br /><br />bo pomyśl sobie - jakbyś miał odebrać milion znaków z UART to byś pisał milion linijek w kodzie ? Ma to jakiś sens ?<br /><br />Zdarzenia są po to żeby wyłapać nadlatujące dane - dostajesz je pewnie w jakimś buforze który przekazywany jest w argumencie funkcji zdarzenia .... i tam trzeba je parsować ... Gorzej oczywiście jeśli ty z kolei z Bascoma - cykasz je też w sposób liniowy no i się wszystko w końcu zacina i nic nie działa jak trzeba a programu nie ma jak rozbudować ...<br /><br />Nawet jeśli zacząłbym poradniki Delphi a tobie udałoby się to wdrażać jakoś w Lazarusie (bo ja nie znam Lazarusa ni w ząb) .... to co z tego - jeśli ja będę pokazywał komplementarne przykłady od strony procka jeśli chodzi o komunikację w C w oparciu właśnie o zdarzenia opisane już dawno w GB ?<br /><br />w tym jest właśnie problem<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 29 wrz 2016, o 18:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MaciejF]]></name></author>
<updated>2016-09-29T15:05:05+01:00</updated>
<published>2016-09-29T15:05:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16330&amp;p=169883#p169883</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16330&amp;p=169883#p169883"/>
<title type="html"><![CDATA[Komunikacja po RS232]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16330&amp;p=169883#p169883"><![CDATA[
Witam!<br />Nie wiem jak zorganizować transmisję po RS232.<br />Dotychczas działało to tak, że uC zbierał dane i w pętli głównej czekał aż przyjdzie znak 1, 2 lub 3 i wykonywał odpowiednie działania.<br /><br />[syntax=basic4gl]Z = Inkey()<br />Reset D1<br /> <br /> <br />Select Case Z<br /> <br />Case 1 :<br />Print Lu ; Wadc ; Wnap2 ; Otemp ; Odczyt(2);<br /> <br />Case 2:<br />Gosub Ds<br /> <br /> <br />Case 82 : Start Watchdog<br />Case 83 : Gosub Singlee<br /> <br /> <br />End Select[/syntax]<br /><br />Odbiór w aplikacji wyglądał tak:<br />[syntax=delphi]begin<br /> <br /> <br />w1:=1;<br />comport1.Write(w1,1);<br /> <br />ComPort1.ReadStr(o6,1);<br />label8.caption:=o6;<br /> <br />ComPort1.ReadStr(o5,15);<br />label2.caption:=o5;<br /> <br />ComPort1.ReadStr(o7,13);<br />label10.caption:=o7;<br /> <br /> <br />ComPort1.ReadStr(o1,4);<br />panel6.Caption:=o1;<br />panel6.Color:=RGB(0,0,0);<br />panel6.Font.Color:=RGB(51,153,255);<br />panel6.Font.Size:=10;<br /> <br />ComPort1.ReadStr(o2,4);<br />panel3.Caption:=o2 + ' V';<br />//panel3.Color:=RGB(0,0,0);<br />panel3.Font.Color:=RGB(51,153,255);<br />panel3.Font.Size:=15;<br /> <br />ComPort1.ReadStr(o3,4);<br />panel4.Caption:=o3 + ' °C';<br />panel4.Color:=RGB(0,0,0);<br />panel4.Font.Color:=RGB(51,153,255);<br />panel4.Font.Size:=15;<br /> <br />ComPort1.ReadStr(o4,4);<br />panel9.Caption:=o4;<br />panel9.Color:=RGB(0,0,0);<br />panel9.Font.Color:=RGB(51,153,255);<br />panel9.Font.Size:=10;[/syntax]<br /><br />Czyli aplikacja przez timer1 co 1sek wysyłała znak '1' uC odbiera i wysyła swoje dane.<br />Problem takiego rozwiazania polega na tym ze z gory musze znac ilosc znakow wyslanych przez uC do konkretnego Labela czy Panelu.<br />Gdybym np chcial odebrac z Ds18b20 nr seryjny to moze on zawierac od 8 do 24 znakow.<br /><br />Wolałbym wysyłać z uC ciągiem wszystkie dane rozdzielane separatorem a w aplikacji rozdzielać je i umieszczać w odpowiednich okienkach typu panel1, panel2 itd. ale nie mam pojęcia jak to zrobić.<br />Może ktoś pomóc ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3267">MaciejF</a> — 29 wrz 2016, o 15:05</p><hr />
]]></content>
</entry>
</feed>