LINUX.ORG.RU
ФорумTalks

Разработчки MacOS X и GNU/Linux — быдлокодеры?

 


1

2

см. Не устанавливаются настройки /dev/ttyUSBX

Это ж надо было совместить функционал драйверов телетайпов с функционалом серийных портов вообще. Знаю, что этот быдлокод — ещё наследие юникса. Ну ладно, совместили, но ведь можно ж было позже поправить (100 лет в обед схеме), или хотя бы вменяемые сообщения об ошибках запилить. Так нет же. Вот как я должен догадаться, что означает ENOTTY, для устройства, которое и не является терминалом, и для которого при открытии установлен флаг O_NOCTTY?

//хотя до питонистов им всё ещё далеко

★★★★★

скоро телетайпы будут в системд, проблема будет решена

xsektorx ★★★ ()

Ты гонишь, это серийные порты вообще - наследие телетайпов.
И да, чип и производитель чипа USB-RS232 - в студию.

Shadow ★★★★★ ()
Ответ на: комментарий от Shadow

Ты гонишь, это серийные порты вообще - наследие телетайпов.

только вот, на ПК нет иного способа нормальной связи с примитивными девайсами, кроме как через серийный порт. именно поэтому usb->serial живые до сих пор и вполне себе здравствуют.

//несмотря даже на то, что серийный порт рассчитан на уродский RS-232, вместо RS-485

next_time ★★★★★ ()

1. эмм.. а делался ли TIOCGSERIAL перед TIOCSSERIAL ? Если нет - то надо бы сделать, т.к. вероятно что некорректно заполнил serial struct.

2. Какие параметры из serial struct пытался установить?

kuzulis ★★ ()
Ответ на: комментарий от kuzulis

TIOCGSERIAL

да, оно выдавало ту же ошибку

Какие параметры из serial struct пытался установить?

разные пытался, оно всегда выдаёт ENOTTY

//кстати, при попытке записи, устройство реагирует звуковым сигналом и write даже возвращает верное количество записанных байт (хотя, поняло ли ус-во что именно ему пытаюсь передать, проверить не могу).

next_time ★★★★★ ()
Ответ на: комментарий от next_time

разные пытался, оно всегда выдаёт ENOTTY

Ах, глянул сейчас сорцы драйвера и вижу, что этот ioctl просто не реализован (вообше никакой не реализован). Возможно что оно возвращает ENOTTY поэтому, т.к. это «заглушка», т.е. не реализована эта фича в драйвере. Хотя, могу ошибаться.

UPD: Вот например, в FTDI это реализовано полностью, в PL2303 - только TIOCGSERIAL..

Q: А смысл в использовании TIOCG(S)SERIAL? Какая цель?

kuzulis ★★ ()
Последнее исправление: kuzulis (всего исправлений: 3)
Ответ на: комментарий от kuzulis

А смысл в использовании TIOCG(S)SERIAL? Какая цель?

я так проверял работоспособность и пытался установить параметры соответственно. ибо read не срабатывал, с той же ошибкой. TIOCGSERIAL, по факту, мне не нужно вообще, TIOCGSSERIAL — чтобы установить параметры

next_time ★★★★★ ()
Ответ на: комментарий от kuzulis

прочитать из порта, я так понял, из-за неправильно установленных параметров не работает чтение из порта, возможно и запись (хотя устройство и откликается)

next_time ★★★★★ ()
Ответ на: комментарий от next_time

Если имеются ввиду «baud rate/parity/stop bits/flow control», и прочее - то это вообще-то в struct termios, а struct serial ну никоим боком к этому не относится. :)

kuzulis ★★ ()
Последнее исправление: kuzulis (всего исправлений: 1)
Ответ на: комментарий от kuzulis

да, да, оно самое. я просто посмотрел strace-ом какие вызовы использует для работы с компортом тот же setserial (другие утилиты тоже проверял), и там используется ioctl с соответствующими параметрами, оно на этом фейлилось. и Qt-шные методы для работы с компортом фейлились на том же. (сперва начинал с Qt).

next_time ★★★★★ ()
Ответ на: комментарий от next_time

(сперва начинал с Qt).

точнее так, отлаживал несколько кривую чужую программу, которая использовала ioctl и внезапно не заработала совсем. взял Qt, а оно не работает и по той же причине. удивился.

next_time ★★★★★ ()
Ответ на: комментарий от next_time

и Qt-шные методы для работы с компортом фейлились на том же

Если речь про QtSerialPort - то оно дергает TIOCG(S)SERIAL в случае если ты пытаешься установить кастомную baud rate (которая не определена в termios.h). В других случаях оно его не трогает и не может фейлится.

kuzulis ★★ ()
Ответ на: комментарий от kuzulis

установить кастомную baud rate

115200, в теории оно стандартное. хотя, теперь надо перепроверить (это только завтра, к сожалению).

next_time ★★★★★ ()
Ответ на: комментарий от Harald

кстати, забавно. ведь юникс-вей, в теории, означает что каждая сущность занимается своим делом, а на практике вон оно как.

next_time ★★★★★ ()
Ответ на: комментарий от next_time

Ну так занимается же,что не так? :)

Это особенности POSIX-а, нужно просто запомнить )

Вот например USB девайсы, вебкамеры к примеру, когда им не хватает пропускной способности шины, возвращают ошибку ENOSPC

Harald ★★★★★ ()
Ответ на: комментарий от Harald

Ну так занимается же,что не так? :)

Это особенности POSIX-а, нужно просто запомнить )

так можно и про системд сказать

//впрочем, я индифферентно отношусь к системам инита

когда им не хватает пропускной способности шины, возвращают ошибку ENOSPC

не, не, я про то, что сущность телетайпа намертво привязана к сущности серийного порта и наоборот.

next_time ★★★★★ ()
Ответ на: комментарий от kuzulis

да, речь о нём, Qt 5.3.сегодня проверил — оно дергает TIOCG(S)SERIAL в любом случае. выхлоп strace:

futex(0xde4a60, FUTEX_WAKE_PRIVATE, 1)  = 1
access("/var/lock", R_OK)               = 0
access("/var/lock", W_OK)               = 0
uname({sys="Linux", node="username-desktop", ...}) = 0
open("/var/lock/LCK..ttyUSB0", O_WRONLY|O_CREAT|O_EXCL|O_CLOEXEC, 0644) = 7
fcntl(7, F_SETFD, FD_CLOEXEC)           = 0
flock(7, LOCK_EX|LOCK_NB)               = 0
open("/tmp/ddd.TJ4496", O_RDWR|O_CREAT|O_EXCL|O_CLOEXEC, 0600) = 8
fcntl(8, F_SETFD, FD_CLOEXEC)           = 0
flock(8, LOCK_EX|LOCK_NB)               = 0
fcntl(8, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=0, len=0}) = 0
lseek(8, 0, SEEK_SET)                   = 0
close(8)                                = 0
unlink("/tmp/ddd.TJ4496")               = 0
fcntl(7, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=0, len=0}) = 0
write(7, "4496\nddd\nusername-desktop\n", 23) = 23
open("/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NONBLOCK|O_CLOEXEC) = 8
fcntl(8, F_SETFD, FD_CLOEXEC)           = 0
ioctl(8, TIOCEXCL, 0x7fd114522780)      = 0
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_START or SNDRV_TIMER_IOCTL_TREAD or TCSETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
ioctl(8, TIOCGSERIAL, 0x7fffe8ed61d0)   = -1 ENOTTY (Inappropriate ioctl for device)
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_START or SNDRV_TIMER_IOCTL_TREAD or TCSETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_START or SNDRV_TIMER_IOCTL_TREAD or TCSETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_START or SNDRV_TIMER_IOCTL_TREAD or TCSETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_START or SNDRV_TIMER_IOCTL_TREAD or TCSETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_START or SNDRV_TIMER_IOCTL_TREAD or TCSETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, TIOCMGET, [0])                 = 0
ioctl(8, TIOCMGET, [0])                 = 0
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
select(9, [8], [8], NULL, NULL)         = 1 (out [8])
write(8, "GDB10\r", 6)                  = 6
nanosleep({0, 500000000}, 0x7fffe8ed6280) = 0
select(9, [8], [], NULL, {3, 0})        = 0 (Timeout)
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 9
fstat(9, {st_mode=S_IFREG|0644, st_size=2570, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fd1155b0000
read(9, "# Locale name alias data base.\n#"..., 4096) = 2570
read(9, "", 4096)                       = 0
close(9)                                = 0
munmap(0x7fd1155b0000, 4096)            = 0
open("/usr/share/locale/ru_RU.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru_RU.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru_RU/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale/ru/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ru_RU.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ru_RU.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ru_RU/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ru.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ru.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/share/locale-langpack/ru/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory)
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_START or SNDRV_TIMER_IOCTL_TREAD or TCSETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B115200 -opost -isig -icanon -echo ...}) = 0
ioctl(8, TIOCNXCL, 0x1830)              = 0
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
write(3, "\1\0\0\0\0\0\0\0", 8)         = 8
close(8)                                = 0
close(7)                                = 0
unlink("/var/lock/LCK..ttyUSB0")        = 0
poll([{fd=3, events=POLLIN}], 1, 0)     = 1 ([{fd=3, revents=POLLIN}])
poll([{fd=3, events=POLLIN}], 1, 4294967295) = 1 ([{fd=3, revents=POLLIN}])
read(3, "\7\0\0\0\0\0\0\0", 16)         = 8
poll([{fd=3, events=POLLIN}], 1, 4294967295^CProcess 4496 detached
 <detached ...>
next_time ★★★★★ ()
Ответ на: комментарий от next_time

Ага. Но не обращай внимание. Это он дергает для попытки сброса делителя перед установкой стандартной скорости (т.е. может быть ситуация, что ранее могла быть установлена кастомная скорость, поэтому ее надо заресетить). И здесь если TIOCG(S)SERIAL фейлится - то это не проблема.. В общем - забей. :)

kuzulis ★★ ()
Ответ на: комментарий от next_time

Для начала проверь что оно работает/неработает на примере Terminal и прочее. Если это не вариант - то покажи свой код (минимальный пример как и что ты там используешь).

kuzulis ★★ ()
Последнее исправление: kuzulis (всего исправлений: 2)
Ответ на: комментарий от kuzulis

Для начала проверь что оно работает/неработает на примере Terminal и прочее.

не работает. не работает даже setserial -a.

то покажи свой код (минимальный пример как и что ты там используешь)

только в понедельник смогу, к сожалению

next_time ★★★★★ ()
Ответ на: комментарий от kuzulis
void RW::wrapper_for_thread(){
    QSerialPort port(info.portName());
    port.setBaudRate(QSerialPort::Baud115200);
    port.setParity(QSerialPort::NoParity);
    port.setDataBits(QSerialPort::Data8);
    port.setStopBits(QSerialPort::OneStop);
    port.setFlowControl( QSerialPort::NoFlowControl);
    if(!port.open(QIODevice::ReadWrite)){ std::cout<<"port not opened\n"; return;}
    auto y = port.write(ask, 6);
    port.waitForBytesWritten(-1);
    cout<<"writen: "<<y<<endl;
    char out[] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
    int got = 0;
    thread->msleep(500); //без задержки не читает нигде,
    //так и не понял, почему, если есть waitForReadyRead
    port.waitForReadyRead(3000);
    got = port.read(out, 10);

    cout<<"got: "<<out<<endl;
    cout<<"got size: "<<got<<endl;
    port.close();
}

на оффтопике код работает, с обычным серийным портом — тоже, с переходником usb-->serial нет.

next_time ★★★★★ ()
Ответ на: комментарий от next_time

Ну, хз. У меня все читается и все тесты прохдят. Значит надо дебажить.. Хотя, что там дебажить? если и на нативных вызовах (без Qt) не работает.. :)

ЗЫ: Версия Qt какая? Т.к возможность задать параметры перед открытием появилась только с Qt 5.3.1 ЕМНИП.

kuzulis ★★ ()
Последнее исправление: kuzulis (всего исправлений: 1)
Ответ на: комментарий от kuzulis

а так, чую, что дело в драйвере, а доказать не могу)

next_time ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.