作者: TestCode 一. 友元的使用 在C++中,不能直接调用中断函数,因此就不能将中断函数声明为类的成员函数。然而C++中,类的数据成员一般声明为private。中断函数对类的私有成员的访问可以通过友元机制来实现。
以下以Atmega32为例: /*********************************************************************************** Name : uart.h Description : Header file for Mega32 Uart driver. Author : 2007-09-17 - TestCode Compiler : WINAVR Version: 20070525 ************************************************************************************/ #ifndef _C_Com_H_ #define _C_Com_H_
#ifdef __cplusplus extern "C" { #endif
#include <avr/io.h> #include <stdio.h> #include <avr/interrupt.h> #include "buffer.h" #include <avr/pgmspace.h> #include "iodev.h"
/***************************************************************************** * Definitions */ #ifndef FALSE #define FALSE (0) #endif #ifndef TRUE #define TRUE (1) #endif // #define BAUD_9600 (9600) #define BAUD_115K (115200) #define BAUD_230K (230400) #define BAUD_460K (460800) #define BAUD_920K (921600)
// #define TAB (0x09) #define BACKSPACE (0x08) #define SPACE (0x20) #define PERIOD (0x2E) #define CR (0x0D) #define LF (0x0A) #define ESCAPE (0x1B)
void USART_RXC_vect(void) __attribute__ ((signal)); //void USART_TXC_vect(void) __attribute__ ((signal));
class Buffer; class IO;
class C_Com { private: Buffer uartRxBuffer; static C_Com* pUart; long BAUDRATE; public: C_Com(void); void Init(long baud); void put_c(unsigned char c); char Send(unsigned char* pBuffer, unsigned int uiSize); char Send(unsigned int uiSize);//Send UartBuffer String char GetByte(void); friend void USART_RXC_vect(void); //friend void USART_TXC_vect(void); friend class IO; friend class IO_P; };
#ifdef __cplusplus } #endif
#endif
通过把USART_RXC_vect中断函数定义为C_Com的友元,USART_RXC_vect可以对C_Com的私有成员进行操作。
二. 操作符重载 提到重载,大家很自然想到成员函数重载,函数重载实现赋给同一个函数名多个含义。以下例子中,C++中通过重新定义运算符,不仅g++生成的代码也十分简洁高效,很直观地实现串口驱动的输入及输出。 /*********************************************************************************** Name : iodev.h Description : Header file for io device. Author : 2007-09-17 - TestCode Compiler : WINAVR Version: 20070525 ************************************************************************************/ #ifndef IO_H_ #define IO_H_ #include "avr/io.h" #include <stdlib.h> #include "uart.h" #include <avr/pgmspace.h>
#ifdef __cplusplus extern "C" { #endif
class C_Com; class IO; class IO_P;
extern IO cout, cin; extern IO_P cout_P;
// Debug class. class IO { public: /// Sending strings. IO& operator << (char const*); /// Sending unsigned integers. IO& operator << (unsigned int); IO& operator >> (char*); // Read strings. };
class IO_P { public: IO_P& operator << (PGM_P data); // Read strings. };
#ifdef __cplusplus } #endif
#endif /*_IO_H_*/
三. 测试结果:
/*********************************************************************************** Name : main.cpp Description : Mega32 Uart c++ sample. Author : 2007-09-17 - TestCode Compiler : WINAVR Version: 20070525 ************************************************************************************/ #include <avr/io.h> #include "uart.h" #include <avr/pgmspace.h> #include "iodev.h"
prog_char FlashString[] PROGMEM ="Flash String";
int main() { unsigned int Test = 123; char str[32]; cout<<"HelloWorld
"<<Test<<"
"; cout_P<<PSTR("Program Memory String"); cout_P<<FlashString; while(1) { cin>>str; cout<<"Your type in: "<<str<<"
"; } return 0; }
测试结果:
|