⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uartcomm.c

📁 Modbus串口通讯协议通讯源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
        if (len - 6 != dwSize * 8) return ECOM_RECVDATA;
        else break;
    case COMMAND_BIT_WR:
    case COMMAND_CHAR_WR:
    case COMMAND_SHORT_WR:
    case COMMAND_LONG_WR:
        if (len != 6) return ECOM_RECVDATA;
        else return ECOM_NOERROR;
    case COMMAND_VERSION_RD:
        if (len != 10) return ECOM_RECVDATA;
    }

    return len;
}


/*******************************************************************************
函数名: GetFinalBitData
描  述: 获将发送的ASCII码格式转化为INT8U形式,并且去掉前缀和后缀
输  入: pszFrame     已校验桢数据的首地址,数据中包括下位机地址,操作命令和校验码
        pszResult     最终返回的数据的首地址
        len           已校验桢数据的位数
输  出: pszResult     获得最终的位数据
返回值: INT32U 类型, 返回转换的个数
*******************************************************************************/
INT32U GetFinalBitData(INT8U *pszResult, const INT8U* pszFrame, INT32U len)
{
    INT32U index = 0;

    for (; index < (len - 6); ++index)
    {
        /*将pbyResult从ASCII的格式变为字节形式*/

        pszResult[index] = AsciiToBit(pszFrame + 4 + index);
    }

    return index;
}

/*******************************************************************************
函数名: GetFinalByteData
描  述: 将发送的ASCII码格式转化为INT8U形式,并且去掉前缀和后缀
输  入: pszFrame     已校验桢数据的首地址,数据中包括下位机地址,操作命令和校验码
        pbyResult     最终返回的数据的首地址
        len           已校验桢数据的字节数
输  出: pbyResult     获得最终的字节数据
返回值: INT32U 类型, 返回转换的个数
*******************************************************************************/
INT32U GetFinalByteData(INT8U *pbyResult, const INT8U* pszFrame, INT32U len)
{
    INT32U index = 0;

    for (; index < (len - 6) / 2; ++index)
    {
        /*将pbyResult从ASCII的格式变为字节形式*/
        pbyResult[index] = AsciiToByte(pszFrame + 4 + index * 2);
    }

    return index;
}

/*******************************************************************************
函数名: GetFinalWordData
描  述: 将发送的ASCII码格式转化为INT16U形式,并且去掉前缀和后缀
输  入: pszFrame     已校验桢数据的首地址,数据中包括下位机地址,操作命令和校验码
        pwResult      最终返回的数据的首地址
        len           已校验桢数据的字数
输  出: pwResult     获得最终的字数据
返回值: INT32U 类型, 返回转换的个数
*******************************************************************************/
INT32U GetFinalWordData(INT16U *pwResult, const INT8U* pszFrame, INT32U len)
{
    INT32U index = 0;

    for (; index < (len - 6) / 4; ++index)
    {
         /*将pwResult从ASCII的格式变为字形式*/
        pwResult[index] = AsciiToWord(pszFrame + 4 + index * 4);
    }

    return index;  //返回转化的字个数
}

/*******************************************************************************
函数名: GetFinalDWordData
描  述: 将发送的ASCII码格式转化为INT32U形式,并且去掉前缀和后缀
输  入: pszFrame     已校验桢数据的首地址,数据中包括下位机地址,操作命令和校验码
        pdwResult      最终返回的数据的首地址
        len           已校验桢数据的字数
输  出: pdwResult     获得最终的字数据
返回值: INT32U 类型, 返回转换的个数
*******************************************************************************/
INT32U GetFinalDWordData(INT32U *pdwResult, const INT8U* pszFrame, INT32U len)
{
    INT32U index = 0;

    for (; index < (len - 6) / 8; ++index)
    {
         /*将pwResult从ASCII的格式变为字形式*/
        pdwResult[index] = AsciiToDWord(pszFrame + 4 + index * 8);
    }
    
    return index;  //返回转化的字个数
}

/*******************************************************************************
函数名: SendWriteBitCommand
描  述: 发送写位信息,供写位函数调用
输  入: byAddr    选用的下位机地址,如1,2等
        pstcTagCmd 写位的信息TAG,详见通讯协议的方式
        pabyInput  存放写入位数据的首地址
输  出: 无
返回值: INT32S 类型,其值表示函数的执行结果,操作成功返回发送的数据长度,否则返回
        错误代码,调用GetErrMsg可获得详细的错误信息
*******************************************************************************/
INT32S SendWriteBitCommand(const STC_TAG_COMMAND *pstcTagCmd, INT8U byAddr, const INT8U *pabyInput)
{
    INT32S len, result;
    INT8S* buf = (INT8S *)malloc(g_iMaxFrameSize + 1);  //用来存储发送的数据
    INT8U  index;

    /*将buf中的数据格式化为通讯协议所要求的格式*/
    len = sprintf(buf, ":%02X%02X%C%C%04X%02X", byAddr, COMMAND_BIT_WR,
                  pstcTagCmd->stcTag.cFlag, pstcTagCmd->stcTag.bit + 0x30,
                  pstcTagCmd->stcTag.addr, pstcTagCmd->byRange);
    /*要写入的数据*/
    for (index = 0; index < pstcTagCmd->byRange; index++, pabyInput++)
    {
       len += sprintf(&buf[len],"%C",*pabyInput + 0x30);
    }
    /*LRC校验和结束符*/
    len += sprintf(&buf[len], "%02X\x0d\x0a", CaculateLRC(buf + 1, len - 1));


    result = sio_write(g_iComNumber, buf, len);    //发送到串口发送缓冲区

    free(buf); //释放buf指针
    
    #ifndef  FORTESTONLY                           //测试编译开关
      return result;
    #else
      return len;                                //for test only
    #endif
    
}

/*******************************************************************************
函数名: SendWriteByteCommand
描  述: 发送写字节信息,供写字节函数调用
输  入: byAddr    选用的下位机地址,如1,2等
        pstcTagCmd 写字节的信息TAG,详见通讯协议的方式
        pabyInput  存放写入字节数据的首地址
输  出: 无
返回值: INT32S 类型,其值表示函数的执行结果,操作成功返回发送的数据长度,否则返回
        错误代码,调用GetErrMsg可获得详细的错误信息
*******************************************************************************/
INT32S SendWriteByteCommand(const STC_TAG_COMMAND *pstcTagCmd, INT8U byAddr, const INT8U *pabyInput)
{
    INT32S len, result;
    INT8S* buf = (INT8S *)malloc(g_iMaxFrameSize + 1);  //用来存储发送的数据
    INT8U  index;

    /*将buf中的数据格式化为通讯协议所要求的格式*/
    len = sprintf(buf, ":%02X%02X%C%C%04X%02X", byAddr, COMMAND_CHAR_WR,
                  pstcTagCmd->stcTag.cFlag, 'B',
                  pstcTagCmd->stcTag.addr, pstcTagCmd->byRange);

    /*要写入的数据,%02是因为写入字节*/
    for (index = 0; index < pstcTagCmd->byRange; index++, pabyInput++)
    {
       len += sprintf(&buf[len],"%02X",*pabyInput);
    }
    /*LRC校验和结束符*/
    len += sprintf(&buf[len], "%02X\x0d\x0a", CaculateLRC(buf + 1, len - 1));

    result =  sio_write(g_iComNumber, buf, len);    //发送到串口发送缓冲区
    
    free(buf); //释放buf指针

    #ifndef  FORTESTONLY                           //测试编译开关
      return result;
    #else
      return len;                                //for test only
    #endif

}

/*******************************************************************************
函数名: SendWriteWordCommand
描  述: 发送写字信息,供写字函数调用
输  入: byAddr    选用的下位机地址,如1,2等
        pstcTagCmd 写字的信息TAG,详见通讯协议的方式
        pawInput   存放写入字数据的首地址
输  出: 无
返回值: INT32S 类型,其值表示函数的执行结果,操作成功返回发送的数据长度,否则返回
        错误代码,调用GetErrMsg可获得详细的错误信息
*******************************************************************************/
INT32S SendWriteWordCommand(const STC_TAG_COMMAND *pstcTagCmd, INT8U byAddr, const INT16U *pawInput)
{
    INT32S len, result;
    INT8S* buf = (INT8S *)malloc(g_iMaxFrameSize + 1);  //用来存储发送的数据
    INT8U  index;

    /*将buf中的数据格式化为通讯协议所要求的格式*/
    len = sprintf(buf, ":%02X%02X%C%C%04X%02X", byAddr, COMMAND_SHORT_WR,
                  pstcTagCmd->stcTag.cFlag, 'W',
                  pstcTagCmd->stcTag.addr, pstcTagCmd->byRange);

    /*要写入的数据,%04是因为写入字*/
    for (index = 0; index < pstcTagCmd->byRange; index++, pawInput++)
    {
       len += sprintf(&buf[len],"%04X",*pawInput);
    }
    /*LRC校验和结束符*/
    len += sprintf(&buf[len], "%02X\x0d\x0a", CaculateLRC(buf + 1, len - 1));

    result =  sio_write(g_iComNumber, buf, len);    //发送到串口发送缓冲区
   
    free(buf); //释放buf指针
   
    #ifndef  FORTESTONLY                           //测试编译开关
      return result;
    #else
      return len;                                //for test only
    #endif
}

/*******************************************************************************
函数名: SendDWriteWordCommand
描  述: 发送写双字信息,供写双字函数调用
输  入: byAddr    选用的下位机地址,如1,2等
        pstcTagCmd 写双字的信息TAG,详见通讯协议的方式
        padwInput  存放写入双字数据的首地址
输  出: 无
返回值: INT32S 类型,其值表示函数的执行结果,操作成功返回发送的数据长度,否则返回
        错误代码,调用GetErrMsg可获得详细的错误信息
*******************************************************************************/
INT32S SendWriteDWordCommand(const STC_TAG_COMMAND *pstcTagCmd, INT8U byAddr, const INT32U *padwInput)
{
    INT32S len, result;
    INT8S* buf = (INT8S *)malloc(g_iMaxFrameSize + 1);  //用来存储发送的数据
    INT8U  index;

    /*将buf中的数据格式化为通讯协议所要求的格式*/
    len = sprintf(buf, ":%02X%02X%C%C%04X%02X", byAddr, COMMAND_LONG_WR,
                  pstcTagCmd->stcTag.cFlag, 'D',
                  pstcTagCmd->stcTag.addr, pstcTagCmd->byRange);

    /*要写入的数据,%08是因为写入双字*/
    for (index = 0; index < pstcTagCmd->byRange; index++, padwInput++)
    {
       len += sprintf(&buf[len],"%08X",*padwInput);
    }
    /*LRC校验和结束符*/
    len += sprintf(&buf[len], "%02X\x0d\x0a", CaculateLRC(buf + 1, len - 1));

    result =  sio_write(g_iComNumber, buf, len);    //发送到串口发送缓冲区

    free(buf); //释放buf指针

    #ifndef  FORTESTONLY                           //测试编译开关
      return result;
    #else
      return len;                                //for test only
    #endif

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -