Отправка образа BMP на последовательный порт с помощью C - PullRequest
0 голосов
/ 14 июня 2019

Я работаю с EDC mpos, чтобы получить подпись пользователя

Теперь я сохраняю подпись клиента в виде изображения, например «sign.bmp», затем хочу отправить это изображение на последовательный порт (у меня есть приложение C # для получения данных).Поэтому я не могу отправить изображение на последовательный порт.Вот что я пробовал:

void ReadImageToBuffer(char fileName[],char szTemp[])
{
    FILE *file;
    long fileLength;
    char *buffer;

    lcdCls();
    SignatureHeaderBar();
    lcdDisplay(0,3,DISP_CFONT|DISP_CLRLINE,"file name: %s",fileName);
    lcdFlip();
    kbGetKey();

    // open file
    file = fopen(fileName,"r");

    if (!file)
    {
        lcdCls();
        SignatureHeaderBar();
        lcdDisplay(0,3,DISP_CFONT|DISP_CLRLINE,"Unable to open file %s",fileName);
        lcdFlip();
        kbGetKey();
    }
    else
    {
        lcdCls();
        SignatureHeaderBar();
        lcdDisplay(0,3,DISP_CFONT|DISP_CLRLINE,"file opened");
        lcdFlip();
        kbGetKey();

        // Get file length
        fseek(file, 0, SEEK_END); // Jumpt to the end of file
        fileLength = ftell(file); // Get current byte offset
        fseek(file, 0, SEEK_SET); // Jump back to begin at file

        // allocate memory
        buffer = (char *)malloc((fileLength+1)*sizeof(char));

        if (!buffer)
        {
            lcdCls();
            SignatureHeaderBar();
            lcdDisplay(0,3,DISP_CFONT|DISP_CLRLINE,"Memory error");
            lcdFlip();
            kbGetKey();
        }
        else
        {
            // read file content
            fread(buffer, fileLength, 1, file);

            lcdCls();
            SignatureHeaderBar();
            lcdDisplay(0,3,DISP_CFONT|DISP_CLRLINE,"readed content");
            lcdFlip();
            kbGetKey();
        }

        // close file
        fclose(file);

        lcdCls();
        SignatureHeaderBar();
        lcdDisplay(0,3,DISP_CFONT|DISP_CLRLINE,"szTemp size %d",strlen(szTemp));
        lcdDisplay(0,5,DISP_CFONT|DISP_CLRLINE,"buffer %d",buffer ? 1 : 0);
        lcdDisplay(0,7,DISP_CFONT|DISP_CLRLINE,"signResult size %d",strlen(signResult));
        lcdFlip();
        kbGetKey();

        //void ExternalSerialWrite(char dataByte[]);
        ExternalSerialWrite(buffer);
    }
}

Я не разработчик C, я знаю только базовый C и поиск в Google "Как ..." в интернете

Так что моя проблема в том, какотправить изображение на последовательный порт (в моем случае я не могу получить данные изображения в байтах)

Вот мой ExternalSerialWrite ()

void ExternalSerialWrite(char dataByte[])
{
    write(*uartIfd, dataByte, strlen(dataByte));
}

1 Ответ

2 голосов
/ 14 июня 2019

Изображения двоичные файлы.

Итак, прежде всего вам нужно открыть его как таковой. Во-вторых, поскольку данные представляют собой произвольные байты любого значения, включая встроенные нули (которые, как правило, равны строковому нулевому ограничителю), вы не можете использовать строковые функции, такие как strlen.

Вам необходимо отслеживать размер прочитанных данных (который не должен включать +1, добавляемый при выделении) и передавать этот размер функции ExternalSerialWrite в качестве аргумента.

...