Скачать большой файл с SD с помощью Lwip - PullRequest
0 голосов
/ 03 октября 2019

Я новичок в мире lwip, и я пытаюсь загрузить большой файл с SD-карты. Я работаю над STM32F4 Discovery, мне нужно читать 2 значения температуры каждую секунду и записывать его в файл на SD-карте. Я могу читать и писать в 4-битном режиме SDIO с DMA без каких-либо проблем. Мне тоже нужен веб-сервер, с которого я могу в реальном времени отслеживать эти значения. Поэтому, используя STM32CubeMx V 5.0.1, я просто добавил Middleware Lwip 2.0.3 и настроил его. Я использую Freertos 9.0.0 с одной задачей (на данный момент), чтобы управлять чем-то другим. Я использую API-интерфейс netconn, чтобы предоставить некоторую страницу браузеру и управлять ею. Если мне нужно отправить в браузер маленький файл, который умещается в одном массиве, у меня нет проблем, НО Если мне нужно отправить файл большего размера (1 МБ), то все зависнет. Это моя функция:

#define BUFFER_OUT 1000
static BYTE DownloadBuffer[BUFFER_OUT] __attribute__ ((section(".sdram")));
UINT DownloadCounter, sentCounter;
void log_download(struct netconn *conn, const char* myFileName)
{
    FATFS myFatFS;
    FRESULT res;
    uint archDownCounter = 0;
    int sentCounter = 0;
    size_t written;
    int dx;
    err_t test;
    FIL myFile;
    FILINFO fno;
    if (f_mount(&myFatFS,SDPath,1)==FR_OK){
        if (f_open(&myFile, myFileName, FA_OPEN_EXISTING | FA_READ) == FR_OK)
        {
            f_stat(myFileName, &fno);
            dx = snprintf(DownloadBuffer, BUFFER_OUT,"HTTP/1.1 200 OK \r\nContent-Type: file/csv\r\nContent-Length: %lu\r\n\r\n", fno.fsize);
            netconn_write(conn, (const char* )( DownloadBuffer), (size_t )cx, NETCONN_NOCOPY);
            for (;;)
            {
                if(conn->state == NETCONN_NONE) // check the state
                {
                    res = f_read(&myFile, DownloadBuffer, sizeof DownloadBuffer, &DownloadCounter); /* Read a chunk of source file */
                    if(DownloadCounter == 0) break; /* error or eof */
                    test = netconn_write_partly(conn, (const char*) (DownloadBuffer), (size_t) DownloadCounter, NETCONN_MORE, &written);
                    if (test != ERR_OK) break; /* error or disk full */
                    if (written != DownloadCounter) break;
                    vTaskDelay(50); //time for other tasks
                }
            }
            f_close(&myFile);
        }
    }
}

Поэтому, когда я вызываю netconn_write_partly, плата останавливается. Я гуглил весь интернет и ничего не нашел. Мой вопрос: есть ли способ сделать это? Заранее большое спасибо всем, кто хочет мне помочь.

...