本帖最后由 bricle 于 2024-3-20 18:42 编辑
[C] 纯文本查看 复制代码 /*
*********************************************************************************************************
* 函 数 名: 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[g_tModH.TxCount++] = _addr; /* 从站地址 */
g_tModH.TxBuf[g_tModH.TxCount++] = 0x10; /* 从站地址 */
g_tModH.TxBuf[g_tModH.TxCount++] = _reg >> 8; /* 寄存器编号 高字节 */
g_tModH.TxBuf[g_tModH.TxCount++] = _reg; /* 寄存器编号 低字节 */
g_tModH.TxBuf[g_tModH.TxCount++] = _num >> 8; /* 寄存器个数 高字节 */
g_tModH.TxBuf[g_tModH.TxCount++] = _num; /* 寄存器个数 低字节 */
g_tModH.TxBuf[g_tModH.TxCount++] = 2 * _num; /* 数据字节数 */
for (i = 0; i < 2 * _num; i++)
{
if (g_tModH.TxCount > H_RX_BUF_SIZE - 3)
{
return; /* 数据超过缓冲区超度,直接丢弃不发送 */
}
g_tModH.TxBuf[g_tModH.TxCount++] = _buf[i]; /* 后面的数据长度 */
}
MODH_SendAckWithCRC(); /* 发送数据,自动加CRC */
}
这是ModBus例程里面的16功能码对应的发送代码,其余功能码的发送函数都有类似下面这条语句,很好奇为啥这条功能码不用加。
[C] 纯文本查看 复制代码 g_tModH.fAck06H = 0; /* 如果收到从机的应答,则这个标志会设为1 */
|