將自已寫的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"); }
沒有留言:
張貼留言