bricle 发表于 2024-3-20 18:39:40

请问ModBus教程里面MODH_Send10H函数为啥不需要将从机应答标志位置为0

本帖最后由 bricle 于 2024-3-20 18:42 编辑

/*
*********************************************************************************************************
*      函 数 名: MODH_Send10H
*      功能说明: 发送10H指令,连续写多个保持寄存器. 最多一次支持23个寄存器。
*      形    参: _addr : 从站地址
*                        _reg : 寄存器编号
*                        _num : 寄存器个数n (每个寄存器2个字节) 值域
*                        _buf : n个寄存器的数据。长度 = 2 * n
*      返 回 值: 无
*********************************************************************************************************
*/
void MODH_Send10H(uint8_t _addr, uint16_t _reg, uint8_t _num, uint8_t *_buf)
{
      uint16_t i;
      
      g_tModH.TxCount = 0;
      g_tModH.TxBuf = _addr;                /* 从站地址 */
      g_tModH.TxBuf = 0x10;                /* 从站地址 */      
      g_tModH.TxBuf = _reg >> 8;      /* 寄存器编号 高字节 */
      g_tModH.TxBuf = _reg;                /* 寄存器编号 低字节 */
      g_tModH.TxBuf = _num >> 8;      /* 寄存器个数 高字节 */
      g_tModH.TxBuf = _num;                /* 寄存器个数 低字节 */
      g_tModH.TxBuf = 2 * _num;      /* 数据字节数 */
      
      for (i = 0; i < 2 * _num; i++)
      {
                if (g_tModH.TxCount > H_RX_BUF_SIZE - 3)
                {
                        return;                /* 数据超过缓冲区超度,直接丢弃不发送 */
                }
                g_tModH.TxBuf = _buf;                /* 后面的数据长度 */
      }
      
      MODH_SendAckWithCRC();      /* 发送数据,自动加CRC */
}



这是ModBus例程里面的16功能码对应的发送代码,其余功能码的发送函数都有类似下面这条语句,很好奇为啥这条功能码不用加。
g_tModH.fAck06H = 0;                /* 如果收到从机的应答,则这个标志会设为1 */


skyshine 发表于 2024-3-21 08:36:42

估计是漏了没加上去,看到有写g_tModH.fAck10H的判断逻辑

bricle 发表于 2024-3-21 15:44:08

skyshine 发表于 2024-3-21 08:36
估计是漏了没加上去,看到有写g_tModH.fAck10H的判断逻辑

应该是,不然想不清楚为啥

eric2013 发表于 2024-3-22 08:54:09

要加上,谢谢楼主指出问题。
页: [1]
查看完整版本: 请问ModBus教程里面MODH_Send10H函数为啥不需要将从机应答标志位置为0