我们经常在读取modbus设备时(特别是modbus-rtu)要检查返回数据是否正确合法,自己写个函数往往还不够完美,其实modbus开源库有现成的,我抽出来给大家分享。
int check_confirmation(uint8_t *req, uint8_t *rsp, int rsp_length)
{
int rc;
int rsp_length_computed;
const int offset = _MODBUS_RTU_HEADER_LENGTH;
const int function = rsp[offset];
rsp_length_computed = compute_response_length_from_request(req);
/* Exception code */
if (function >= 0x80) {
if (rsp_length == (offset + 2 + (int)_MODBUS_RTU_CHECKSUM_LENGTH) &&
req[offset] == (rsp[offset] - 0x80)) {
/* Valid exception code received */
int exception_code = rsp[offset + 1];
if (exception_code < MODBUS_EXCEPTION_MAX) {
errno = MODBUS_ENOBASE + exception_code;
} else {
errno = EMBBADEXC;
}
_error_print(NULL);