硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4377|回复: 3
收起左侧

[技术讨论] modbus报文帧由时长至少为 3.5 个字符时间的空闲间隔区分是不是多写了一个0

[复制链接]

1

主题

0

回帖

3

积分

新手上路

积分
3
发表于 2019-5-8 15:02:26 | 显示全部楼层 |阅读模式
3.5个字符的间隔写成3500000/HBAUD485才对   是不是多写了一个0呢。
timeout = 35000000 / HBAUD485;       

void MODH_ReciveNew(uint8_t _data)
{
        /*
                3.5个字符的时间间隔,只是用在RTU模式下面,因为RTU模式没有开始符和结束符,
                两个数据包之间只能靠时间间隔来区分,Modbus定义在不同的波特率下,间隔时间是不一样的,
                所以就是3.5个字符的时间,波特率高,这个时间间隔就小,波特率低,这个时间间隔相应就大

                4800  = 7.297ms
                9600  = 3.646ms
                19200  = 1.771ms
                38400  = 0.885ms
        */
        uint32_t timeout;

        g_modh_timeout = 0;
       
        timeout = 35000000 / HBAUD485;                /* 计算超时时间,单位us 35000000*/
       
        /* 硬件定时中断,定时精度us 硬件定时器2用于MODBUS从机, 定时器3用于MODBUS从机主机*/
        bsp_StartHardTimer(3, timeout, (void *)MODH_RxTimeOut);

        if (g_tModH.RxCount < H_RX_BUF_SIZE)
        {
                g_tModH.RxBuf[g_tModH.RxCount++] = _data;
        }
}

/*

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107558
QQ
发表于 2019-5-8 17:21:09 | 显示全部楼层
这里隐藏了一个知识点,就是HBAUD485是波特率,差8倍的关系,为了省事,就是上面的公式了。
回复

使用道具 举报

1

主题

1

回帖

4

积分

新手上路

积分
4
发表于 2019-5-9 17:42:41 | 显示全部楼层
eric2013 发表于 2019-5-8 17:21
这里隐藏了一个知识点,就是HBAUD485是波特率,差8倍的关系,为了省事,就是上面的公式了。

差8倍,请指教一下,没明白。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107558
QQ
发表于 2019-5-9 17:48:02 | 显示全部楼层
3.5 / (HBAUD485 / 8) * 1000000 = 3500000 * 8 / HBAUD485   程序里面直接取值  3500000 * 10 / HBAUD485 算的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-5 23:23 , Processed in 0.232833 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表