{{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);
}
}