Translate

2018年7月23日 星期一

Arduino UNO R3 自製Library RS232通訊

參考:葉難Arduino撰寫自已的程式庫如何編寫ARDUINO LIBRARY

將自已寫的Arduino UNO R3 使用自建C函式庫改寫成Library

UART相關設定參考:http://coopermaa2nd.blogspot.com/2011/07/5-usart.html 在arduino\libraries資料夾下新增一個自已的函式庫資料夾RS232


USART 暫存器

UCSR0A 這個暫存器中,比較重要的是 RXC0, TXC0, UDRE0 這三個旗號:

bit7:RXC0: USART Receive Complete,當 receiver buffer 中有未讀取的資料時,這個旗號會豎起來,當資料被讀走時,旗號會清除。

bit6:TXC0: USART Transmit Complete,當 Shift Register 的資料被傳送出去,而且 transmit buffer (UDR0) 中也沒有資料時,這個旗號會豎起來。

bit5:UDRE0: USART Data Register Empty,當 transmit buffer (UDR0) 準備好放下一個要傳送的資料時,這個旗號會豎起來。





while(!(UCSR0A & 0b00100000)){ }//等待bit5變成1,否則一直等待。等待RS232空閒。
void RS232::put_string(char *string) {
   while(*string) { 
            while(!(UCSR0A & 0b00100000)) { } 
            UDR0=*string++; 
   }
 }
while(!(UCSR0A & 0b10000000)){}//等待bit7變成1,否則一直等待。一直等待RS232傳送資料過來。
char RS232::get_char() {
   char recchar;
   while(!(UCSR0A & 0b10000000)){}
   recchar=UDR0;
   put_char(recchar);
   return recchar; 
}


新增一個RS232.h內容如下:

#ifndef RS232_H
#define RS232_H
#include <avr/interrupt.h> 
class RS232 {
public:
 RS232();
 ~RS232();
 void begin(unsigned long baud);
 void put_char(char str);
 void put_string(char *string);
 char get_char(void); 

};
#endif
新增一個RS232.cpp內容如下:
#include <RS232.h>
RS232::RS232(){ 
}
RS232::~RS232(){ 
}
void RS232::begin(unsigned long baud){
    unsigned int baud_setting=(F_CPU/16/baud)-1;
    UBRR0H=(unsigned char)(baud_setting>>8);
    UBRR0L=(unsigned char)baud_setting;
    UCSR0B=0B00011000;//啟用transmitter和receiver,並且不使用中斷。RXEN0=1,TXEN0=1,RXCIE0=0,TXCIE0=0。
    UCSR0C=0B00000110;//設定frame format為N,8,1
}
void RS232::put_string(char *string)
{
    while(*string)
    {
        while(!(UCSR0A & 0b00100000))
        {  }
        UDR0=*string++;
    }
}
void RS232::put_char(char str)
{
       while(!(UCSR0A & 0b00100000))
       {  }
       UDR0=str;
}
char RS232::get_char()
{
 char recchar;
 while(!(UCSR0A & 0b10000000)){}
 recchar=UDR0;
 put_char(recchar);
 return recchar;
}


新增一個檔案keywords.txt內容如下:
RS232 KEYWORD1
begin KEYWORD2
put_char KEYWORD2
put_string KEYWORD2
get_char KEYWORD2
新增一個資料檔案example\rs232_lib.ino內容如下:
#include <RS232.h>
RS232 RS232;
void setup(){
  RS232.begin(9600);
}
void loop(){
  char char_reg;
  char_reg=RS232.get_char();
  RS232.put_char('Z');
  RS232.put_string("Hello World");
}

沒有留言:

張貼留言