Russian Qt Forum

Qt => Работа с сетью => Тема начата: kotofos от Сентябрь 28, 2015, 11:47



Название: libmodbus errno ETIMEDOUT на win32
Отправлено: kotofos от Сентябрь 28, 2015, 11:47
Здравствуйте.
Есть необходимость опрашивать устройство по модбасу.
Решил использовать 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);
    }
}


Название: Re: libmodbus errno ETIMEDOUT на win32
Отправлено: sergek от Сентябрь 30, 2015, 20:05
На мой взгляд, информативность сообщения о таймауте не больше "неизвестной ошибки".


Название: Re: libmodbus errno ETIMEDOUT на win32
Отправлено: kotofos от Октябрь 06, 2015, 08:00
Разобрался. Действительно так оно и есть. https://stackoverflow.com/questions/13523532/strerror-with-mingw-w64 (https://stackoverflow.com/questions/13523532/strerror-with-mingw-w64)