Advertise with Googlier.com Cộng đồng Arduino Việt Nam - chuyển long sang byte http://arduino.vn/tags/chuyen-long-sang-byte vi Truyền các số kiểu long, int, float trong giao tiếp Serial (UART) http://arduino.vn/tutorial/1471-truyen-cac-so-kieu-long-int-float-trong-giao-tiep-serial-uart <div class="field field-name-field-description field-type-text-long field-label-above"><div class="field-label">Mô tả dự án:&nbsp;</div><div class="field-items"><div class="field-item even"><p>Rất dễ dàng để gửi một số hoặc chuỗi kí tự để hiển thị lên màn hình qua cổng Serial. Nhưng mọi chuyện không đơn giản như vậy khi ta muốn truyền số kiểu int, long, double, ..v.v giữa 2 board arduino với nhau bằng Serial. Đừng lo, sau đây mình sẽ giúp bạn giải quyết vấn đề nan giải đó.</p> <p> </p> </div></div></div><div class="field-collection-container clearfix"><div class="field field-name-field-step field-type-field-collection field-label-hidden"><div class="field-items"><div class="field-item even"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/815" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Bài viết này đã cũ !</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p><span style="color:rgb(255, 0, 0)">Thông báo ngày 11/4/2018 : </span></p> <p><span style="color:rgb(255, 0, 0)">Bài viết này đã cũ ,Thư viện hiện đã được chỉnh sửa để truyền tin an toàn hơn theo link nàyi :</span></p> <p><span style="color:rgb(255, 0, 0)">&lt;link bài mới&gt; <a href="http://arduino.vn/tutorial/5897-thu-vien-truyen-du-lieu-bat-ky-byte-long-float-double-theo-goi-tin-cho-arduino">http://arduino.vn/tutorial/5897-thu-vien-truyen-du-lieu-bat-ky-byte-long-float-double-theo-goi-tin-cho-arduino</a></span></p> <p><span style="color:rgb(255, 0, 0)">Bài viết này được giữ lại dưới dạng tài liệu tham khảo.</span></p> <p> </p> <p class="rtecenter"> </p> </div></div></div> </div> </div> </div></div><div class="field-item odd"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/816" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Giao tiếp Serial giữa 2 arduino </span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p> </p> <div> </div> <div> <p> </p> <p>Ai cũng biết giao tiếp Serial có tên gọi chính thức là giao tiếp UART, sử dụng 2 đường dây là TX (cổng xuất dữ liệu) và RX (cổng nhận dữ liệu). Để kết nối ta phải nối theo quy tắc TX của board phát nối với RX còn lại của board nhận. </p> <p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2017/02/14/0/3583_12315469-1487062837-0-untitled.png" style="cursor:default; height:328px; width:400px" /></p> <p>Vì giao tiếp này không sử dụng xung Clock, nên để truyền nhận chính xác thì 2 module phải thống nhất về tốc độ xung nhịp (như một dạng cộng hưởng xung nhịp). Điều này cho phép ta chỉ cần nối 1 dây duy nhất trong trường hợp một bên chỉ phát – bên kia chỉ thu.</p> </div> <p> </p> <p>Đã có những bài giới thiệu về giao tiếp Serial giữa 2 board arduino, nhưng đó chỉ là giới thiệu truyền dẫn 1 byte để demo (khi đó bạn chỉ có thể truyền đi một số có giá trị từ 0 -&gt; 255).</p> <p>Ví dụ như trong 1 dự án trạm khí tượng, bạn sẽ lên kế hoạch sử dụng 2 board arduino (1 board chính – 1 board phụ). Board chính đặt ở phòng để giám sát và điều khiển, board phụ đặt trên tròi kí tượng đọc các trị cảm biến rồi gửi về qua Serial. Hoặc pro hơn là các dự án về robot thám hiểm.</p> <p>Một vấn đề mà bạn vấp phải là bạn chỉ biết truyền một số có giá trị trong khoảng từ 0 =&gt; 255 <img alt="angry" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/angry_smile.png" style="height:23px; width:23px" title="angry" /><img alt="angry" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/angry_smile.png" style="height:23px; width:23px" title="angry" />, trong khi thực tế thì ta luôn cần nhiều hơn vậy.<img alt="devil" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/devil_smile.png" style="height:23px; width:23px" title="devil" /></p> <p>Đó có thể là giá trị của biến (nhiệt , độ ẩm=90%,áp suất=2000atm, tốc độ=4500 rpm, ..v.v )một kiểu int, long, unsigned long  hay kiểu kiểu số thực như float , double (ví dụ thường thấy ở các module GPS trả về như  vĩ độ 50.45656 độ, kinh độ 102.55433).</p> <p>Và bạn biết không, chính mình cũng đang bị chậm dự án bởi vấn đề này. </p> </div></div></div> </div> </div> </div></div><div class="field-item even"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/817" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Giới thiệu thư viện hỗ trợ.</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><h3><span style="color:#008080"><strong>Đây là thư viện dành cho giao tiếp Serial giữa 2 board arduino dùng để truyền nhận tất cả các kiểu số và kí tự</strong></span></h3> <p>Công việc của nó cũng khá đơn giản!</p> <p>Để truyền: Ví dụ để truyền số 12345 kiểu <span style="font-family:courier new,courier,monospace"><a href="http://arduino.vn/reference/int">int</a></span>, như ta đã biết trên arduino kiểu int có cỡ là 2 <a href="http://arduino.vn/reference/byte"><span style="font-family:courier new,courier,monospace">byte</span></a>, ta sẽ tách 2 <a href="http://arduino.vn/reference/byte"><span style="font-family:courier new,courier,monospace">byte</span></a> lưu trữ của biến này thành từng <a href="http://arduino.vn/reference/byte"><span style="font-family:courier new,courier,monospace">byte</span></a> rồi xuất ra đường truyền.</p> <p>Để nhận: Ta sẽ làm ngược lại là ghép 2 <a href="http://arduino.vn/reference/byte"><span style="font-family:courier new,courier,monospace">byte</span></a> đã nhận về một số kiểu <a href="http://arduino.vn/reference/int" style="font-family: &quot;courier new&quot;, courier, monospace;">int</a>.</p> <p>Kĩ thuật này đã được mình ứng dụng trong việc lưu trữ các số (lớn hơn 255) vào EEPROM tại bài viết này:</p> <p><a href="http://arduino.vn/tutorial/1370-huong-dan-su-dung-ic-eeprom-24cxx-cua-atmel-va-thu-vien">http://arduino.vn/tutorial/1370-huong-dan-su-dung-ic-eeprom-24cxx-cua-atmel-va-thu-vien</a></p> <p>Để hiểu hơn về phương pháp tách/ghép, bạn hãy xem mã nguồn của thư viện này nhé.</p> <h3><span style="color:#008080"><strong>Giới thiệu thư viện</strong></span></h3> <p>Hiện tại thư viện có các chức truyền nhận các số kiểu:</p> <h4>Kiểu <span style="font-family:courier new,courier,monospace"><a href="http://arduino.vn/reference/double">double</a></span>: từ <span style="font-family:courier new,courier,monospace">2.2250738585072014 E – 308</span> đến <span style="font-family:courier new,courier,monospace">1.7976931348623158 E + 308</span>.</h4> <pre class="prettyprint linenums lang-c_pp"> void write_double(double value); double read_double();</pre><h4>Kiểu <a href="http://arduino.vn/reference/float"><span style="font-family:courier new,courier,monospace">float</span></a>: từ <span style="font-family:courier new,courier,monospace">1.175494351 E – 38</span> đến <span style="font-family:courier new,courier,monospace">3.402823466 E + 38</span></h4> <pre class="prettyprint linenums lang-c_pp"> void write_float(float value); float read_float();</pre><h4>Kiểu <span style="font-family:courier new,courier,monospace"><a href="http://arduino.vn/reference/char">int8_t</a></span>: từ <span style="font-family:courier new,courier,monospace">-128</span> đến <span style="font-family:courier new,courier,monospace">127</span></h4> <pre class="prettyprint linenums lang-c_pp"> void write_int8_t(int8_t value); int8_t read_int8_t();</pre><h4>Kiểu <span style="font-family:courier new,courier,monospace">uint8_t</span> (là kiểu <a href="http://arduino.vn/reference/byte"><span style="font-family:courier new,courier,monospace">byte</span></a>): từ <span style="font-family:courier new,courier,monospace">0</span> đến <span style="font-family:courier new,courier,monospace">255</span>.</h4> <pre class="prettyprint linenums lang-c_pp"> void write_uint8_t(uint8_t value); uint8_t read_uint8_t();</pre><h4>Kiểu <span style="font-family:courier new,courier,monospace">int16_t </span>(là kiểu <a href="http://arduino.vn/reference/int" style="font-family: &quot;courier new&quot;, courier, monospace;">int</a>): từ <span style="font-family:courier new,courier,monospace">-32768</span> đến <span style="font-family:courier new,courier,monospace">32767</span></h4> <pre class="prettyprint linenums lang-c_pp"> void write_int16_t(int16_t value); int16_t read_int16_t();</pre><h4>Kiểu <span style="font-family:courier new,courier,monospace">uint16_t</span> (giống kiểu <span style="font-family:courier new,courier,monospace"><a href="http://arduino.vn/reference/unsigned-int">unsigned int</a></span>): từ <span style="font-family:courier new,courier,monospace">0</span> đến <span style="font-family:courier new,courier,monospace">65536</span></h4> <pre class="prettyprint linenums lang-c_pp"> void write_uint16_t(uint16_t value); uint16_t read_uint16_t();</pre><h4>Kiểu <span style="font-family:courier new,courier,monospace">uint32_t</span> (giống kiểu <span style="font-family:courier new,courier,monospace"><a href="http://arduino.vn/reference/unsigned-long">unsigned long</a></span>) :từ <span style="font-family:courier new,courier,monospace">0</span> đến <span style="font-family:courier new,courier,monospace">4,294,967,295</span></h4> <pre class="prettyprint linenums lang-c_pp"> void write_uint32_t(uint32_t value); uint32_t read_uint32_t();</pre><h4>Kiểu <span style="font-family:courier new,courier,monospace">int32_t</span> (giống kiểu <a href="http://arduino.vn/reference/long"><span style="font-family:courier new,courier,monospace">long</span></a>):từ <span style="font-family:courier new,courier,monospace">-2,147,483,648</span> đến <span style="font-family:courier new,courier,monospace">2,147,483,647</span></h4> <pre class="prettyprint linenums lang-c_pp"> void write_int32_t(int32_t value); int32_t read_int32_t();</pre><h4>Kiểu <span style="font-family:courier new,courier,monospace">unsigned char</span> (là kiểu <a href="http://arduino.vn/reference/byte"><span style="font-family:courier new,courier,monospace">byte</span></a>): <span style="font-family:courier new,courier,monospace">0</span> đến <span style="font-family:courier new,courier,monospace">255</span></h4> <blockquote><h4>Tương ứng 256 kí tự trong bảng mã ASCII, mỗi lần chỉ gửi được 1 kí tự</h4> </blockquote> <pre class="prettyprint linenums lang-c_pp"> void write_char(unsigned char value); unsigned char read_char();</pre><h4><strong>Gửi một chuỗi kí tự</strong></h4> <blockquote><p>Với n là số lượng  kí tự muốn gửi (hoặc nhận)</p> </blockquote> <pre class="prettyprint linenums lang-c_pp"> void write_string(unsigned char value[], uint32_t n ); void read_string(unsigned char *value, uint32_t n);</pre><h4>Gửi một mã dạng kí tự</h4> <pre class="prettyprint linenums lang-c_pp"> void send_pass(unsigned char value[], uint32_t n );</pre><p>Rồi sau đó sử dụng hàm này để kiểm tra xem mã có khớp không, nếu đúng thì trả về 1, sai trả về 0.</p> <pre class="prettyprint linenums lang-c_pp"> bool check_pass(unsigned char value[], uint32_t n );</pre><h4>Xóa bộ nhớ đệm</h4> <pre class="prettyprint linenums lang-c_pp"> void clear_buffer();</pre></div></div></div> </div> </div> </div></div><div class="field-item odd"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/818" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Ví dụ 1: truyền số kiểu uint32_t (unsigned long)</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p class="rtecenter"><img alt="" src="http://k2.arduino.vn/img/2017/02/14/0/3552_88215469-1487062841-0-vi-du-truyen-nhan.png" style="height:266px; width:500px" /></p> <table border="1" cellpadding="0" style="margin: auto; border-spacing: 0px;"><tbody><tr><td style="width:319px"> <p class="rtecenter">Mạch phát</p> </td> <td style="width:319px"> <p class="rtecenter">Mạch nhận</p> </td> </tr><tr><td style="width:319px"> <pre class="prettyprint linenums lang-c_pp" data-pbcklang="c_pp" data-pbcktabsize="4"> #include "UART_ARDUINO.h" UART Gui; void setup() { Gui.begin(9600); // baud: 200 -&gt; 250,000. } uint32_t Num = 123456789; void loop() { if (Gui.check_pass("abc", 3) == true) { // kiểm tra có yêu cầu từ máy chủ // Gui.clear_buffer();// reset lại bộ nhớ đệm Gui.write_uint32_t(Num); } }</pre><p> </p> </td> <td style="width:319px"> <pre class="prettyprint linenums lang-c_pp" data-pbcklang="c_pp" data-pbcktabsize="4"> #include "UART_ARDUINO.h" UART Nhan; // nhận byte button = 5; // void setup() { Nhan.begin(9600); // baud: 200 -&gt; 250,000. pinMode(13, HIGH); // PIN 13 OUT CHO LED pinMode(button, INPUT_PULLUP); } uint32_t Num; void loop() { if (digitalRead(button) == 0) { delay(300); //chống nhiễu Nhan.send_pass("abc", 3); } if (Serial.available() &gt;= sizeof(Num)) { Num = Nhan.read_uint32_t(); if (Num == 123456789) { digitalWrite(13, 1); // bật đèn, báo hiệu test thành công. } } } //loop</pre><p> </p> </td> </tr></tbody></table><p>Nhấn nút để yêu cầu mạch phát trả về dữ liệu</p> <p><span style="font-size:18px"><strong><em>Nhan.send_pass("<span style="color:#DAA520">abc</span>", <span style="color:#DAA520">3</span>)</em></strong></span></p> <p>Máy chủ gửi một mật khẩu yêu cầu là:<em><strong><span style="font-size:18px"> <span style="color:#DAA520">abc</span></span></strong></em></p> <p><em><strong><span style="font-size:18px"><span style="color:#DAA520">3</span></span></strong></em> : là số lượng chữ cái</p> <blockquote><p>Do đó mật khẩu càng ngắn càng tốc độ nhanh hơn nhưng cũng dễ bị sai hơn(do bị trùng với số của dữ liệu)</p> </blockquote> </div></div></div> </div> </div> </div></div><div class="field-item even"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/819" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Ví dụ 2: truyền số kiểu float</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><blockquote><p>Nối mạch như ví dụ trên</p> </blockquote> <table border="1" cellpadding="0" style="margin: auto; border-spacing: 0px;"><tbody><tr><td class="rtecenter" style="width:319px">Mạch phát</td> <td style="width:319px"> <p class="rtecenter">Mạch nhận</p> </td> </tr><tr><td style="width:319px"> <pre class="prettyprint linenums lang-c_pp" data-pbcklang="c_pp" data-pbcktabsize="4"> #include "UART_ARDUINO.h" UART Gui; void setup() { Gui.begin(9600); // baud: 200 -&gt; 250,000. } float Num = 12.345678; void loop() { if (Gui.check_pass("abc", 3) == true) { // kiểm tra có yêu cầu từ máy chủ // Gui.clear_buffer();// reset lại bộ nhớ đệm Gui.write_float(Num); } }</pre></td> <td style="width:319px"> <pre class="prettyprint linenums lang-c_pp" data-pbcklang="c_pp" data-pbcktabsize="4"> #include "UART_ARDUINO.h" UART Nhan; // nhận byte button = 5; // void setup() { Nhan.begin(9600); // baud: 200 -&gt; 250,000. pinMode(13, HIGH); // PIN 13 OUT CHO LED pinMode(button, INPUT_PULLUP); } float Num; void loop() { if (digitalRead(button) == 0) { // nhấn nút để yêu cầu mạch phát trả về dữ liệu delay(300); //chống nhiễu Nhan.send_pass("abc", 3); } if (Serial.available() &gt;= sizeof(Num)) { Num = Nhan.read_float(); if (Num == 12.345678) { digitalWrite(13, 1); // bật đèn, báo hiệu test thành công. } } } //loop</pre></td> </tr></tbody></table><p>Nhấn nút để yêu cầu mạch phát trả về dữ liệu, nếu đèn sáng thì test truyền nhận thành công.</p> <h3><span style="color:#008080"><strong>Truyền số khác</strong></span></h3> <p>Làm tương tự,</p> <table border="1" cellpadding="4" style="margin: auto;"><tbody><tr><td> <div><strong><em><span style="font-family:courier new,courier,monospace">void write_double();</span></em></strong></div> </td> <td> <div>2.2250738585072014 E – 308 =&gt; 1.7976931348623158 E + 308.</div> </td> </tr><tr><td> <div><strong><em><span style="font-family:courier new,courier,monospace">void write_float(); </span></em></strong></div> </td> <td> <div>1.175494351 E – 38 =&gt; 3.402823466 E + 38</div> </td> </tr><tr><td> <div><strong><em><span style="font-family:courier new,courier,monospace">void write_int8_t(); </span></em></strong></div> </td> <td> <div>-128 =&gt; 127</div> </td> </tr><tr><td> <div><strong><em><span style="font-family:courier new,courier,monospace">void write_uint8_t(); </span></em></strong></div> </td> <td> <div>0 =&gt; 255</div> </td> </tr><tr><td> <div><strong><em><span style="font-family:courier new,courier,monospace">void write_int16_t(); </span></em></strong></div> </td> <td> <div>-32768 =&gt; 32767</div> </td> </tr><tr><td> <div><strong><em><span style="font-family:courier new,courier,monospace">void write_uint16_t(); </span></em></strong></div> </td> <td> <div>0 =&gt; 65536</div> </td> </tr><tr><td> <div><strong><em><span style="font-family:courier new,courier,monospace">void write_uint32_t();</span></em></strong></div> </td> <td> <div>0 =&gt;4,294,967,295</div> </td> </tr><tr><td> <div><strong><em><span style="font-family:courier new,courier,monospace">void write_int32_t(); </span></em></strong></div> </td> <td> <div>-2,147,483,648 =&gt; 2,147,483,647</div> </td> </tr></tbody></table><blockquote><p>Chú ý: trên arduino uno R3, kiểu float và double có cùng cỡ là 4 byte,(  giá trị   từ 1.175494351 E – 38 đến 3.402823466 E + 38);</p> </blockquote> <p>Trên arduino Due, kiểu double mới có cỡ 8 byte.</p> <p>Tốc độ truyền các số có kích thước lớn (byte) sẽ chậm hơn các số có kích thước nhỏ hơn (điều này là dĩ nhiên).!</p> </div></div></div> </div> </div> </div></div><div class="field-item odd"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/820" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Ví dụ 3 truyền 1 kí tự trong bảng ASCII.</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p class="rtecenter"><img alt="" src="http://k1.arduino.vn/img/2017/02/14/0/3582_12315469-1487062826-0-ascii.jpg" style="height:304px; width:500px" /></p> <p class="rtecenter"><strong><em>Code: mở phần Examples trong file tải xuống để xem code ví dụ!</em></strong></p> </div></div></div> </div> </div> </div></div><div class="field-item even"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/821" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Ví dụ 4 :Truyền một chuỗi kí tự để nhắn tin.</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p><strong><em>Code: mở phần Examples trong file tải xuống để xem code ví dụ!</em></strong></p> </div></div></div> </div> </div> </div></div><div class="field-item odd"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/822" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Ví dụ 5 : Truyền cùng lúc nhiều số (đóng gói tập tin).</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>Đây là đáng nói nhất !</p> <p class="rtecenter"><img alt="" src="http://k2.arduino.vn/img/2017/02/14/0/3552_88215469-1487062841-0-vi-du-truyen-nhan.png" style="height:266px; width:500px" /></p> <table border="1" cellpadding="0" style="margin: auto; border-spacing: 0px;"><tbody><tr><td style="width:319px"> <p class="rtecenter">Mạch phát (slave)</p> </td> <td style="width:319px"> <p class="rtecenter"> Mạch nhận (master)</p> </td> </tr><tr><td style="width:319px"> <pre class="prettyprint linenums lang-c_pp" data-pbcklang="c_pp" data-pbcktabsize="4"> #include "UART_ARDUINO.h" UART Gui; void setup() { Gui.begin(9600); // baud: 200 -&gt; 250,000. } uint8_t nhiet_do; uint16_t do_am; int32_t toc_do; uint32_t do_cao; float toa_do; void loop() { if (Gui.check_pass("abc", 3) == true) { // kiểm tra có yêu cầu từ máy chủ gui_du_lieu(25, 60, 2700, 3600, 12.1234); } } void gui_du_lieu(uint8_t a, uint16_t b, int32_t c, uint32_t d, float e) { // lưu ý : gói tin truyền đi có kích cỡ lớn nhất là 64 byte Gui.write_uint8_t(a); // cần 1 byte Gui.write_uint16_t(b); // cần 2 byte Gui.write_int32_t(c); // cần 4 byte Gui.write_uint32_t(d); // cần 4 byte Gui.write_float(e); // cần 4 byte // tổng cộng cần 15 byte &lt; (max =64) }</pre></td> <td style="width:319px"> <pre class="prettyprint linenums lang-c_pp" data-pbcklang="c_pp" data-pbcktabsize="4"> #include "UART_ARDUINO.h" UART Nhan; // nhận byte button = 5; // void setup() { Nhan.begin(9600); // baud: 200 -&gt; 250,000. pinMode(13, HIGH); // PIN 13 OUT CHO LED pinMode(button, INPUT_PULLUP); //sử dụng một nút ấn (button) nối với pin 5 và nguồn âm // nhấn nút để yêu cầu mạch phát trả về dữ liệu } uint8_t nhiet_do; uint16_t do_am; int32_t toc_do; uint32_t do_cao; float toa_do; void loop() { if (digitalRead(button) == 0) { // nhấn nút để yêu cầu mạch phát trả về dữ liệu delay(300); //chống nhiễu Nhan.send_pass("abc", 3); //máy chủ gửi một mật khẩu yêu cầu là : abc // 3 : là số lượng chữ cái //(do đó mật khẩu càng ngắn càng tốc độ nhanh hơn nhưng cũng dễ bị sai hơn(do bị trùng với số của dữ liệu)) } if (nhan_du_lieu(&amp;nhiet_do, &amp;do_am, &amp;toc_do, &amp;do_cao, &amp;toa_do) == true) { if (nhiet_do == 25) { if (do_am == 60) { if (toc_do == 2700) { if (do_cao == 3600) { if (toa_do == 12.1234) { digitalWrite(13, 1); //bật đèn để báo test thử nghiệm thành công (số truyền qua là chính xác) } } } } } } //if lớn } //loop bool nhan_du_lieu(uint8_t* a, uint16_t* b, int32_t* c, uint32_t* d, float* e) { //b1: tìm kích thước để kiểm tra gói tin truyền về đã đủ chưa uint32_t kich_co_goi_tin = sizeof(*a) + sizeof(*b) + sizeof(*c) + sizeof(*d) + sizeof(*e); if (Serial.available() &gt;= kich_co_goi_tin) { //đã nhận đủ gói tin ///////////// (*a) = Nhan.read_uint8_t(); (*b) = Nhan.read_uint16_t(); (*c) = Nhan.read_int32_t(); (*d) = Nhan.read_uint32_t(); (*e) = Nhan.read_float(); ///////////// // Nhan.clear_buffer();// reset lại bộ nhớ đệm return true; // cuối cùng trả về true báo đã nhận đủ và hoàn tất } else { return false; // báo chưa đủ } }</pre></td> </tr></tbody></table><p>Tất cả các ví dụ trên đều được mình test thành công.!</p> </div></div></div> </div> </div> </div></div><div class="field-item even"><div class="field-collection-view clearfix view-mode-full"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/823" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Download thư viện</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p><span style="color:#FF0000">Thông báo ngày 11/4/2018 : </span></p> <p><span style="color:#FF0000">Bài viết này đã cũ ,Thư viện hiện đã được chỉnh sửa để truyền tin an toàn hơn theo link nàyi :</span></p> <p><span style="color:#FF0000">&lt;link&gt;<a href="http://arduino.vn/tutorial/5897-thu-vien-truyen-du-lieu-bat-ky-byte-long-float-double-theo-goi-tin-cho-arduino">http://arduino.vn/tutorial/5897-thu-vien-truyen-du-lieu-bat-ky-byte-long-float-double-theo-goi-tin-cho-arduino</a></span></p> <p><span style="color:#FF0000">Bài viết này được giữ lại dưới dạng tài liệu tham khảo.</span></p> <p> </p> <p> </p> <p>Link: (<span style="color:rgb(42, 46, 46); font-family:helvetica neue,arial,sans-serif; font-size:15px"> đã nâng cấp (ngày 13/6/2017)</span>)</p> <p><a href="https://drive.google.com/file/d/0BzMEcyRK_uUFNXNaTnY1NnpablU/view?usp=sharing">https://drive.google.com/file/d/0BzMEcyRK_uUFNXNaTnY1NnpablU/view?usp=sharing</a> (<a href="http://k3.arduino.vn/img/2017/02/14/0/3542_812450-1487076963-0-uart-arduino.zip">mirror</a>)</p> <p><a href="https://github.com/NickChungVietNam/UART_ARDUINO">https://github.com/NickChungVietNam/UART_ARDUINO</a></p> <p>Flie khoảng 500kb có chứa thư viện, hình ảnh, các file ví dụ, tài liệu hướng dẫn do mình biên soạn.</p> <p>(Hãy liên hệ với mình qua phần bình luận nếu thư viện có lỗi nhé)</p> <p> </p> <p>Update :</p> <p><span style="color:rgb(42, 46, 46); font-family:helvetica neue,arial,sans-serif; font-size:15px">Hiện tại thư viện đã nâng cấp  : với chức năng truyền nhận liên tục mà không cần gửi yêu cầu từ máy chủ. Rất phù hợp với các dự án yêu cầu lắng nghe dữ liệu trả về liên tục như robot tự hành, tàu lặn..</span> <span style="color:rgb(42, 46, 46); font-family:helvetica neue,arial,sans-serif; font-size:15px">Ngoài ra thư viện đã được hỗ trợ sử dụng trên esp8266 và esp32. .Link vẫn như cũ (google drive)</span></p> <p> </p> </div></div></div> </div> </div> </div></div><div class="field-item odd"><div class="field-collection-view clearfix view-mode-full field-collection-view-final"><div class="entity entity-field-collection-item field-collection-item-field-step clearfix" about="/field-collection/field-step/824" typeof=""> <div class="content"> <div class="field field-name-field-step-name field-type-text field-label-hidden"><div class="field-items"><div class="field-item even"><h2><strong><span style="color:#FF8C00">Tạm kết</span></strong></h2></div></div></div><div class="field field-name-field-body field-type-text-with-summary field-label-hidden"><div class="field-items"><div class="field-item even"><p>Mình viết ra thư viện chỉ đơn thuần phục vụ nhu cầu về truyền dẫn số liệu. Tuy không theo quy tắc chuẩn của đóng gói và truyền dẫn (nó cần có thêm các khả năng như yêu cầu gửi lại, hết hạn, ghép các tập tin…). Arduino cũng hỗ trợ có thể có nhiều hơn 1 cổng Serial bằng thư viện SerialSoftWare. Nhưng thôi, tới đâu hay tới đấy, hi vọng trong tương lai mình và các bạn có thời gian để nâng cấp thêm cho nó.</p> <p class="rtecenter"><img alt="" src="http://k3.arduino.vn/img/2017/02/14/0/3541_81215469-1487062834-0-qua-trinh-thiet-ke.png" style="height:450px; width:600px" /></p> <p>Hi vọng bài viết này sẽ giúp ích cho bạn trong tương lai. <img alt="laugh" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/teeth_smile.png" style="height:23px; width:23px" title="laugh" /><img alt="heart" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/heart.png" style="height:23px; width:23px" title="heart" /><img alt="yes" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/thumbs_up.png" style="height:23px; width:23px" title="yes" /><img alt="wink" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/wink_smile.png" style="height:23px; width:23px" title="wink" /><img alt="cheeky" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/tongue_smile.png" style="height:23px; width:23px" title="cheeky" /><img alt="enlightened" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/lightbulb.png" style="height:23px; width:23px" title="enlightened" /><img alt="enlightened" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/lightbulb.png" style="height:23px; width:23px" title="enlightened" /><img alt="enlightened" src="//cdn.arduino.vn/sites/all/libraries/ckeditor/plugins/smiley/images/lightbulb.png" style="height:23px; width:23px" title="enlightened" /></p> <p>&lt;Tác giả Thái Sơn&gt;</p> </div></div></div> </div> </div> </div></div></div></div></div><div class="field field-name-field-chuyen-muc field-type-taxonomy-term-reference field-label-above"><div class="field-label">Chuyên mục:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/chuong-trinh-mau/level-advanced-nang-cao" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Level: Advanced - Nâng cao</a></div><div class="field-item odd"><a href="/nao-cung-lam" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">Nào cùng làm!</a></div></div></div><div class="field field-name-field-tags field-type-taxonomy-term-reference field-label-above"><div class="field-label">Từ khóa:&nbsp;</div><div class="field-items"><div class="field-item even"><a href="/tags/chuyen-float-sang-byte" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">chuyển float sang byte</a></div><div class="field-item odd"><a href="/tags/sending-long-float-uart" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">sending in long float in UART</a></div><div class="field-item even"><a href="/tags/chuyen-long-sang-byte" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">chuyển long sang byte</a></div><div class="field-item odd"><a href="/tags/chuyen-chuoi-sang-byte" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">chuyển chuỗi sang byte</a></div><div class="field-item even"><a href="/tags/chuyen-byte-ve-float" typeof="skos:Concept" property="rdfs:label skos:prefLabel" datatype="">chuyển byte về float</a></div></div></div> Tue, 14 Feb 2017 13:00:16 +0000 Nick Chung 1471 at http://arduino.vn