mbedの基本的なI/O方法と実例。
この記事ではSDメモリーカードへのアクセスを行います。
興味があるところを読む
SDメモリーカードを使う
ライブラリが有るんで使うのは簡単(mbed以外のCPUで使うならELMさんのFatFsが便利です)。
OSを入れるまでもなくFATファイルシステムをチョー簡単に使用可能・・・素晴らしい。
でもUART受信を落とす。
でっかいデータをUARTで115200bpsで受信しながらSDカードに(ファイルとして)書き込むと受信データを落とす。
まだライブラリを良く見てないけど、カードへのアクセス時に割込みを禁止してる?UART側の受信バッファオーバーとか?不明。
で、対症療法としてCTSを上げ下げして、相手(パソコン)の送信を時々停めてやるハードウエアフロー制御を追加。
試しに2Mbyteのデータを受信&File書き込みしてみたけどOK・・・実用的にはこれで十分だ。
// mbed側 C++
DigitalOut dbL1(LED1);
SDFileSystem sd(p5, p6, p7, p22, "sd"); // mosi, miso, sclk, ss(p22)
void main(void)
{
//---------------------------------
// SDカードR/Wテスト
//---------------------------------
dbL1 = 0; // デバッグ用LEDをOFF
char *fname = "/sd/test.txt"; // ここに/sd/が必須
byte s1[50], s2[50];
strcpy((char*)s1, "1234567890");
if (TRUE == WrFile_Pkt(fname, s1, 10)) {
if (TRUE == RdFile_Pkt(fname, s2, 50)) dbL1 = 1; // 成功ならデバッグ用LEDをON
}
}
//========================================================================================
// GLOBAL 指定fileから読む
//========================================================================================
bool RdFile_Pkt(char *fname, byte *ptr, int size)
{
FILE *fp;
if (NULL == (fp=fopen(fname, "rb" ))) return FALSE;
fread(ptr, 1, size, fp);
fclose(fp);
return TRUE;
}
//========================================================================================
// GLOBAL 指定fileに書く
//========================================================================================
bool WrFile_Pkt(char *fname, byte *ptr, int size)
{
FILE *fp;
if (NULL == (fp=fopen(fname, "wb" ))) return FALSE;
fwrite(ptr, 1, size, fp);
fclose(fp);
return TRUE;
}
// パソコン側のC#のプログラム
const int sz = 0x200000;
byte[] buf = new byte[2];
byte csum = 0;
for (int i = 0; i < sz; ++i) {
buf[0] = (byte)i;
csum += buf[0];
serialPort1.Write(buf, 0, 1);
while (false == serialPort1.CtsHolding) Thread.Sleep(1); // targetでLにするとTrueになる
}
buf[0] = (byte)(0xff - csum);
serialPort1.Write(buf, 0, 1);
// mbed側のプログラム
DigitalOut CTS(p26); // 秋月のL023_FT232RLのCTS(CN2-10)とp26を接続
define _BFSZ 64 // このサイズを変えても通信時間に大差はない
bool func(char*fname)
{
byte buf[_BFSZ+1];
FILE *fp;
if (NULL == (fp=fopen(fname, "wb" ))) return FALSE;
while (1) {
CTS=0; // CTS enable(PCは送信して寄こせ)
// ここで受信データをバッファへ溜め込み・・・
CTS=1; // CTS disable(PCは送信待て)
if (fwrite(buf, 1, _BFSZ, fp) < _BFSZ) break; // write error
;
コメント