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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-05-22T22:49:32+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=61&amp;t=6639&amp;mode</id>
<entry>
<author><name><![CDATA[p_zag]]></name></author>
<updated>2015-05-22T22:49:32+01:00</updated>
<published>2015-05-22T22:49:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=129860#p129860</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=129860#p129860"/>
<title type="html"><![CDATA[Re: JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=129860#p129860"><![CDATA[
Witam<br />Prawdopodobnie wieszanie się programu jest spowodowane odczytem dużej ilości danych w wątku głównym. Aby temu zaradzić stwórzmy inny wątek tylko do odczytu i wyświetlenia danych. Mój program miał za zadanie być ilustracją tworzenia programów w javie &quot;wyklikując&quot; program i jako taki nie jest doskonały. Można go uważać jako szkielet, który trzeba ubrać w odpowiednie procedury.<br />Wracając do tematu to napisałem taką procedurę tworząca osobny wątek:<br />[syntax=java]private void Odczyt(final InputStream inputStream) {<br />        Thread thread = new Thread(new Runnable() {<br />            @Override<br />            public void run() {<br />            try {<br />    // ilość bajtów odczytana ze strumienia<br />    int nb = inputStream.available();<br />    // odczyt buforowany danych ze strunienia<br />    while (nb &gt; 0) {<br />    byte&#91;&#93; readBuffer = new byte&#91;nb&#93;;<br />    inputStream.read(readBuffer);<br />    String str = new String(readBuffer);<br />    // str = str.replace(&quot;\r&quot;,&quot;\n&quot;);<br />    textArea.append(str + &quot;\n&quot;);<br />    nb = inputStream.available();<br />    }<br />    } catch (IOException ex) {<br />    }<br />    // Podążanie za tekstem odczytu<br />    textArea.setCaretPosition(textArea.getText().length());<br />            }<br />        });<br />        thread.start();<br />    }[/syntax] <br />a umieszczenie jej w kodzie wygląda tak:<br />[syntax=java]// ...<br /><br />// procedura odbierająca dane z portu<br />@Override<br />public void serialEvent(SerialPortEvent arg0) {<br />switch (arg0.getEventType()) {<br />// --- odczyt zdarzeń odczytanych z portu ---<br />case SerialPortEvent.BI:<br />break;<br />case SerialPortEvent.OE:<br />break;<br />case SerialPortEvent.FE:<br />break;<br />case SerialPortEvent.PE:<br />break;<br />case SerialPortEvent.CD:<br />break;<br />case SerialPortEvent.CTS:<br />break;<br />case SerialPortEvent.DSR:<br />break;<br />case SerialPortEvent.RI:<br />break;<br />case SerialPortEvent.OUTPUT_BUFFER_EMPTY:<br />break;<br />case SerialPortEvent.DATA_AVAILABLE:<br />                        // --- odczyt zdarzeń odczytanych z portu ---<br />Odczyt(inputStream);<br /> break;<br /> }<br />}// koniec<br /><br /><br />private void Odczyt(final InputStream inputStream) {<br />        Thread thread = new Thread(new Runnable() {<br />            @Override<br />            public void run() {<br />            try {<br />    // ilość bajtów odczytana ze strumienia<br />    int nb = inputStream.available();<br />    // odczyt buforowany danych ze strunienia<br />    while (nb &gt; 0) {<br />    byte&#91;&#93; readBuffer = new byte&#91;nb&#93;;<br />    inputStream.read(readBuffer);<br />    String str = new String(readBuffer);<br />    // str = str.replace(&quot;\r&quot;,&quot;\n&quot;);<br />    textArea.append(str + &quot;\n&quot;);<br />    nb = inputStream.available();<br />    }<br />    } catch (IOException ex) {<br />     }<br />    // Podążanie za tekstem odczytu<br />    textArea.setCaretPosition(textArea.getText().length());<br />            }<br />        });<br />        thread.start();<br />    }<br /><br />    <br />protected void do_comboBox_itemStateChanged(ItemEvent arg0) {<br />nazwaPortuCOM = (String) comboBox.getSelectedItem();<br />}<br />protected void do_comboBox_1_itemStateChanged(ItemEvent e) {<br />baudRateCOM = Integer.parseInt((String) comboBox_1.getSelectedItem());<br />}<br /><br />// ...[/syntax]<br />Nie testowałem tej procedury bo jestem aktualnie w trakcie pisania aplikacji na androida 2.3.6 do komunikacji z mikroprocesorem Atmega8 poprzez WiFi (w zasadzie to komunikacje już mam na jakieś 80%)<br /><br />Piotr<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=539">p_zag</a> — 22 maja 2015, o 22:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Rzeczek]]></name></author>
<updated>2015-05-21T18:04:45+01:00</updated>
<published>2015-05-21T18:04:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=129784#p129784</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=129784#p129784"/>
<title type="html"><![CDATA[Re: JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=129784#p129784"><![CDATA[
Cześć! Zrobiłem obsługę dwóch żyroskopów przy użyciu biblioteki autorstwa Davide Gironi, 2012 i na obecną chwilę wyświetlam sobie kostki w openGLu w C++.<br />Chciałbym się przerzucić na Javę, ze względu na to że środowisko graficzne ma wspomaganie i jest darmowe, w przeciwieństwie do c#, w którym lata temu bardzo przyjemnie mi się bawiło.<br />Ale na samym wstępie zanim zacznę się bawić twoim kodem, odpalam Twój program i po chwili program się wiesza.<br /><a href="http://forum.atnel.pl/_obrazki/o/7234/1c5b427b97feb7ebbdca1601d9015340.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/7234/1c5b427b97feb7ebbdca1601d9015340.png" alt="Obrazek" /></a><br />Na RS232 przychodzi z mikrokontrolera pakiet danych 9*6+4 znaków z częstotliwością ok 25Hz.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7234">Rzeczek</a> — 21 maja 2015, o 18:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[panbosman]]></name></author>
<updated>2015-03-13T08:59:43+01:00</updated>
<published>2015-03-13T08:59:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=123326#p123326</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=123326#p123326"/>
<title type="html"><![CDATA[Re: JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=123326#p123326"><![CDATA[
Dzięki, Jesteś kopalnią wiedzy o androidzie. <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=819">panbosman</a> — 13 mar 2015, o 08:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[p_zag]]></name></author>
<updated>2015-03-12T17:58:32+01:00</updated>
<published>2015-03-12T17:58:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=123261#p123261</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=123261#p123261"/>
<title type="html"><![CDATA[Re: JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=123261#p123261"><![CDATA[
Spójrz na tą stronę <a href="http://stackoverflow.com/questions/4715865/how-to-programmatically-tell-if-a-bluetooth-device-is-connected-android-2-2"  class="postlink">http://stackoverflow.com/questions/4715865/how-to-programmatically-tell-if-a-bluetooth-device-is-connected-android-2-2</a> &quot;<em>Jak programowo stwierdzić, czy urządzenie Bluetooth jest podłączone? (Android 2.2)</em>&quot;. Wykorzystałbym klasę <strong> BroadcastReceiver </strong>, która i tak nasłuchuje transmisję i bada stan bluetooth'a <br /><br />[syntax=java]public void onCreate() {<br />        //...<br />        IntentFilter filter1 = new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED);<br />        IntentFilter filter2 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED);<br />        IntentFilter filter3 = new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED);<br />        this.registerReceiver(mReceiver, filter1);<br />        this.registerReceiver(mReceiver, filter2);<br />        this.registerReceiver(mReceiver, filter3);<br />    }<br /><br /><br />@Override<br />        public void onDestroy() {<br />   //...<br />   unregisterReceiver(mReceiver);<br />   super.onDestroy();<br />}<br /><br /><br />    //BroadcastReceiver nasłuchuje transmisje bluetooth<br />    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {<br />    @Override<br />    public void onReceive(Context context, Intent intent) {<br />        String action = intent.getAction();<br /><br />        if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {<br />            // bluetooth jest połączony<br />            Toast.makeText(getApplicationContext(), &quot;BT Connected&quot;, Toast.LENGTH_SHORT).show();<br />        }<br />        else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {<br />            // bluetooth jest odłączony<br />            Toast.makeText(getApplicationContext(), &quot;BT Disconnected&quot;, Toast.LENGTH_SHORT).show();<br />        }<br />        //else if...<br />    }<br />};[/syntax]<br /><br />Prawdopodobnie i tak masz klasę typu <strong>BroadcastReceiver </strong> wystarczy ją tylko rozszerzyć o <em>BluetoothDevice.ACTION_ACL_DISCONNECTED</em><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=539">p_zag</a> — 12 mar 2015, o 17:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[panbosman]]></name></author>
<updated>2015-03-12T09:28:57+01:00</updated>
<published>2015-03-12T09:28:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=123200#p123200</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=123200#p123200"/>
<title type="html"><![CDATA[Re: JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=123200#p123200"><![CDATA[
Jak zakończę pracę nad połączeniem z BT to wstawię aplikację do pobrania.<br />Teraz mam jeszcze jedno pytanko:<br />Jeżeli utworzymy socket do połaczenia. BT się połączą i wtedy  ten przy AVR'ku odłączę od zasilania.<br />W androidzie sprawdzam w ten sposób:[syntax=java]if ( mySocket != null ) // jeśli utworzony<br />{<br />if ( !mySocket.isConnected() ) // jeśli nie połączony<br />   {<br />Toast.makeText(getApplicationContext(), &quot;Utrata połączenia!&quot;, Toast.LENGTH_SHORT).show(); // info<br />   }<br />}[/syntax]<br />Ale nie dostaję tego komunikatu.<br /><br />Jak można sprawdzić czy połączenie zostało zerwane?<br />Jedyne co mi przychodzi do głowy to sprawdzanie co jakiś czas odebranych danych.<br />Ale może jest jakieś inne lepsze rozwiązanie?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=819">panbosman</a> — 12 mar 2015, o 09:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[p_zag]]></name></author>
<updated>2015-02-28T02:15:14+01:00</updated>
<published>2015-02-28T02:15:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=121283#p121283</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=121283#p121283"/>
<title type="html"><![CDATA[Re: JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=121283#p121283"><![CDATA[
Cieszę się że bluetooth Tobie już działa. <br />Może kiedyś pochwalisz się jakąś aplikacją na androida napisaną w javie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=539">p_zag</a> — 28 lut 2015, o 02:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[panbosman]]></name></author>
<updated>2015-02-26T07:34:32+01:00</updated>
<published>2015-02-26T07:34:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=120998#p120998</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=120998#p120998"/>
<title type="html"><![CDATA[Re: JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=120998#p120998"><![CDATA[
Dzięki <strong>p_zag</strong> za naprowadzenie. Problem z połączeniem leżał po stronie UUID. <br />Z tego co doczytałem na stronach polecanych przez Ciebie <div class="codetitle"><b>Code:</b></div><div class="codecontent">UUID.fromString(&quot;00001101-0000-1000-8000-00805F9B34FB&quot;);</div> jest dla połączeń serialowych (com). Po podstawieniu do kodu łączy się bez problemu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=819">panbosman</a> — 26 lut 2015, o 07:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[p_zag]]></name></author>
<updated>2015-02-21T11:25:56+01:00</updated>
<published>2015-02-21T11:25:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=120179#p120179</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=120179#p120179"/>
<title type="html"><![CDATA[Re: JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=120179#p120179"><![CDATA[
Do komunikacji bluetooth androida przeanalizuj to <a href="http://developer.android.com/guide/topics/connectivity/bluetooth.html"  class="postlink">http://developer.android.com/guide/topics/connectivity/bluetooth.html</a> co prawda po angielsku , ale tłumacz google trochę pomoże, zwróć uwagę na kod wątku inicjującego połączenie &quot;private class ConnectThread extends Thread {...}&quot;. Poczytaj też o klasie &quot;android.os.Handler&quot; procedurze w tej klasie zawartej o nazwie &quot;public void handleMessage(Message msg)&quot;,oraz poczytaj też o klasie &quot;android.os.Message&quot;, &quot;java.io.InputStream&quot; , &quot;java.io.OutputStream&quot;. <br />To na razie tyle.<br /><br />PS. mam nadzieje, że wiesz co to UUID  - dla połączeń SPP to  &quot;private final UUID MY_UUID = UUID.fromString(&quot;00001101-0000-1000-8000-00805F9B34FB&quot;);&quot;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=539">p_zag</a> — 21 lut 2015, o 11:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[panbosman]]></name></author>
<updated>2015-02-20T10:48:02+01:00</updated>
<published>2015-02-20T10:48:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=119972#p119972</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=119972#p119972"/>
<title type="html"><![CDATA[Re: JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=119972#p119972"><![CDATA[
<strong>p_zag</strong> czy możesz podesłać namiary na kod komunikacji BT z wysyłaniem danych? Przeglądam sieć i nie mogę znaleźć nic działającego do analizy i nauki. <br />ps. Umiem wł/wył BT, wykryć inne, sparowane. <br />Utknąłem na połączeniu ze sparowanym.<br />Dodam tylko, że javę poznaję dopiero od tygodnia z twojego poradnika bo jest dla mnie dobrze napisany.<br />Nawet nie śmię pytać, czy możesz umieścić kod na androida o którym pisałeś. Znacznie ułatwiło by mi to naukę.<br />Dziękuję za poradnik.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=819">panbosman</a> — 20 lut 2015, o 10:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[p_zag]]></name></author>
<updated>2015-02-16T20:34:47+01:00</updated>
<published>2015-02-16T20:34:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=119443#p119443</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=119443#p119443"/>
<title type="html"><![CDATA[Re: JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=119443#p119443"><![CDATA[
Napisać kurs na androida? - pewnie, że mogę. Aktualnie jestem w fazie końcowych testów komunikacji bluetooth między androidem w wersji 2.3.6 (bo taki mam na moim testowym telefonie) a procesorem Atmega8 z modułem bluetooth ATB-BTM-222. No i wszystko działa, komunikacja jest między procesorem Atmega8 a androidem w dwie strony. <br />Pewnie jak znajdę trochę czasu to zacznę pisać taki poradnik, a pisanie poradnika też zajmuje dużo czasu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=539">p_zag</a> — 16 lut 2015, o 20:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[panbosman]]></name></author>
<updated>2015-02-16T18:47:57+01:00</updated>
<published>2015-02-16T18:47:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=119415#p119415</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=119415#p119415"/>
<title type="html"><![CDATA[Re: JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=119415#p119415"><![CDATA[
Witam.<br />Sporo się dowiedziałem z twojego kursu. Bardzo dziękuję.<br />A może tak mógłbyś napisać kurs o javie na androida? <br />Byłbym niezmiernie wdzięczny.<br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=819">panbosman</a> — 16 lut 2015, o 18:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[p_zag]]></name></author>
<updated>2014-08-10T09:59:49+01:00</updated>
<published>2014-08-10T09:59:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=90902#p90902</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=90902#p90902"/>
<title type="html"><![CDATA[Re: JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=90902#p90902"><![CDATA[
No cóż, lubię to (czyli - język Java SE i środowisko Eclipse). Udało mi się połączyć programowanie w Javie i programowanie procesorów AVR w języku C w jednym środowisku Eclipse.<br /><a href="http://forum.atnel.pl/_obrazki/o/539/75b53e79815c60546283836386808cbf.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/75b53e79815c60546283836386808cbf.jpg" alt="Obrazek" /></a><br />Obecnie uczę się programowania smartfona Samsung GT-S5300 do komunikowania się z AVR'ami przez bluetooth wykorzystując język Java, a to wszystko w środowisku Eclipse (a korzystam z tego programu -&gt; adt-bundle-windows-x86_64-20130729.zip).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=539">p_zag</a> — 10 sie 2014, o 09:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[michciobb]]></name></author>
<updated>2014-08-09T22:30:00+01:00</updated>
<published>2014-08-09T22:30:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=90876#p90876</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=90876#p90876"/>
<title type="html"><![CDATA[Re: JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=90876#p90876"><![CDATA[
Super, że chciało Ci się stworzyć taki tutorial. Dla początkującego w programowaniu to nieoceniona pomoc. Thx.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5403">michciobb</a> — 9 sie 2014, o 22:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[p_zag]]></name></author>
<updated>2014-04-05T12:21:07+01:00</updated>
<published>2014-04-05T12:21:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=77029#p77029</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=77029#p77029"/>
<title type="html"><![CDATA[Re: JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=77029#p77029"><![CDATA[
Witam<br />Wczoraj zapomniałem ustawić  komponent &quot;btnNawButton_1&quot; jego własność &quot;enabled&quot; na &quot;false&quot;, ale to już dzisiaj poprawiłem. Wartość &quot;true&quot; powodowała, że można było wysyłać dane przed otwarciem portu. Po poprawce klawisz &quot;btnNawButton_1&quot; jest aktywny tylko gdy port jest otwarty.<br />Było nie było, ale kilka godzin taki poradnik się tworzy.<br /> <br /> Piotr<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=539">p_zag</a> — 5 kwi 2014, o 12:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[p_zag]]></name></author>
<updated>2014-04-04T21:33:47+01:00</updated>
<published>2014-04-04T21:33:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=76997#p76997</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=76997#p76997"/>
<title type="html"><![CDATA[JAVA: Jak zrobić komunikację RS232-COM część_4]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6639&amp;p=76997#p76997"><![CDATA[
Witam wszystkich.<br />Dzisiaj zajmiemy się zajmiemy się pisaniem procedur, tworzeniem zdarzeń(events), oraz kosmetyką(dodaniem obrazków, itp).<br />Po ustawieniu w panelu tworzenia naszej aplikacji zakładki  „Source”(zakładka z kodem) należy wkleić  kod pomiędzy klamrę ( „}”) ostatnią kończąca klasę główną naszej aplikacji, a klamrę („}//koniec”)  kończącą funkcję „ListaPortow()”. <br /><a href="http://forum.atnel.pl/_obrazki/o/539/29d5d6a2be52315e6bfa767e72909afe.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/29d5d6a2be52315e6bfa767e72909afe.jpg" alt="Obrazek" /></a><br />[syntax=java]// procedura otwierajaca port do komunikacji<br />public void OtwarciePortu(String getPort, int baudRate) {<br />boolean stanportu = false;<br />try {<br />portIdentifier = CommPortIdentifier.getPortIdentifier(getPort);<br />} catch (NoSuchPortException e) {<br />System.out.println(e.toString());<br />}<br />if (portIdentifier.isCurrentlyOwned()) { // testowanie portu<br />System.out.println(&quot;... Port &quot; + portIdentifier.getName()<br />+ &quot; jest zajęty - nie otwieram tego portu ...&quot;);<br />} else { // port wolny mozna otwierac ...<br />CommPort commPort = null;<br />try {<br />// tytul aplikacji, czas otwarcia aplikacji<br />commPort = portIdentifier.open(this.getTitle(), 2000);<br />} catch (PortInUseException e) {<br />System.out.println(&quot; --- Niemogę otworzyć portu &quot;<br />+ portIdentifier.getName() + &quot; !!!... --- &quot;);<br />System.out.println(e.toString());<br />}<br />serialPort = (SerialPort) commPort;<br />try {<br />// inicjalizacja strumienia wejsciowego<br />inputStream = serialPort.getInputStream();<br />System.out<br />.println(&quot;  ... inicjalizacja strumienia wejściowego&quot;);<br />// inicjalizacja strumienia wyjsciowego<br />outputStream = serialPort.getOutputStream();<br />System.out<br />.println(&quot;  ... inicjalizacja strumienia wyjściowego&quot;);<br />} catch (IOException e) {<br />System.out.println(e.toString());<br />stanportu = true;<br />}<br />if (stanportu) {<br />ZamknieciePortu();<br />javax.swing.JOptionPane.showMessageDialog(<br />new javax.swing.JFrame(), &quot;Uwaga!... &quot; + getPort<br />+ &quot; ten port jest zajęty...&quot;);<br />} else {<br />// --- właczenie zdarzen portu RS (true) ---<br />serialPort.notifyOnBreakInterrupt(false);<br />serialPort.notifyOnFramingError(false);<br />serialPort.notifyOnParityError(false);<br />serialPort.notifyOnOverrunError(false);<br />serialPort.notifyOnCarrierDetect(false);<br />serialPort.notifyOnRingIndicator(false);<br />serialPort.notifyOnDSR(false);<br />serialPort.notifyOnCTS(false);<br />serialPort.notifyOnOutputEmpty(false);<br />serialPort.notifyOnDataAvailable(true); // odczyt portu<br />// --- wlaczenie zdarzen portu RS ---<br />try {<br />serialPort.setSerialPortParams(baudRate,<br />SerialPort.DATABITS_8, SerialPort.STOPBITS_1,<br />SerialPort.PARITY_NONE);<br />serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);// opcjonalnie<br />} catch (UnsupportedCommOperationException e) {<br />System.out.println(e.toString());<br />}<br />try {<br />// inicjalizacja listenera do obslugi zdarzeń<br />serialPort.addEventListener(this);<br />System.out<br />.println(&quot;  ... inicjalizacja listenera do obslugi zdarzeń na RS232&quot;);<br />} catch (TooManyListenersException ex) {<br />System.out.println(ex.toString());<br />}<br />System.out.println(&quot;  ... port RS232 został otwarty ...&quot;);<br />}<br />}<br />}// koniec<br /><br />// procedura zamykajaca port<br />public void ZamknieciePortu() { <br />if (inputStream != null) {<br />try {<br />inputStream.close(); // zamknięcie strumienia<br />System.out.println(&quot;  ... zamknięcie strumienia wejsciowego&quot;);<br />} catch (IOException ex) {<br />System.out.println(ex.toString());<br />}<br />}<br />if (outputStream != null) {<br />try {<br />outputStream.close(); // zamknięcie strumienia<br />System.out.println(&quot;  ... zamknięcie strumienia wyjsciowego&quot;);<br />} catch (IOException ex) {<br />System.out.println(ex.toString());<br />}<br />}<br />if (serialPort != null) {<br />// usunięcie listenera do obslugi zdarzeń<br />serialPort.removeEventListener();<br />System.out<br />.println(&quot;  ... usunięcie listenera do obslugi zdarzeń na RS232&quot;);<br />serialPort.close(); // zamknięcie portu<br />System.out.println(&quot;  ... port RS232 został zamknięty ...&quot;);<br />}<br />}// koniec<br /><br />// procedura wysyłająca dane na port<br />public void ZapiszBuforDoPortu(String dane) {<br />// .concat(Character.toString('\r')) -&gt; doklejenie znaku '\r'<br />dane = dane.concat(Character.toString('\r'));<br />try {<br />// wysyla do portu dane<br />outputStream.write(dane.getBytes());<br />outputStream.flush(); // czyszczenie strumienia wysylajacego dane<br />} catch (IOException ex) {<br />System.out.println(ex.toString());<br />}<br />}// koniec<br /><br />// procedura odbierająca dane z portu<br />@Override<br />public void serialEvent(SerialPortEvent arg0) {<br />switch (arg0.getEventType()) {<br />// --- odczyt zdarzeń odczytanych z portu ---<br />case SerialPortEvent.BI:<br />break;<br />case SerialPortEvent.OE:<br />break;<br />case SerialPortEvent.FE:<br />break;<br />case SerialPortEvent.PE:<br />break;<br />case SerialPortEvent.CD:<br />break;<br />case SerialPortEvent.CTS:<br />break;<br />case SerialPortEvent.DSR:<br />break;<br />case SerialPortEvent.RI:<br />break;<br />case SerialPortEvent.OUTPUT_BUFFER_EMPTY:<br />break;<br />case SerialPortEvent.DATA_AVAILABLE:<br />try {<br />// ilość bajtów odczytana ze strumienia<br />int nb = inputStream.available();<br />// odczyt buforowany danych ze strunienia<br />while (nb &gt; 0) {<br />byte&#91;&#93; readBuffer = new byte&#91;nb&#93;;<br />inputStream.read(readBuffer);<br />String str = new String(readBuffer);<br />// str = str.replace(&quot;\r&quot;,&quot;\n&quot;);<br />textArea.append(str + &quot;\n&quot;);<br />nb = inputStream.available();<br />}<br />} catch (IOException ex) {<br />ex.printStackTrace();<br />}<br />// Podążaanie za tekstem odczytu<br />textArea.setCaretPosition(textArea.getText().length());<br />break;<br />// --- odczyt zdarzeń odczytanych z portu ---<br />}<br />}// koniec[/syntax]<br />Są to procedury do obsługi portu RS232: otwarcia portu, wysyłki danych, odbioru danych, zamknięcia portu. Analizę tych procedur zastawiam jako zadanie domowe, dopowiem tylko, że w procedurze „public void serialEvent(SerialPortEvent arg0) { … }” są cyklicznie odbierane dane tym zdarzeniem „case SerialPortEvent.DATA_AVAILABLE:”.Teraz należałoby dopisać kilka zmiennych związanych z powyższymi procedurami. W miejscu zaznaczonym na rysunku poniżej.<br /><a href="http://forum.atnel.pl/_obrazki/o/539/6902f30373204fc68233ea4f32c2600f.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/6902f30373204fc68233ea4f32c2600f.jpg" alt="Obrazek" /></a><br />[syntax=java]private CommPortIdentifier portIdentifier;<br />private SerialPort serialPort;<br />private InputStream inputStream;<br />private OutputStream outputStream;<br />private String nazwaPortuCOM;<br />private int baudRateCOM;<br />private boolean portOFF;[/syntax]<br />Musimy jeszcze dodać nasłuchiwacza portu  czyli w miejscu jak na rysunku<br /><a href="http://forum.atnel.pl/_obrazki/o/539/3ccd658b2869d62af0d6e8412d99a82d.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/3ccd658b2869d62af0d6e8412d99a82d.jpg" alt="Obrazek" /></a><br />[syntax=java]public class Terminal extends JFrame {[/syntax]<br />dopisujemy „implements SerialPortEventListener”<br />[syntax=java]public class Terminal extends JFrame implements SerialPortEventListener {[/syntax]<br />Teraz zajmiemy się mnóstwem żaróweczek z czerwonym krzyżykiem po prawej stronie naszego panelu. Zaczynam y od samej góry klikając(LPM) na żaróweczkę (przeważnie dodawanie bibliotek – pierwsza opcja(LPM dwuklik). Gdy po dodaniu interfejsu „SerialPortEventListener” pojawi się nam automatycznie wygenerowana procedura<br />[syntax=java]@Override<br />public void serialEvent(SerialPortEvent arg0) { <br />// TODO Auto-generated metod stub<br />}[/syntax]<br />należy ją usunąć, bo prędzej tą procedurę wkleiliśmy do naszego kodu (procedura odbierająca dane z portu). I dalej klikając(LPM) na żaróweczkę (przeważnie dodawanie bibliotek – pierwsza opcja(LPM dwuklik), na razie nic nie robić z żółtymi żaróweczkami z wykrzyknikiem. Jest ich trzy przy zmiennych – informują, że te zmienne nie są jeszcze używane.<br /><a href="http://forum.atnel.pl/_obrazki/o/539/c62a59f0e47357e59cd2b9ce45a63a7a.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/c62a59f0e47357e59cd2b9ce45a63a7a.jpg" alt="Obrazek" /></a><br />Musimy jeszcze wkleić kawałek kody ko konstruktora w miejscu jak na rysunku poniżej.<br /><a href="http://forum.atnel.pl/_obrazki/o/539/c809e0a513cb0827519d481a516b79f4.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/c809e0a513cb0827519d481a516b79f4.jpg" alt="Obrazek" /></a><br />[syntax=java]comboBox.setSelectedIndex(0);<br />nazwaPortuCOM = (String) comboBox.getSelectedItem();<br />comboBox_1.setSelectedIndex(5);<br />baudRateCOM = Integer.parseInt((String) comboBox_1.getSelectedItem());[/syntax]<br />Teraz przyszedł czas na zdarzenia(events) czyli na komunikację z użytkownikiem. W tym celu przechodzimy zakładkę „Design” w panelu tworzenia naszej aplikacji (zakładka na której budujemy naszą aplikację) i zaznaczamy komponent o nazwie „comboBox” i w „Structure -&gt; Properties” klikamy na klawisz zdarzeń jak na rysunku poniżej.<br /><a href="http://forum.atnel.pl/_obrazki/o/539/95cded2a3a02da26de2daa4c0e4e63ef.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/95cded2a3a02da26de2daa4c0e4e63ef.jpg" alt="Obrazek" /></a><br />Szukamy zdarzenia „item  -&gt; stateChanged” i klikamy na nim(LPM dwuklik). Eclipse przerzuci nas do zakładki pisania kodu („Source”) do tego zdarzenia w celu wpisania kodu. To też to czynimy i wpisujemy poniższy kod<br />[syntax=java]nazwaPortuCOM = (String) comboBox.getSelectedItem();[/syntax]<br />Przechodzimy na zakładkę  „Design” w panelu tworzenia naszej aplikacji (zakładka na której budujemy naszą aplikację)  zaznaczamy komponent o nazwie „comboBox_1” (zdarzenia są już zaznaczone) i postępujemy tak samo jak wyżej wpisując<br />[syntax=java]baudRateCOM = Integer.parseInt((String) comboBox_1.getSelectedItem());[/syntax]<br />Przechodzimy na zakładkę  „Design” w panelu tworzenia naszej aplikacji (zakładka na której budujemy naszą aplikację) i zaznaczamy komponent o nazwie „btnNewButton” (zdarzenia są już zaznaczone). Szukamy zdarzenia „action  -&gt; performed” i klikamy na nim(LPM dwuklik). Eclipse przerzuci nas do zakładki pisania kodu („Source”) do tego zdarzenia w celu wpisania kodu. To też to czynimy i wpisujemy poniższy kod<br />[syntax=java]if (portOFF) {<br />portOFF = false;<br />comboBox.setEnabled(true);<br />comboBox_1.setEnabled(true);<br />btnNewButton_1.setEnabled(false);<br />textArea.setText(&quot;&quot;);<br />textArea_1.setText(&quot;&quot;);<br />btnNewButton.setText(&quot;Open&quot;);<br />ZamknieciePortu();<br />lblNewLabel.setText(&quot;port zamknięty ...&quot;);<br />} else {<br />portOFF = true;<br />comboBox.setEnabled(false);<br />comboBox_1.setEnabled(false);<br />btnNewButton.setText(&quot;Close&quot;);<br />btnNewButton_1.setEnabled(true);<br />OtwarciePortu(nazwaPortuCOM, baudRateCOM);<br />lblNewLabel.setText(&quot;port otwarty:    &quot; + nazwaPortuCOM + &quot;  &quot;<br />+ baudRateCOM + &quot;  &quot; + SerialPort.DATABITS_8 + &quot;  &quot;<br />+ SerialPort.STOPBITS_1 + &quot;  &quot; + SerialPort.PARITY_NONE);<br />textArea_1.grabFocus();<br />}[/syntax]<br />Przechodzimy na zakładkę  „Design” w panelu tworzenia naszej aplikacji (zakładka na której budujemy naszą aplikację)  zaznaczamy komponent o nazwie „btnNewButton _1” (zdarzenia są już zaznaczone) i postępujemy tak samo jak wyżej wpisując<br />[syntax=java]ZapiszBuforDoPortu(textArea_1.getText());<br />textArea_1.setText(&quot;&quot;);<br />textArea_1.grabFocus();[/syntax]<br />Na koniec dodajmy jeszcze zdarzenie zamykające port, gdy z jakiś przyczyn zamkniemy naszą aplikację krzyżykiem zamknięcia programu. Przechodzimy na zakładkę  „Design” w panelu tworzenia naszej aplikacji (zakładka na której budujemy naszą aplikację) zaznaczamy formatkę (najlepiej na belce formatki). Szukamy zdarzenia „window  -&gt; closing” i klikamy na nim(LPM dwuklik). Eclipse przerzuci nas do zakładki pisania kodu („Source”) do tego zdarzenia w celu wpisania kodu. To też to czynimy i wpisujemy poniższy kod<br /><a href="http://forum.atnel.pl/_obrazki/o/539/733624d188b0094f3df964dca10847dd.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/733624d188b0094f3df964dca10847dd.jpg" alt="Obrazek" /></a><br />[syntax=java]ZamknieciePortu();[/syntax]<br />A teraz zajmiemy się kosmetyką. <br />Przechodzimy na zakładkę  „Design” w panelu tworzenia naszej aplikacji. I wyłączamy zdarzenia jasze raz klikając, aż zniknie zaznaczenie (opuszczamy zdarzenia)<br /><a href="http://forum.atnel.pl/_obrazki/o/539/a1581d43d91a3c365402aae871c4c164.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/a1581d43d91a3c365402aae871c4c164.jpg" alt="Obrazek" /></a><br />Możemy kliknąć w klawisz rozszerzonych właściwości<br /><a href="http://forum.atnel.pl/_obrazki/o/539/b1bd4ca95c6d943e98becb043f3dcf3a.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/b1bd4ca95c6d943e98becb043f3dcf3a.jpg" alt="Obrazek" /></a><br />Do powrotu do domyślnych ustawień służy klawisz na rysunku poniżej<br /><a href="http://forum.atnel.pl/_obrazki/o/539/8356db96e88317eb4e218434b7346260.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/8356db96e88317eb4e218434b7346260.jpg" alt="Obrazek" /></a><br />Przechodzimy do panelu „Package Explorer”, a w nim do naszej aplikacji „COM Port Terminal -&gt; src -&gt; New -&gt; Package” klikając na „Package”.<br /><a href="http://forum.atnel.pl/_obrazki/o/539/91e3c6014f462838e27966b87b2fe49f.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/91e3c6014f462838e27966b87b2fe49f.jpg" alt="Obrazek" /></a><br />Pokarze się nowe okno gdzie wpisujemy nazwę i zatwierdzamy klawiszem.<br /><a href="http://forum.atnel.pl/_obrazki/o/539/5fc3f6ce657f7fc96b0630f7024bc853.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/5fc3f6ce657f7fc96b0630f7024bc853.jpg" alt="Obrazek" /></a><br />Mamy już miejsce na obrazki (najlepiej 24x24 pikseli) Ja zastosowałem obrazki 32x32 pikseli. Obrazki należy skopiować z dowolnego miejsca na dysku i zwyczajnie wkleić do „Image”(przed chwilą go utworzyliśmy) przez kopiuj-wklej<br /><a href="http://forum.atnel.pl/_obrazki/o/539/ae2affa93e0f6b70a2fa1f64e7d4c2e9.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/ae2affa93e0f6b70a2fa1f64e7d4c2e9.jpg" alt="Obrazek" /></a><br />Teraz zaznaczamy formatkę (najlepiej na belce formatki) i przechodzimy do „ Structure -&gt; Properties -&gt; title” klikamy na klawisz po prawej stronie „…”. Pokarze się nowe okno o nazwie „String editor” a w nim wpisujemy słowo „Treminal” i klikamy na klawisz „OK”.<br /><a href="http://forum.atnel.pl/_obrazki/o/539/55e2759a66d4513208a5f413e5900047.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/55e2759a66d4513208a5f413e5900047.jpg" alt="Obrazek" /></a><br />Na tej samej fornatce zaznaczamy „Structure -&gt; Properties -&gt; iconImage”  klikamy na klawisz po prawej stronie „…”. Pokarze się nowe okno o nazwie „Image chooser” a w nim klikamy na”Classpath….” , a w okienku na „src -&gt; Image -&gt; Laptop-32.png” i klikamy na klawisz „OK”. (Laptop-32.png – to mój obrazek ty możesz mieć inny własny obrazek).<br /><a href="http://forum.atnel.pl/_obrazki/o/539/4512136176abe7376f38771a27952a2a.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/4512136176abe7376f38771a27952a2a.jpg" alt="Obrazek" /></a><br />To samo powtórz dla:<br /> Klawisz „btnNewButton”  <br /> text  ---   „Open”   <br />icon  ---   „World-32.png”<br /> klawisz „btnNewButton _1”<br />enabled  --- false<br />text  ---   „Open”   <br />icon  ---   „World-32.png”<br />Ze względu na obrazki na button’ach kliknij na formatkę na jej prawą krawędź i nie puszczając myszki przeciągnij na prawo do 500 pikseli. Potem kliknij na dolną krawędź formatki i trzymając myszką przeciągnij w dól na 350 pikseli.<br />Kliknij na komponent o nazwie „lblNewLabel”  i tytule „New label”. We właściwościach odszukaj „ Structure -&gt; Properties -&gt; text” klikamy na klawisz po prawej stronie „…”. Pokarze się nowe okno o nazwie „String editor” a w nim wpisujemy słowo „port zamknięty …” i klikamy na klawisz „OK”. Później  wybierz właściwość  „ Structure -&gt; Properties -&gt; font” klikamy na klawisz po prawej stronie „…”. Pokarze się nowe okno o nazwie „Font chooser” a w nim wpisujemy rozmiar na 15 pikseli i klikamy na klawisz „OK”.<br />Teraz zaznaczamy komponent o nazwie „textArea” wybieramy właściwość „ Structure -&gt; Properties -&gt; editable” i „zaptaszkujemy kwadracik” – m być true.<br />Przyszedł czas na tworzenie pliku jar. W panelu o nazwie „Package Explorer”  klikamy(PPM) na naszej aplikacji „COM Port Terminal -&gt;  Export …”<br /><a href="http://forum.atnel.pl/_obrazki/o/539/e32373efca3b8551c3f642921d941629.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/e32373efca3b8551c3f642921d941629.jpg" alt="Obrazek" /></a><br />Pojawi się nowe okno „Export” a w nim zaznacz „Runnable JAR file” i kliknij klawisz „Next”.<br /><a href="http://forum.atnel.pl/_obrazki/o/539/c0b2ecf79f1a342fc1f1b59ec73e5e09.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/c0b2ecf79f1a342fc1f1b59ec73e5e09.jpg" alt="Obrazek" /></a><br />Pojawi się nowe okno „Runnable JAR File Export” i tu wybrać naszą aplikację, oraz podać gdzie ma być tworzony plik jar i jaka ma być jego nazwa. Potem klawisz „Finish”.<br /><a href="http://forum.atnel.pl/_obrazki/o/539/b26e59dcbf425779cd1fc3aaa5b1e782.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/b26e59dcbf425779cd1fc3aaa5b1e782.jpg" alt="Obrazek" /></a><br />Potem w oknie informacyjnym kliknąć  klawisz  „OK”. No i to wszystko.<br /><a href="http://forum.atnel.pl/_obrazki/o/539/abd26772ee83decf9968155cd8c87718.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/539/abd26772ee83decf9968155cd8c87718.jpg" alt="Obrazek" /></a><br /><br />Na koniec dodam, że typ zmiennych AVR „uint_8” ma wartość od 0 do 255, a odpowiednik w języku Java typ „Byte” ma wartość od -128 do 127 dlatego trzeba konwertować typy.<br />[syntax=java]// zamienia avr bajt 'a' na java int bez znaku (odpowiednik w języku Java typowi AVR uint_8)<br />public int unsignedToBytes(byte a) {<br />int b = (a &amp; 0xFF);<br />return b;<br />}// koniec[/syntax]<br />No i kilka przydatnych funkcji<br />[syntax=java]// czy w bajcie 'b' jest ustawiony bit 'bit'<br />public Boolean isBitSet(byte b, int bit) {<br />return (b &amp; (1 &lt;&lt; bit)) != 0;<br />}// koniec<br /><br />// zamienia bajt na hex'a typu String<br />public String toHEX(byte value) {<br />return java.lang.Integer.toHexString(unsignedToBytes(value));<br />}// koniec<br /><br />// zamienia bajt na liczbe binarna typu String<br />public String toBIN(byte value) {<br />return java.lang.Integer.toBinaryString(unsignedToBytes(value));<br />}// koniec<br /><br />// liczba int do tablicy bajtow<br />public byte&#91;&#93; intToByteArray(int value) {<br />return new byte&#91;&#93; { (byte) (value &gt;&gt;&gt; 24), (byte) (value &gt;&gt;&gt; 16),<br />(byte) (value &gt;&gt;&gt; 8), (byte) value };<br />}// koniec[/syntax]<br />Mam nadzieje, że komuś przydał się mój poradnik i posypią się aplikacje w języku Java. A na deser zajmiemy się konwersją *. jar w *.exe , oraz klasą umożliwiającą pracę w tle,  no ale to  za tydzień.<br /><br />Piotr<br /><br />A to cały kod  poradnika<br />[syntax=java]package paczka;<br /><br />import gnu.io.CommPort;<br />import gnu.io.CommPortIdentifier;<br />import gnu.io.NoSuchPortException;<br />import gnu.io.PortInUseException;<br />import gnu.io.SerialPort;<br />import gnu.io.SerialPortEvent;<br />import gnu.io.SerialPortEventListener;<br />import gnu.io.UnsupportedCommOperationException;<br /><br />import java.awt.BorderLayout;<br />import java.awt.EventQueue;<br /><br />import javax.swing.JFrame;<br />import javax.swing.JPanel;<br />import javax.swing.border.EmptyBorder;<br /><br />import java.awt.Dimension;<br />import java.awt.GridLayout;<br />import java.io.IOException;<br />import java.io.InputStream;<br />import java.io.OutputStream;<br />import java.util.ArrayList;<br />import java.util.Enumeration;<br />import java.util.TooManyListenersException;<br /><br />import javax.swing.JTextArea;<br />import javax.swing.JScrollPane;<br />import javax.swing.JComboBox;<br />import javax.swing.JButton;<br />import javax.swing.JLabel;<br />import javax.swing.SwingConstants;<br />import javax.swing.border.TitledBorder;<br />import javax.swing.UIManager;<br />import javax.swing.DefaultComboBoxModel;<br />import java.awt.event.ItemListener;<br />import java.awt.event.ItemEvent;<br />import java.awt.event.ActionListener;<br />import java.awt.event.ActionEvent;<br />import java.awt.event.WindowAdapter;<br />import java.awt.event.WindowEvent;<br />import java.awt.Toolkit;<br />import javax.swing.ImageIcon;<br />import java.awt.Font;<br /><br />public class Terminal extends JFrame implements SerialPortEventListener {<br /><br />/**<br /> * <br /> */<br />private static final long serialVersionUID = 1L;<br />private JPanel contentPane;<br />private final JPanel panel = new JPanel();<br />private final JPanel panel_1 = new JPanel();<br />private final JPanel panel_2 = new JPanel();<br />private final JScrollPane scrollPane = new JScrollPane();<br />private final JScrollPane scrollPane_1 = new JScrollPane();<br />private final JTextArea textArea = new JTextArea();<br />private final JTextArea textArea_1 = new JTextArea();<br />private final JComboBox&lt;String&gt; comboBox = new JComboBox&lt;String&gt;();<br />private final JComboBox&lt;String&gt; comboBox_1 = new JComboBox&lt;String&gt;();<br />private final JButton btnNewButton = new JButton(&quot;Open&quot;);<br />private final JButton btnNewButton_1 = new JButton(&quot;Send&quot;);<br />private final JLabel lblNewLabel = new JLabel(&quot;port zamkni\u0119ty ...&quot;);<br /><br />private CommPortIdentifier portIdentifier;<br />private SerialPort serialPort;<br />private InputStream inputStream;<br />private OutputStream outputStream;<br />private String nazwaPortuCOM;<br />private int baudRateCOM;<br />private boolean portOFF;<br /><br />/**<br /> * Launch the application.<br /> */<br />public static void main(String&#91;&#93; args) {<br />try {<br />UIManager.setLookAndFeel(&quot;javax.swing.plaf.nimbus.NimbusLookAndFeel&quot;);<br />} catch (Throwable e) {<br />e.printStackTrace();<br />}<br />EventQueue.invokeLater(new Runnable() {<br />public void run() {<br />try {<br />Terminal frame = new Terminal();<br />frame.setVisible(true);<br />} catch (Exception e) {<br />e.printStackTrace();<br />}<br />}<br />});<br />} <br /><br />/**<br /> * Create the frame.<br /> */<br />public Terminal() {<br />initComponents();<br />comboBox.setSelectedIndex(0);<br />nazwaPortuCOM = (String) comboBox.getSelectedItem();<br />comboBox_1.setSelectedIndex(5);<br />baudRateCOM = Integer.parseInt((String) comboBox_1.getSelectedItem());<br />}<br /><br />private void initComponents() {<br />setIconImage(Toolkit.getDefaultToolkit().getImage(Terminal.class.getResource(&quot;/Image/Laptop-32.png&quot;)));<br />setTitle(&quot;Terminal&quot;);<br />addWindowListener(new WindowAdapter() {<br />@Override<br />public void windowClosing(WindowEvent arg0) {<br />do_this_windowClosing(arg0);<br />}<br />});<br />setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />setBounds(100, 100, 500, 350);<br />contentPane = new JPanel();<br />contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));<br />setContentPane(contentPane);<br />contentPane.setLayout(new BorderLayout(0, 0));<br />{<br />panel.setBorder(new EmptyBorder(10, 0, 10, 0));<br />panel.setPreferredSize(new Dimension(10, 50));<br />contentPane.add(panel, BorderLayout.NORTH);<br />}<br />panel.setLayout(new GridLayout(1, 4, 20, 0));<br />comboBox.addItemListener(new ItemListener() {<br />public void itemStateChanged(ItemEvent arg0) {<br />do_comboBox_itemStateChanged(arg0);<br />}<br />});<br />comboBox.setModel(new DefaultComboBoxModel&lt;String&gt;(ListaPortow()));<br />panel.add(comboBox);<br />{<br />comboBox_1.addItemListener(new ItemListener() {<br />public void itemStateChanged(ItemEvent e) {<br />do_comboBox_1_itemStateChanged(e);<br />}<br />});<br />comboBox_1.setModel(new DefaultComboBoxModel&lt;String&gt;(new String&#91;&#93; {&quot;2400&quot;, &quot;4800&quot;, &quot;7200&quot;, &quot;9600&quot;, &quot;14400&quot;, &quot;19200&quot;, &quot;38400&quot;, &quot;57600&quot;, &quot;115200&quot;, &quot;128000&quot;}));<br />panel.add(comboBox_1);<br />}<br />{<br />btnNewButton.setIcon(new ImageIcon(Terminal.class.getResource(&quot;/Image/World-32.png&quot;)));<br />btnNewButton.addActionListener(new ActionListener() {<br />public void actionPerformed(ActionEvent arg0) {<br />do_btnNewButton_actionPerformed(arg0);<br />}<br />});<br />panel.add(btnNewButton);<br />}<br />{<br />                        btnNewButton_1.setEnabled(false);<br />btnNewButton_1.setIcon(new ImageIcon(Terminal.class.getResource(&quot;/Image/User-32.png&quot;)));<br />btnNewButton_1.addActionListener(new ActionListener() {<br />public void actionPerformed(ActionEvent arg0) {<br />do_btnNewButton_1_actionPerformed(arg0);<br />}<br />});<br />panel.add(btnNewButton_1);<br />}<br />{<br />contentPane.add(panel_1, BorderLayout.CENTER);<br />}<br />panel_1.setLayout(new GridLayout(2, 1, 0, 0));<br />{<br />panel_1.add(scrollPane);<br />}<br />{<br />textArea.setBorder(new TitledBorder(null, &quot;odbi\u00F3r&quot;, TitledBorder.LEADING, TitledBorder.TOP, null, null));<br />textArea.setEditable(false);<br />scrollPane.setViewportView(textArea);<br />}<br />{<br />panel_1.add(scrollPane_1);<br />}<br />{<br />textArea_1.setBorder(new TitledBorder(null, &quot;wysy\u0142ka&quot;, TitledBorder.LEADING, TitledBorder.TOP, null, null));<br />scrollPane_1.setViewportView(textArea_1);<br />}<br />{<br />panel_2.setPreferredSize(new Dimension(10, 50));<br />contentPane.add(panel_2, BorderLayout.SOUTH);<br />}<br />panel_2.setLayout(new BorderLayout(0, 0));<br />{<br />lblNewLabel.setFont(new Font(&quot;SansSerif&quot;, Font.PLAIN, 15));<br />lblNewLabel.setHorizontalAlignment(SwingConstants.CENTER);<br />panel_2.add(lblNewLabel, BorderLayout.CENTER);<br />}<br />}<br /><br />//procedura listujaca porty szeregowe<br />    public String&#91;&#93; ListaPortow() {<br />        Enumeration&lt;?&gt; ports = CommPortIdentifier.getPortIdentifiers();<br />        ArrayList&lt;String&gt; lista = new ArrayList&lt;String&gt;();<br />        while (ports.hasMoreElements()) {<br />            CommPortIdentifier port = (CommPortIdentifier) ports.nextElement();<br />            if (port.getPortType() == CommPortIdentifier.PORT_SERIAL) {<br />                lista.add(port.getName());<br />            }<br />        }<br />        String portArray&#91;&#93;;<br />        portArray = (String&#91;&#93;) lista.toArray(new String&#91;0&#93;);<br />        return portArray;<br />    }//koniec<br /><br />// procedura otwierajaca port do komunikacji<br />public void OtwarciePortu(String getPort, int baudRate) {<br />boolean stanportu = false;<br />try {<br />portIdentifier = CommPortIdentifier.getPortIdentifier(getPort);<br />} catch (NoSuchPortException e) {<br />System.out.println(e.toString());<br />}<br />if (portIdentifier.isCurrentlyOwned()) { // testowanie portu<br />System.out.println(&quot;... Port &quot; + portIdentifier.getName()<br />+ &quot; jest zajęty - nie otwieram tego portu ...&quot;);<br />} else { // port wolny mozna otwierac ...<br />CommPort commPort = null;<br />try {<br />// tytul aplikacji, czas otwarcia aplikacji<br />commPort = portIdentifier.open(this.getTitle(), 2000);<br />} catch (PortInUseException e) {<br />System.out.println(&quot; --- Niemogę otworzyć portu &quot;<br />+ portIdentifier.getName() + &quot; !!!... --- &quot;);<br />System.out.println(e.toString());<br />}<br />serialPort = (SerialPort) commPort;<br />try {<br />// inicjalizacja strumienia wejsciowego<br />inputStream = serialPort.getInputStream();<br />System.out<br />.println(&quot;  ... inicjalizacja strumienia wejściowego&quot;);<br />// inicjalizacja strumienia wyjsciowego<br />outputStream = serialPort.getOutputStream();<br />System.out<br />.println(&quot;  ... inicjalizacja strumienia wyjściowego&quot;);<br />} catch (IOException e) {<br />System.out.println(e.toString());<br />stanportu = true;<br />}<br />if (stanportu) {<br />ZamknieciePortu();<br />javax.swing.JOptionPane.showMessageDialog(<br />new javax.swing.JFrame(), &quot;Uwaga!... &quot; + getPort<br />+ &quot; ten port jest zajęty...&quot;);<br />} else {<br />// --- właczenie zdarzen portu RS (true) ---<br />serialPort.notifyOnBreakInterrupt(false);<br />serialPort.notifyOnFramingError(false);<br />serialPort.notifyOnParityError(false);<br />serialPort.notifyOnOverrunError(false);<br />serialPort.notifyOnCarrierDetect(false);<br />serialPort.notifyOnRingIndicator(false);<br />serialPort.notifyOnDSR(false);<br />serialPort.notifyOnCTS(false);<br />serialPort.notifyOnOutputEmpty(false);<br />serialPort.notifyOnDataAvailable(true); // odczyt portu<br />// --- wlaczenie zdarzen portu RS ---<br />try {<br />serialPort.setSerialPortParams(baudRate,<br />SerialPort.DATABITS_8, SerialPort.STOPBITS_1,<br />SerialPort.PARITY_NONE);<br />serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);// opcjonalnie<br />} catch (UnsupportedCommOperationException e) {<br />System.out.println(e.toString());<br />}<br />try {<br />// inicjalizacja listenera do obslugi zdarzeń<br />serialPort.addEventListener(this);<br />System.out<br />.println(&quot;  ... inicjalizacja listenera do obslugi zdarzeń na RS232&quot;);<br />} catch (TooManyListenersException ex) {<br />System.out.println(ex.toString());<br />}<br />System.out.println(&quot;  ... port RS232 został otwarty ...&quot;);<br />}<br />}<br />}// koniec<br /><br />// procedura zamykajaca port<br />public void ZamknieciePortu() { <br />if (inputStream != null) {<br />try {<br />inputStream.close(); // zamknięcie strumienia<br />System.out.println(&quot;  ... zamknięcie strumienia wejsciowego&quot;);<br />} catch (IOException ex) {<br />System.out.println(ex.toString());<br />}<br />}<br />if (outputStream != null) {<br />try {<br />outputStream.close(); // zamknięcie strumienia<br />System.out.println(&quot;  ... zamknięcie strumienia wyjsciowego&quot;);<br />} catch (IOException ex) {<br />System.out.println(ex.toString());<br />}<br />}<br />if (serialPort != null) {<br />// usunięcie listenera do obslugi zdarzeń<br />serialPort.removeEventListener();<br />System.out<br />.println(&quot;  ... usunięcie listenera do obslugi zdarzeń na RS232&quot;);<br />serialPort.close(); // zamknięcie portu<br />System.out.println(&quot;  ... port RS232 został zamknięty ...&quot;);<br />}<br />}// koniec<br /><br />// procedura wysyłająca dane na port<br />public void ZapiszBuforDoPortu(String dane) {<br />// .concat(Character.toString('\r')) -&gt; doklejenie znaku '\r'<br />dane = dane.concat(Character.toString('\r'));<br />try {<br />// wysyla do portu dane<br />outputStream.write(dane.getBytes());<br />outputStream.flush(); // czyszczenie strumienia wysylajacego dane<br />} catch (IOException ex) {<br />System.out.println(ex.toString());<br />}<br />}// koniec<br /><br />// procedura odbierająca dane z portu<br />@Override<br />public void serialEvent(SerialPortEvent arg0) {<br />switch (arg0.getEventType()) {<br />// --- odczyt zdarzeń odczytanych z portu ---<br />case SerialPortEvent.BI:<br />break;<br />case SerialPortEvent.OE:<br />break;<br />case SerialPortEvent.FE:<br />break;<br />case SerialPortEvent.PE:<br />break;<br />case SerialPortEvent.CD:<br />break;<br />case SerialPortEvent.CTS:<br />break;<br />case SerialPortEvent.DSR:<br />break;<br />case SerialPortEvent.RI:<br />break;<br />case SerialPortEvent.OUTPUT_BUFFER_EMPTY:<br />break;<br />case SerialPortEvent.DATA_AVAILABLE:<br />try {<br />// ilość bajtów odczytana ze strumienia<br />int nb = inputStream.available();<br />// odczyt buforowany danych ze strunienia<br />while (nb &gt; 0) {<br />byte&#91;&#93; readBuffer = new byte&#91;nb&#93;;<br />inputStream.read(readBuffer);<br />String str = new String(readBuffer);<br />// str = str.replace(&quot;\r&quot;,&quot;\n&quot;);<br />textArea.append(str + &quot;\n&quot;);<br />nb = inputStream.available();<br />}<br />} catch (IOException ex) {<br />ex.printStackTrace();<br />}<br />// Podążaanie za tekstem odczytu<br />textArea.setCaretPosition(textArea.getText().length());<br />break;<br />// --- odczyt zdarzeń odczytanych z portu ---<br />}<br />}// koniec<br />    <br />protected void do_comboBox_itemStateChanged(ItemEvent arg0) {<br />nazwaPortuCOM = (String) comboBox.getSelectedItem();<br />}<br />protected void do_comboBox_1_itemStateChanged(ItemEvent e) {<br />baudRateCOM = Integer.parseInt((String) comboBox_1.getSelectedItem());<br />}<br />protected void do_btnNewButton_actionPerformed(ActionEvent arg0) {<br />if (portOFF) {<br />portOFF = false;<br />comboBox.setEnabled(true);<br />comboBox_1.setEnabled(true);<br />btnNewButton_1.setEnabled(false);<br />textArea.setText(&quot;&quot;);<br />textArea_1.setText(&quot;&quot;);<br />btnNewButton.setText(&quot;Open&quot;);<br />ZamknieciePortu();<br />lblNewLabel.setText(&quot;port zamknięty ...&quot;);<br />} else {<br />portOFF = true;<br />comboBox.setEnabled(false);<br />comboBox_1.setEnabled(false);<br />btnNewButton.setText(&quot;Close&quot;);<br />btnNewButton_1.setEnabled(true);<br />OtwarciePortu(nazwaPortuCOM, baudRateCOM);<br />lblNewLabel.setText(&quot;port otwarty:    &quot; + nazwaPortuCOM + &quot;  &quot;<br />+ baudRateCOM + &quot;  &quot; + SerialPort.DATABITS_8 + &quot;  &quot;<br />+ SerialPort.STOPBITS_1 + &quot;  &quot; + SerialPort.PARITY_NONE);<br />textArea_1.grabFocus();<br />}<br />}<br />protected void do_btnNewButton_1_actionPerformed(ActionEvent arg0) {<br />ZapiszBuforDoPortu(textArea_1.getText());<br />textArea_1.setText(&quot;&quot;);<br />textArea_1.grabFocus();<br />}<br />protected void do_this_windowClosing(WindowEvent arg0) {<br />ZamknieciePortu();<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=539">p_zag</a> — 4 kwi 2014, o 21:33</p><hr />
]]></content>
</entry>
</feed>