【问题标题】:writing array to serial port c将数组写入串行端口 c
【发布时间】:2018-12-11 07:21:02
【问题描述】:

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

我的尝试:

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

我做的有什么问题吗?

【问题讨论】:

  • 可能有问题。也许不是。 write 返回什么?你检查过错误吗?有错误吗?当您修复缺少的右括号并构建程序并运行它时会发生什么?
  • @Someprogrammerdude 如何检查写入返回值?
  • 首先阅读手册页。在终端中运行命令man write。或look online.

标签: c linux raspberry-pi serial-port


【解决方案1】:

是的,有问题。

  1. 如果操作失败,serialOpen() 返回 -1,errno 设置为指示错误。

    确保在程序开头包含&lt;stdlib.h&gt;&lt;stdio.h&gt;&lt;string.h&gt;&lt;errno.h&gt;&lt;wiringSerial.h&gt;,并使用例如打开串行端口

        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()。至少,确保您包含&lt;termios.h&gt;,然后这样做

        tcdrain(fd);
    

    确保内核发送所有串行数据;它只会在到目前为止写入fdfd 对串行端口或 tty 开放)之后返回。

另外,我建议不要使用serialPutchar()serialPuts()serialPrintf()serialGetchar(),因为they do not have any kind of error checking

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 2014-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多