📄 uartcomm.c
字号:
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 + -