запись массива в последовательный порт c - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу записать шестнадцатеричный массив байтов в последовательный порт в соответствии со следующим руководством для связи с платой.

enter image description here

моя попытка:

if((fd = serialOpen ("/dev/ttyS0", 115200)) < 0 {
    return;
}
unsigned char command[6] = {0x3E,0x52,0x01,0x53,0x01,0x01};
write(fd,command,6);
sleep(1);

Что-то не так с тем, что я делаю?

1 Ответ

0 голосов
/ 11 декабря 2018

Да, с ним что-то не так.

  1. serialOpen() возвращает -1 в случае сбоя операции, с errno для указания ошибки.

    Убедитесь, что вы включили <stdlib.h>, <stdio.h>, <string.h>, <errno.h> и <wiringSerial.h> в начале вашей программы, и откройте последовательный порт, используя, например,

    * 1017.*
  2. write() может вернуть короткий счет.Вы не можете просто предположить, что все успешно отправлено.Я рекомендую использовать вспомогательную функцию, например,

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    int writeall(const int fd, const void *data, const size_t len)
    {
        const char        *ptr = (const char *)data;
        const char *const  end = (const char *)data + len;
        ssize_t            n;
    
        while (ptr < end) {
            n = write(fd, ptr, (size_t)(end - ptr));
            if (n > 0)
                ptr += n;
            else
            if (n != -1)
                return errno = EIO;
            else
            if (errno != EINTR)
                return errno;
        }
    
        return 0;
    }
    
    #ifdef __cplusplus
    }
    #endif
    

    , которая возвращает 0 для успеха и ненулевое значение для ошибок.Вы можете использовать его таким образом:

        if (writeall(fd, "\x3E\x52\x01\x53\x01\x01", 6)) {
            fprintf(stderr, "Serial write error: %s.\n", strerror(errno));
            /* If this is fatal, do exit(EXIT_FAILURE) here.
               If the error is not a fatal one, let the program continue.
            */
        }
    
  3. Не делай sleep().Как минимум, убедитесь, что вы включили <termios.h> и выполните

        tcdrain(fd);
    

    , чтобы ядро ​​отправляло все последовательные данные;он вернется только после того, как все написанное до сих пор fd (fd открыт для последовательного порта или tty).

Кроме того, я рекомендую не использовать serialPutchar(), serialPuts(), serialPrintf() и serialGetchar(), потому что они не имеют никакой проверки ошибок .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...