by しまりす
P/ECEのEXT端子を使った非同期シリアル通信のドライバです。送受信用に独立したバッファをもち、それぞれ割り込みで動作しています。P/ECE付属のテクニカルマニュアルに書いてある通りにプログラムしてるだけで、特に変わった事はしていないつもりです。
ローカルエコー(EXTの7,8pinを短絡させた状態)で動作確認しました。
ver 1.02 serial.h serial.c stest.c(動作テスト用)
serial.cをコンパイルするときは、-I/usr/piece/sysdev/pcekn オプションをつけてください。とりあえず動くはずですが、問題があったら是非お知らせください。
void COMOpen(int mode,int bps) | 
通信条件 modeと通信速度 bpsを与えてシリアルポートをオープンし、受信を開始します。 通信条件はデータのビット長、ストップビット長、パリティを | 演算子でつないで設定します。N81に設定する場合は COM_PNONE | COM_8BIT | COM_STOP1  となります。詳細はserial.hを参照してください。 | 
int COMGetch(void) | 
データを一文字受信します。受信バッファが空だった場合はCOM_EMPTYが返ってきます。受信動作自体は割り込み処理されているので、ユーザは受信のために特にタイミングに注意を払う必要はありません。なお、P/ECEではバッファが空の状態で while ループなどによる受信待ちはしないでください。 | 
void COMPutch(unsigned char ch) | 
データを一文字送信します。関数は送信完了を待たずに戻ってきます。 | 
void COMPutStr(unsigned char *str) | 
文字列を送信します。文字列 strは '\0' で終端してある必要があります。関数は送信完了を待たずに戻ってきます。 | 
void COMClose(void) | 
シリアルポートの使用を終了するときに呼んで下さい。節電のためにクロック供給をやめるようにしています。 | 
#include <stdio.h>
#include <stdlib.h>
#include <piece.h>
#include "serial.h"
unsigned char VBuff[SCREEN_W*SCREEN_H];
void pceAppInit(void)
{
	pceLCDDispStop();
	pceLCDSetBuffer(VBuff);
	memset(VBuff,0,sizeof(VBuff));
	pceAppSetProcPeriod(80);
	pceLCDDispStart();
	
	pceFontSetPos(0,0);
	pceFontPutStr("COM TEST\n");
	
	COMOpen(COM_8BIT|COM_STOP1|COM_PNONE,COM_BPS4800);
}
void pceAppProc(int cnt)
{
	int ch;
	unsigned long pad;
	char str[16];
	
	// 送信
	pad=pcePadGet();
	if(pad & TRG_A)
	{
		sprintf(str,"%d ",cnt);
		COMPutStr(str);
	}
	
	// 受信
	while(1)
	{
		ch=COMGetch(); // 受信データがなくても戻ってきます
		if(ch == COM_EMPTY) break;
		pceFontPrintf("%c",ch);
	}
	pceLCDTrans();
}
void pceAppExit(void)
{
	COMClose();
}
以下の方にドライバのテストと評価をしていただきました。
ありがとうございました。