我想写一个十六进制字节数组到一个串行端口根据以下指南与一个板通信。
c - 将阵列写入串口c-LMLPHP
我的尝试:

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

我在做什么有什么问题吗?

最佳答案

是的,有问题。
serialOpen()如果操作失败,返回-1,并设置errno以指示错误。
确保在程序开头包含<stdlib.h><stdio.h><string.h><errno.h><wiringSerial.h>,并使用例如。

    int fd;

    fd = serialOpen("/dev/ttyS0", 115200);
    if (fd == -1) {
        fprintf(stderr, "Cannot open /dev/ttyS0: %s.\n", strerror(errno));
        exit(EXIT_FAILURE);
    }

write()可能会返回短计数。你不能以为它成功地发送了所有东西。我建议您使用helper函数,例如
#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.
        */
    }

不要做sleep()。至少,确保包含<termios.h>,并且
    tcdrain(fd);

为了确保内核发送所有串行数据,它将只在所有写入fd的内容(打开到串行端口或tty)之后返回。
另外,我建议不要使用fdserialPutchar()serialPuts()serialPrintf(),因为they do not have any kind of error checking

关于c - 将阵列写入串口c,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53719200/

10-12 00:18
查看更多