Здравствуйте.
Есть необходимость опрашивать устройство по модбасу.
Решил использовать libmodbus
http://libmodbus.org/QT 5, windows 7, kits: win32, mingw; libmodbus v3.1.2
Пока устройство отвечает всё ок, но стоит разорвать связь (выдернуть провод из ком порта) modbus_read_registers возвращает -1, что и должно.
errno устанавливается в ETIMEDOUT что тоже ок.
Но errorStr = modbus_strerror(errno) возвращает "Unknown error".
В коде modbus_strerror для ETIMEDOUT вызывается default:
switch(errnum) {
...
default:
return strerror(errnum);
}
который и возващает строку "Unknown error". Получается системный strerror() на win32 не поддерживает ETIMEDOUT?
Если так, то libmodbus не полностью кроссплатформа? И нужно добавлять case ETIMEDOUT?
errno.h подключен, ETIMEDOUT в нём задефайнен как 138
Код modbus_strerror
const char *modbus_strerror(int errnum) {
switch (errnum) {
case EMBXILFUN:
return "Illegal function";
case EMBXILADD:
return "Illegal data address";
case EMBXILVAL:
return "Illegal data value";
case EMBXSFAIL:
return "Slave device or server failure";
case EMBXACK:
return "Acknowledge";
case EMBXSBUSY:
return "Slave device or server is busy";
case EMBXNACK:
return "Negative acknowledge";
case EMBXMEMPAR:
return "Memory parity error";
case EMBXGPATH:
return "Gateway path unavailable";
case EMBXGTAR:
return "Target device failed to respond";
case EMBBADCRC:
return "Invalid CRC";
case EMBBADDATA:
return "Invalid data";
case EMBBADEXC:
return "Invalid exception code";
case EMBMDATA:
return "Too many data";
case EMBBADSLAVE:
return "Response not from requested slave";
default:
return strerror(errnum);
}
}