Warning
This page is located in archive. Go to the latest version of this course pages. Go the latest version of this page.

12 - Nucleo: komunikace

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ř Putty
  • 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);
 
    }
}

courses/b0b99prpa/labs/lab12.txt · Last modified: 2019/01/02 08:08 by viteks