将阵列写入串口c

时间:2018-12-11 07:21:02

标签: c linux raspberry-pi serial-port

我想根据以下指南将十六进制字节数组写入串行端口,以与板进行通信。

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 :(得分:1)

是的,这有问题。

  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);
        }
    
  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(),因为they do not have any kind of error checking