シリアル通信ドライバについて

 Microchip PIC24Fの UARTに Software FIFOを実装したシリアル ドライバ>です。 シリアルドライバは、PIC24Fのハードウェア UART 割込 (_U1TXInterrupt, _U2TXInterrupt, _U1RXInterrupt, _U2RXInterrupt) から呼ばれます。また、 2チャンネルの UARTに対して、送信/受信バッファサイズを任意に設定できます。

UARTxは、UART1またはUART2と置き換えてください

バッファサイズの変更方法

 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)

 UARTを初期化します。回路によって TX/RXのピンを変更する場合は、UARTx_init()関数内を変更してください。

void UARTx_buf_clear(void)

 送信/受信バッファを両方ともクリアします。

int UARTx_getch(void)

 受信バッファから 1バイトを取り出します。バッファが空のときは、-1を返します。

int UARTx_putch(unsigned char buf)

 送信バッファへ、1バイトを送ります。バッファが空のときは、-1を返します。

void UARTx_putstr(char *buf)

 送信バッファへ、複数のバイトを送ります。戻り値はありません。送信に失敗した場合は、途中で途切れます。

void UARTx_putint(int digit)

 整数 -99999 〜 99999を文字列へ変換してから送信バッファへ出力します。戻り値はありません。送信に失敗した場合は、途中で途切れます。

void UARTx_putdouble(double digit, unsigned char size2)

 浮動小数点数 -99999.999 〜 99999.999を文字列へ変換してから送信バッファへ出力します。引数 size2で、小数点以下の出力桁数を指定します。戻り値はありません。送信に失敗した場合は、途中で途切れます。

void UARTx_puthex(unsigned char a)

 1バイトを 16進数文字列へ変換してから送信バッファへ出力します。戻り値はありません。送信に失敗した場合は、途中で途切れます。

unsigned char UARTx_get_sendbuf(void)

 空き送信バッファサイズを取得します。

unsigned char UARTx_get_recvbuf(void)

 空き受信バッファサイズを取得します。

サンプルコード

 送信/受信のサンプルソースコードです。回路図は、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);
}
コンパイルの確認はしていません (^^;