plc 232 串口通信,发送完读取命令后,只回复了1或2个字节?

Ethson
  • 2k

最近在写一款PLC的通信协议,我给它发送读取地址 0x0000 后 1 个字节的命令后(PLC中地址 0x0000 存在,且发送成功,且发送的数据正确),它按道理应该给我发送 12 字节(包括 ACK ,站号,错误码,等等)。

但是我测试多次,它只给我回复了 1 或 2 个字节的数据,当我下次再发送相同的读取指令后,它才把后面的 11 或 10 个字节的数据给我。

随后我用串口调试工具,仅一次发送,就收到了全部的 12 个字节,并没有出错。所以当时就在想是不是代码在 read_n 的封装上出了问题,接着我在里边加了调试,发送它在收到那 1 或 2 个字节后,接下去的 read 直接返回 0,errno 被置为 110(Connection timed out).

ssize_t ha_read_n(int fd, void *buf, size_t count)
{
    size_t nleft = count;
    ssize_t nread;
    char *bufp = (char*) buf;
    while (nleft > 0)
    {
        if ((nread = read(fd, bufp, nleft)) < 0)
        {
            if (errno == EINTR)
            {
                //printf("read_n: nread = %d, errno = EINTR(%d)\n", (int)nread, errno);
                continue;
            }
            return -1;
        }
        else if (nread == 0)
        {    
            //printf("read_n: nread = 0, errno = %d\n", errno); 
            // 每次都在这个地方就退出了, errno == 110
            return count - nleft;
        }

        bufp += nread; 
        nleft -= nread; 
    }

    return count;
}

有人遇到这种情况,或者我的代码有哪些纰漏么?

回复
阅读 2.1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏