Russian Qt Forum
Март 28, 2024, 21:14 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: libmodbus errno ETIMEDOUT на win32  (Прочитано 3673 раз)
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);
    }
}
« Последнее редактирование: Сентябрь 28, 2015, 11:49 от kotofos » Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 861


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #1 : Сентябрь 30, 2015, 20:05 »

На мой взгляд, информативность сообщения о таймауте не больше "неизвестной ошибки".
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
kotofos
Гость
« Ответ #2 : Октябрь 06, 2015, 08:00 »

Разобрался. Действительно так оно и есть. https://stackoverflow.com/questions/13523532/strerror-with-mingw-w64
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 22.