//C言語によるシリアル通信の雛形 //(c)ahotcho // rs232test.h // for HITECH-C void SendChar(signed char); void SendWord(signed char*); signed char ReceiveChar(); void ReceiveWord(unsigned char*); |
//C言語によるシリアル通信の雛形 //(c)ahotcho // rs232test.c // for HITECH-C #include "rs232test.h" #include <pic.h> #include <string.h> #define TXD RB1 #define RXD RB0 #define SEPCHAR ' ' #define TIMERSET 0xf3 bit NextBit,rxCome; //文字の出力 void SendChar(signed char a){ //カウンタの宣言 unsigned char i=0; //タイマーのクリア TMR0=TIMERSET-1; //スタートビット TXD = 0; //タイマフラグのクリア NextBit=0; //1ビット待ち while(!NextBit){;} NextBit = 0; //8ビット繰り返し for(i = 0; i<=7; i++){ //1ビット目から順に出力 TXD=(a>>i)&1; //1ビット待ち while(!NextBit){;} NextBit = 0; } //ストップビット TXD =1; //1ビット待ち while(!NextBit){;} NextBit = 0; return; } //文字列の出力 void SendWord(signed char *a){ //カウンタの宣言 unsigned char i; //文字列の長さ-1終端文字の前まで出力 for(i=0;i<strlen(a);i++)SendChar(a[i]); return; } //1文字の入力 signed char ReceiveChar(){ //バッファの宣言 signed char buf=0; //カウンタの宣言 unsigned char i; //スタートビット待ち while(RXD){} //タイマーリセット&タイマーフラグリセット TMR0=TIMERSET; NextBit = 0; for(i = 0;i <= 7; i++){ //1ビット待ち while(!NextBit){;} NextBit = 0; //8ビット代入し続け buf += ((unsigned char)RXD<<i); } //ストップビット待ち while(!NextBit){;} NextBit = 0; //ストップビット待ち while(!RXD){} return buf; } void ReceiveWord(unsigned char *buf){ //バッファの宣言 signed char a=0; //カウンタの宣言 unsigned char i=0; //区切り文字が来るまでループ while(a != SEPCHAR){ //文字の入力関数 a = ReceiveChar(); //文字列のi番目に代入 buf[i] = a; //カウントアップ i++; } buf[i-1]='\0'; //区切り文字を除去&終端文字代入 return; } |
//C言語によるシリアル通信の雛形〜呼び出すmain関数と割
り込 み 〜 //(c)ahotcho // rs232test_main.c // for HITECH-C #define _LEGACY_HEADERS #define _XTAL_FREQ 8000000 #include "rs232test.h" #include <pic.h> #define TXD RB1 #define RXD RB0 #define TIMERSET 0xf3 __CONFIG(LVPDIS & UNPROTECT & MCLRDIS & BORDIS & PWRTEN & WDTDIS & INTIO) ; extern bit rxCome,NextBit; static void interrupt intr(){ //タイマ0なら if(TMR0IF){ //タイマ0のフラグをクリア TMR0IF = 0; //タイマのカウンタをセットしなおし TMR0=TIMERSET; //タイマが来たことのフラグをセット NextBit=1; } return; } //メイン関数 main(){ //バッファ文字列の定義 signed char receivedWord[32]={0}; //セッティングのおまじない OSCCON = 0b01110000; OPTION = 0b10000110; ADCON1 = 0b00000110; TRISA = 0b01000100; TRISB = 0b00000001; //タイマー0有効 TMR0IE=1; GIE=1; RB2=0; //入力の初期化 RXD=1; TXD=1; while(1){ //無限ループ if(!RXD){ //入力 RB2=0; ReceiveWord(receivedWord); //出力 RB2=1; SendWord(receivedWord); RB2=0; } } return; } |