{{indexmenu_n>12}} ====== 12 - Nucleo: komunikace ====== * Komunikace s [[https://os.mbed.com/handbook/SerialPC|Nucleo <-> PC po UART]] * Práce s textovými řetězci ([[https://www.tutorialspoint.com/c_standard_library/c_function_strstr.htm | strstr]], [[https://www.tutorialspoint.com/c_standard_library/c_function_sprintf.htm | sprintf]], [[https://www.tutorialspoint.com/c_standard_library/c_function_scanf.htm | sscanf]]) * Převod textu na číslo ([[https://www.tutorialspoint.com/c_standard_library/c_function_atoi.htm | atoi]]) ===== Práce se sáriovým portem ===== * Aby bylo možné přistupovat k sériovému portu, je třeba bootovat do oddílu Ubuntu PRG, kde jsou nastavena práva * Nucleo je pak připojeno k portu **/dev/ttyACM0** * to může být odlišné na jiných systémech, na OS Win to budou různě číslované porty **COMx** * K připojení použijte vhodný terminál, např [[https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html|Putty]] * {{:courses:b0b99prpa:labs:screenshot_from_2018-12-19_07-57-52.png?400|}} {{:courses:b0b99prpa:labs:screenshot_from_2018-12-19_07-59-31.png?400|}} * V Linuxu lze pro jednoduchou komunikaci využít i velmi jednoduchý postup pomocí příkazu echo $ echo "text" > /dev/ttyACM0 ===== Samostatné úlohy ===== * Zobrazeni textu/čísel na displeji * Jednoduchý terminál, který bude vracet napsané znaky a bude mít možnost mazat poslední znaky. Volitelně rozšířit o historii příkazů, funkce insert, vzhled klasického terminálu. * Naprogramovat jednoduchý terminál, který bude akceptovat následující příkazy ukončené novým řádkem: * **LED ON** - Zapne LED diodu, pokročílá varianta s volbou barvy * **LED OFF** - Vypne LED diodu * **LIGHT CHANGE** - Změna stavu semaforu z minulé hodiny * **TEXT //text//** - vypíše text na displeji, pokročilejší mohou vypsat i rotující text ===== Příklady ===== #include "mbed.h" Serial uart(SERIAL_TX,SERIAL_RX); int a = 0; int main() { uart.baud(9600); while(1) { uart.printf("a = %d\n", a++); char c = uart.getc(); if (c != 0) { uart.printf("napsal jsi %c\n", c); } } } #include "mbed.h" Serial serial(SERIAL_TX, SERIAL_RX); DigitalOut myled(LED1); int main() { serial.baud(115200); for (int i = 0; i < 5*2; ++i) { // 5x zablikání LED s periodou 50 ms myled = !myled; wait(0.05); } serial.putc('i'); myled = 0; while (1) { while(!serial.readable()) { //aktivní čekání na přijetí bytu } int c = serial.getc(); int ok = 1; switch(c) { case 's': myled = 1; break; case 'e': myled = 0; break; default: ok = 0; } while (!serial.writeable()) {} serial.putc(ok ? 'a' : 'f'); } } #include "mbed.h" #define DISPLAY_ADDRESS 0x27<<1 I2C i2c(I2C_SDA, I2C_SCL); const unsigned char seven_seg_digits_decode_gfedcba[75]= { /* 0 1 2 3 4 5 6 7 8 9 : ; */ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x00, 0x00, /* < = > ? @ A B C D E F G */ 0x00, 0x48, 0x00, 0x00, 0x00, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x7D, /* H I J K L M N O P Q R S */ 0x76, 0x30, 0x1E, 0x00, 0x38, 0x00, 0x54, 0x3F, 0x73, 0x00, 0x50, 0x6D, /* T U V W X Y Z [ \ ] ^ _ */ 0x78, 0x1C, 0x3E, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x08, /* ` a b c d e f g h i j k */ 0x00, 0x77, 0x7C, 0x58, 0x5E, 0x79, 0x71, 0x6F, 0x74, 0x30, 0x1E, 0x00, /* l m n o p q r s t u v w */ 0x30, 0x00, 0x54, 0x5C, 0x73, 0x67, 0x50, 0x6D, 0x78, 0x1C, 0x3E, 0x00, /* x y z */ 0x00, 0x6E, 0x5B }; int main() { char data_write[2]; int i = 0; while (1) { data_write[0] = 0; // pozice na displeji - 0, 1, 2, 3 data_write[1] = seven_seg_digits_decode_gfedcba[i]; i2c.write(DISPLAY_ADDRESS, data_write, 2, 0); if(++i > 9) i = 0; wait(1.0); } }