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

Arduino

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

シリアル通信(RS-232C通信)をしてみましょう。まずは記述が簡単なArduino言語でテストしてみます。今回はパソコンから送られてきた小文字のアルファベットを大文字に変換して送り返すプログラムを作成します。

Serial.begin(9600);     //シリアル通信を初期化し、通信速度は9600bps

Serial.available();     //シリアルバッファにあるデータのバイト数

Serial.read();          //受信データを読みます

Serial.write(data)      //シリアルポートにデータを出力
//data: 送信するデータ (1byte)
//Arduino言語でのプログラミング
void setup() 
{
    Serial.begin(9600);     // シリアル通信を初期化する。通信速度は9600bps
}

void loop() 
{
    byte key;                           //受信データを格納する変数

    if (Serial.available())             //受信データを確認
    {
        key = Serial.read();            //1文字だけ読み込む
        {
            Serial.write(key - 0x20);   //大文字に変換して返す
        }
    }
}

先ほどと同じ動作を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;                    //受信したデータを格納

        while(!(UCSR0A & 0b00100000));  //0ならループ
        UDR0 = data - 0x20;             //大文字に変換して返す
    }
}