Возможна ли одновременная работа с GPS-приемником и оборудованием по RS-485?
У меня пока получается только по отдельности. Выставление одинаковой скорости на обоих портах ничего не меняет.
Плата - rev.2.8
Возможна ли одновременная работа с GPS-приемником и оборудованием по RS-485?
У меня пока получается только по отдельности. Выставление одинаковой скорости на обоих портах ничего не меняет.
Плата - rev.2.8
Ну да, это разные порты.
А какие симптомы того, что не получается?
Если запускать в обратном порядке, то все то же самое.
При этом в 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 'b': {
rtuParams->baud = getInt(value, &ok);
if (0 != ok) {
printf("Baudrate is invalid %s", value);
ok = 0;
}
}
А getInt вычисляет ok как:
if (0 >= ret) {//couldn't convert from hex, try dec
ret = sscanf(str, "%d", &value);
}
if (0 != ok) {
*ok = (0 < 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<slave-addr=1>] [-c<read-no>=1]
[-r<start-addr>=100] [-t<f-type>] [-o<timeout-ms>=1000] [{rtu-params|tcp-params}] serialport|host [<write-data>]
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<baud-rate>=9600
d{7|8}<data-bits>=8
s{1|2}<stop-bits>=1
p{none|even|odd}=even
tcp-params:
p<port>=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 менять на асинхронную, а это сложно.
Можно попробовать текущую схему слегка оптимизировать.