Одновременная работа gps и rs-485

Возможна ли одновременная работа с GPS-приемником и оборудованием по RS-485?
У меня пока получается только по отдельности. Выставление одинаковой скорости на обоих портах ничего не меняет.

Плата - rev.2.8

Ну да, это разные порты.
А какие симптомы того, что не получается?

  1. Запускаю GPSD на порту /dev/ttyNSC1, работает.
  2. Запускаю ПО, которое работает через /dev/ttyNSC0 по протоколу modbus с частотой опроса ~5 раз в секунду.
  • перестают идти данные GPS, опрос по RS-485 отваливается по timeout.

Если запускать в обратном порядке, то все то же самое.

При этом в dmesg валятся ошибки вида
[ 408.930000] sc16is7x2 spi1.3: sc16is7x2_handle_rx (1) overrun!

Если отменить gpsd и вместо него сделать minicom [-b <baud>] /dev/ttyNSC1 то точно так же перестают получаться данные
через RS-485.

Сейчас попробую modbus_client из гитхаба, посмотрю на результат.

С modbus_client’ом не вышло, не получается сделать запрос выставив нужное значение baudrate, похоже на ошибку в месте

int setRtuParam(void *backend, char c, char *value) {
    RtuBackend *rtuParams = (RtuBackend*)backend;
    int ok = 1;

    switch (c) {
    case &#039;b&#039;: {
        rtuParams-&gt;baud = getInt(value, &amp;ok);
        if (0 != ok) {
            printf(&quot;Baudrate is invalid %s&quot;, value);
            ok = 0;
        }
    }

А getInt вычисляет ok как:

if (0 &gt;= ret) {//couldn&#039;t convert from hex, try dec
        ret = sscanf(str, &quot;%d&quot;, &amp;value);
    }

    if (0 != ok) {
        *ok = (0 &lt; ret);
    }

А пересобрать сейчас у меня не получится.

modbus_client вроде работает, и baudrate устанавливается.

Видимо какие-то проблемы с драйвером порта в линуксе, попробую воспроизвести.

baudrate на портах у вас какие стоят?

Для /dev/ttyNSC1 я пробовал 9600,38400,57600
Для /dev/ttyNSC0 - 57600

Может я что-то делаю не так?

# ./modbus_client --debug -mrtu -b57600 -a1 -c8 -r100 -t0x03  /dev/ttyNSC0
Baudrate is invalid 57600./modbus_client [--debug] [-m {rtu|tcp}] [-a&lt;slave-addr=1&gt;] [-c&lt;read-no&gt;=1]
        [-r&lt;start-addr&gt;=100] [-t&lt;f-type&gt;] [-o&lt;timeout-ms&gt;=1000] [{rtu-params|tcp-params}] serialport|host [&lt;write-data&gt;]
NOTE: if first reference address starts at 0, set -0
f-type:
        (0x01) Read Coils, (0x02) Read Discrete Inputs, (0x05) Write Single Coil
        (0x03) Read Holding Registers, (0x04) Read Input Registers, (0x06) WriteSingle Register
        (0x0F) WriteMultipleCoils, (0x10) Write Multiple register
rtu-params:
        b&lt;baud-rate&gt;=9600
        d{7|8}&lt;data-bits&gt;=8
        s{1|2}&lt;stop-bits&gt;=1
        p{none|even|odd}=even
tcp-params:
        p&lt;port&gt;=502
Examples (run with default mbServer at port 1502): 
        Write data:     ./modbus_client --debug -mtcp -t0x10 -r0 -p1502 127.0.0.1 0x01 0x02 0x03
        Read that data: ./modbus_client --debug -mtcp -t0x03 -r0 -p1502 127.0.0.1 -c3

Бинарник брал из гитхаба, ссылка была в соседней теме.

да, видимо в modbus_client есть проблемы с парсингом.

Драйвер порта там имеет проблемы при передаче большого объёма данных.

В этом случае:

1. Запускаю GPSD на порту /dev/ttyNSC1, работает. 2. Запускаю ПО, которое работает через /dev/ttyNSC0 по протоколу modbus с частотой опроса ~5 раз в секунду. – перестают идти данные GPS, опрос по RS-485 отваливается по timeout.

GPS как я понимаю на скорости 9600. А второй порт на какой? Если второй порт на 9600 или 19200, то тоже есть проблемы?

Второй порт всегда 57600, и изменить это сложновато. Я попробую, посмотрю.

А в чем там дело с большими объемами? Это сложно поправить?

драйвер в ядре так написан. Чтобы работало совсем хорошо, там надо всю модель работы со SPI менять на асинхронную, а это сложно.
Можно попробовать текущую схему слегка оптимизировать.