Arduinoを活用したAtmel AVRのC言語プログラミング③シリアル通信(RS-232C)2/2

Arduino

Arduinoを活用したAtmel AVRのC言語プログラミング③シリアル通信(RS-232C)2/2

前回よりも複雑なシリアル通信(RS-232C通信)をしてみましょう。今回は送られてくるコマンドを判定し、「a」か「b」が送られてきたら「OK」、それ以外のコマンドが送られてきたら「NG」を送り返すプログラムを作成します。まずは記述が簡単なArduino言語でテストしてみます。

//Arduino言語でのプログラミング
void setup() 
{
    Serial.begin(9600);     // シリアル通信を初期化する。通信速度は9600bps
}

void loop() 
{
    byte key;                           //受信データを格納する変数
    byte re_key[2];                     //送り返すデータを格納する変数

    if (Serial.available())             //受信データを確認
    {
        key = Serial.read();            //1文字だけ読み込む
        {
            if ((key == 'a') || (key == 'b'))
            {
                re_key[0] = 'O';
                re_key[1] = 'K';
                Serial.write(re_key, 2);                
            }
            else
            {
                re_key[0] = 'N';
                re_key[1] = 'G';
                Serial.write(re_key, 2);
            }
        }
    }
}

先ほどと同じ動作をC言語で記述してみます。ちょっと記述が複雑ですが最初は理解できなくて構いませんので動作を確認してみてください。

//C言語でのプログラミング
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
    byte data = 0;  //受信したデータを格納

    UBRR0 = 103;            //ボーレート9600 @16MHz
                            //UBRR0 = 動作周波数 / (ボーレート * 16) - 1

    UCSR0A = 0b00000000;    //受信すると10000000/送信有効になると00100000になる

    UCSR0B = 0b00011000;    //送受信有効
    UCSR0C = 0b00000110;    //データ8bit,非同期,パリティなし,Stop 1bit        
    
    while(1)
    {
        while(!(UCSR0A & 0b10000000));  //0ならループ
        data = UDR0;  //受信したデータを格納

        if ((data == 'a') || (data == 'b')) //a,bのいずれかなら入る
        {
            while(!(UCSR0A & 0b00100000));  //0ならループ
            UDR0 = 'O';  //OKを返す
            UDR0 = 'K';  //1byteずつ送信
        }
        else
        {
            while(!(UCSR0A & 0b00100000));  //0ならループ
            UDR0 = 'N';  //NGを返す
            UDR0 = 'G';  //1byteずつ送信            
        }
    }
}