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

发布于 2022-09-11 15:09:34 字数 1123 浏览 23 评论 0

最近在写一款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;
}

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文