LinkedIn YouTube Facebook
Szukaj

Wstecz
Artykuły

ISIX-RTOS – przykład 4 – wątkowa obsługa portu szeregowego RS232

Klasa zawiera referencję do obiektu sterownika portu szeregowego usart_buffered. Realizacja zadania odbywa się w metodzie wirtualnej main(), stanowiącą odrębny wątek systemowy – list. 11.

 

List. 11. Implementacja metody main klasy led_receiver

//Main task/thread function
void led_receiver::main()
{
    while(true)
    {
        unsigned char c;
        //Receive data from serial
        if(serial.getchar(c)==isix::ISIX_EOK)
        {
            //Check for received char
            switch(c)
            {
            //On led 1
            case 'a':
            case 'A':
                io_clr( LED_PORT, LED1_PIN );
                break;
            //Off led 1
            case 'b':
            case 'B':
                io_set( LED_PORT, LED1_PIN );
                break;
            //On led 2
            case 'c':
            case 'C':
                io_clr( LED_PORT, LED2_PIN );
                break;
            //Off led 2
            case 'd':
            case 'D':
                io_set( LED_PORT, LED2_PIN );
                break;
            }
        }
    }
}

Działanie metody jest proste, sprowadza się do wywołania metody getchar() obiektu sterownika portu szeregowego, która blokuje się do momentu odebrania znaku. W przypadku odebrania prawidłowego kodu znaku, odpowiednie diody LED są włączane lub wyłączane.
Klasa key_transmiter (list. 12) odpowiedzialna jest za odczyt stanu joysticka oraz – w przypadku wykrycia zwarcia jego styków – wysłaniu informacji do portu szeregowego.

 

List. 12. Deklaracja klasy led_transmitter

class 
key_transmitter: public isix::task_base
{
public:
    //Constructor
    key_transmitter(dev::usart_buffered &_serial);
protected:
    //Main thread method
    virtual void main();
private:
    //Stack and prio cfgs
    static const unsigned STACK_SIZE = 256;
    static const unsigned TASK_PRIO = 3;
    //The usart obj ref
    dev::usart_buffered &serial;
};