** シリアル通信ドライバについて [#q92a435b] [[Microchip>http://www.microchip.com/]] PIC24Fの [[UART>http://ja.wikipedia.org/wiki/UART]]に Software [[FIFO>http://ja.wikipedia.org/wiki/FIFO]]を実装した[[シリアル>http://ja.wikipedia.org/wiki/RS-232]]ドライバです。 シリアルドライバは、PIC24Fのハードウェア UART [[割込>http://ja.wikipedia.org/wiki/%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF]] (_U1TXInterrupt, _U2TXInterrupt, _U1RXInterrupt, _U2RXInterrupt) から呼ばれます。また、 2チャンネルの UARTに対して、送信/受信バッファサイズを任意に設定できます。 UARTxは、UART1またはUART2と置き換えてください *** バッファサイズの変更方法 [#t826d96b] libuart.hのマクロを変更してからコンパイルします。 #define UART1_TX_BUFFER_SIZE 128 #define UART1_RX_BUFFER_SIZE 128 #define UART2_TX_BUFFER_SIZE 50 #define UART2_RX_BUFFER_SIZE 70 *** void UARTx_init(unsigned long baud) [#s2e4230a] UARTを初期化します。回路によって TX/RXのピンを変更する場合は、UARTx_init()関数内を変更してください。 *** void UARTx_buf_clear(void) [#m3eaf7c6] 送信/受信バッファを両方ともクリアします。 *** int UARTx_getch(void) [#sce845d4] 受信バッファから 1バイトを取り出します。バッファが空のときは、-1を返します。 *** int UARTx_putch(unsigned char buf) [#nef99005] 送信バッファへ、1バイトを送ります。バッファが空のときは、-1を返します。 *** void UARTx_putstr(char *buf) [#j8f253a5] 送信バッファへ、複数のバイトを送ります。戻り値はありません。送信に失敗した場合は、途中で途切れます。 *** void UARTx_putint(int digit) [#bf5a0eef] 整数 -99999 〜 99999を文字列へ変換してから送信バッファへ出力します。戻り値はありません。送信に失敗した場合は、途中で途切れます。 *** void UARTx_putdouble(double digit, unsigned char size2) [#a58d8989] 浮動小数点数 -99999.999 〜 99999.999を文字列へ変換してから送信バッファへ出力します。引数 size2で、小数点以下の出力桁数を指定します。戻り値はありません。送信に失敗した場合は、途中で途切れます。 *** void UARTx_puthex(unsigned char a) [#f542fa58] 1バイトを 16進数文字列へ変換してから送信バッファへ出力します。戻り値はありません。送信に失敗した場合は、途中で途切れます。 *** unsigned char UARTx_get_sendbuf(void) [#d99c6a2a] 空き送信バッファサイズを取得します。 *** unsigned char UARTx_get_recvbuf(void) [#y63d3752] 空き受信バッファサイズを取得します。 *** サンプルコード [#qb220027] 送信/受信のサンプルソースコードです。回路図は、OpenSSM Rev.A を想定しています。 #include <p24FJ64GA002.h> #include "table.h" #include "libuart.h" _CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & WINDIS_OFF & COE_OFF & ICS_PGx1 & FWDTEN_ON & WDTPS_PS256) _CONFIG2( IESO_OFF & FNOSC_FRCPLL & FCKSM_CSDCMD & OSCIOFNC_ON & IOL1WAY_OFF & I2C1SEL_PRI & POSCMOD_NONE) int main(void) { int buf; /* Fosc = 8.96MHz, Fcy = 17.92MHz, Core 35.84MHz */ CLKDIV = 0; OSCTUN = 0b0000000000011111; SRbits.IPL = 0; TRISA = 0b0000000000000011; TRISB = 0b0000111101100001; UART1_init(115200); UART2_init( 4800); /* 送信受信をループバック. エコー */ while(1){ ClrWdt(); if((buf = UART1_getch()) > 0){ UART1_putch(buf); } if((buf = UART2_getch()) > 0){ UART2_putch(buf); } } return(0); } コンパイルの確認はしていません (^^;