2014年12月6日 星期六

在FATFS Sample中新增PC檔案交換功能

FATFS可以在PC上模擬,是利用記憶體做的一個Disk,但創造後是空的,難以做其他實驗。所以新增二個指令可以將檔案搬進Fatfs系統及搬出Fatfs系統。

搬入指令fy,程式碼如下:

            case 'y' :    /* fy <src_name> <dst_name> - Copy a file from PC*/
                while (*ptr == ' ') ptr++;
                ptr2 = _tcschr(ptr, ' ');
                if (!ptr2) break;
                *ptr2++ = 0;
                while (*ptr2 == ' ') ptr2++;
                _tprintf(_T("Opening PC file \"%s\""), ptr);
                fp = fopen(ptr,"rb");
                _tprintf(_T("\n"));
                if (!fp) {
                    _tprintf(_T("Open Fail!\n"));
                    break;
                }
                while (*ptr2 == ' ') ptr2++;
                _tprintf(_T("Creating \"%s\""), ptr2);
                res = f_open(&file[1], ptr2, FA_CREATE_ALWAYS | FA_WRITE);
                _tprintf(_T("\n"));
                if (res) {
                    put_rc(res);
                    f_close(&file[0]);
                    break;
                }
                _tprintf(_T("Copying..."));
                p1 = 0;
                for (;;) {
                    s1 = fread(Buff, 1, sizeof Buff, fp);
                    if (s1 == 0) break;   /* error or eof */
                    res = f_write(&file[1], Buff, s1, &s2);
                    p1 += s2;
                    if (res || s2 < s1) break;   /* error or disk full */
                }
                _tprintf(_T("\n"));
                if (res) put_rc(res);
                fclose(fp);
                f_close(&file[1]);
                _tprintf(_T("%lu bytes copied.\n"), p1);
                break;


搬出指令fz,程式碼如下:
            case 'z' : /* fz <src_name> <dst_name> - Copy a file to PC*/
                while (*ptr == ' ') ptr++;
                ptr2 = _tcschr(ptr, ' ');
                if (!ptr2) break;
                *ptr2++ = 0;
                while (*ptr2 == ' ') ptr2++;
                _tprintf(_T("Opening \"%s\""), ptr);
                res = f_open(&file[0], ptr, FA_OPEN_EXISTING | FA_READ);
                _tprintf(_T("\n"));
                if (res) {
                    put_rc(res);
                    break;
                }
                while (*ptr2 == ' ') ptr2++;
                _tprintf(_T("Creating PC file \"%s\""), ptr2);
                fp = fopen(ptr2,"wb");
                _tprintf(_T("\n"));
                if (!fp) {
                    _tprintf(_T("Open Fail!\n"));
                    break;
                }
                _tprintf(_T("Copying..."));
                p1 = 0;
                for (;;) {
                    res = f_read(&file[0], Buff, sizeof Buff, &s1);
                    if (res || s1 == 0) break;   /* error or eof */
                    s2 = fwrite(Buff, 1, s1,fp);
                    p1 += s2;
                    if (s2 < s1) break;   /* error or disk full */
                }
                _tprintf(_T("\n"));
                if (res) put_rc(res);
                f_close(&file[0]);
                fclose(fp);
                _tprintf(_T("%lu bytes copied.\n"), p1);
                break;

程式基礎是從fx指令改出來的。

沒有留言:

張貼留言