Ник:
Пароль:

Контакты

Cтатус Skype: starterkit.ru
тел.: (+7 3412) 478-448
тел.: +7 922 680-21-73
тел.: +7 922 680-21-74
E-mail: info@starterkit.ru
Партнеры:
otladka.com.ua - г.Киев

Способы оплаты

User Info


Добро пожаловать,
Guest

Регистрация или входРегистрация или вход
Потеряли пароль?Потеряли пароль?

Ник:
Пароль:

ПользователейПользователей:1
Поисковых ботовПоисковых ботов:2
ГостейГостей:1

ОбновитьПодробнееВсегоВсего:4
Форум » starterkit.ru » Embedded Linux
Как заставить Uart игнорировать бит паритета
Wad1970
Добавлено 08.10.2015 16:07
0
Сообщение: 1
Wad1970
5

Пункты: 3692
Регистрация: 24.11.2014
Хочу при приёме игнорировать 9-й бит - паритет, но не получается
PARENB и INPCK вроде по всякому крутил,
может в драйвере что-то не так imx.c?
Спуститься к концу Подняться к началу
Персональная информация
Wad1970
Добавлено 12.10.2015 13:26 Редактировалось 12.10.2015 13:28 Сообщение: 2
Wad1970
5

Пункты: 3692
Регистрация: 24.11.2014
Ау, может есть какие мысли у кого? ..
А то ничего не выходит..
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 12.10.2015 14:18 Сообщение: 3
sasamy
4.77

Пункты: 64519
Регистрация: 14.08.2009
Цитата

Хочу при приёме игнорировать 9-й бит - паритет, но не получается


Что значит - проигнорировать ?

Цитата

может есть какие мысли у кого?


может для начала покажете код - что вы делаете, как настраиваете порт ?
Спуститься к концу Подняться к началу
Персональная информация
Wad1970
Добавлено 12.10.2015 15:35 Сообщение: 4
Wad1970
5

Пункты: 3692
Регистрация: 24.11.2014
int UartInit(int Port,int Speed,int u8s)
{
struct serial_struct ss;

if (tcgetattr(UART[Port], &UART_cfg[Port])<0) return 3;

UART_cfg[Port].c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
UART_cfg[Port].c_iflag &= ~IGNPAR;
UART_cfg[Port].c_iflag |= INPCK;
//UART_cfg[Port].c_iflag |= PARMRK;

UART_cfg[Port].c_cflag &=~(CSIZE|CBAUD|PARENB );
if (u8s==9) UART_cfg[Port].c_cflag |= PARENB | CMSPAR |PARODD; //9

UART_cfg[Port].c_cflag |= CS8 | Speed;

if (tcsetattr(UART[Port], TCSANOW, &UART_cfg[Port])<0) return 4;
fcntl(UART[Port], F_SETFL, FNDELAY);

return 0;
}

При такой комбинации
UART_cfg[Port].c_iflag |= INPCK;
UART_cfg[Port].c_iflag &= ~(IGNPAR);
Все байты с правильной чётностью доходят,
а с неправильной linux проглатывает, а мне не отдаёт
А если так UART_cfg[Port].c_iflag |= INPCK|PARMRK;
то вместо ошибочного байта в массив пишется 255, а сам байт всё равно я не получаю.

А устройство шлёт в 9 битном режиме 1 байт с битом паритета=1, а дальше с битом 9 = 0,
Если PARENB=0, то я вообще ничего не получаю.
Спуститься к концу Подняться к началу
Персональная информация
Wad1970
Добавлено 12.10.2015 15:37 Редактировалось 12.10.2015 15:53 Сообщение: 5
Wad1970
5

Пункты: 3692
Регистрация: 24.11.2014
Хочу чтобы linux выдавал мне все байты подряд не обращая внимания на ошибку-несоответствие бита паритета
UART_cfg[Port].c_iflag &= ~(IGNPAR|INPCK); - так байты тоже проглатываются linux-ом
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 12.10.2015 17:01 Сообщение: 6
sasamy
4.77

Пункты: 64519
Регистрация: 14.08.2009
Цитата

UART_cfg[Port].c_iflag &= ~(IGNPAR|INPCK); - так байты тоже проглатываются linux-ом


странно - надо проверять остальные настройки (в первую очередь PARENB должен быть установлен)

http://frank.harvard.edu/~coldwell/terminals/#termios%20Input%20and%20Output%20Modes

Цитата

Parity

If the hardware is configured to generate parity bits on transmitted characters and to check parity on received characters (i.e., the PARENB flag is set in the control modes, see ioctl and termios), the software must still decide what to do when parity errors are reported on received characters. There are four choices for how to handle characters containing parity errors: pass it through exactly as received (ignore the error), drop it (ignore the character), mark it as containing an error, or replace it with something else. These behaviors are controlled by flags in the terminal input modes, c_iflag, namely INPCK, IGNPAR and PARMRK.

Ignore the error: disable input parity checking.

tios.c_iflag &= ~INPCK;

The UART will still generate parity bits on transmitted characters as long as the PARENB bit in the control modes is set, but input characters with parity errors will be passed on as they were received by the device driver.
Спуститься к концу Подняться к началу
Персональная информация
Wad1970
Добавлено 13.10.2015 08:43 Сообщение: 7
Wad1970
5

Пункты: 3692
Регистрация: 24.11.2014
Впечатление странное :
Передаётся байт = 2 с ошибкой чётности
при UART_cfg[Port].c_iflag |= INPCK|IGNPAR; этот байт действительно проглатывается и длина на принятого на 1 меньше
при UART_cfg[Port].c_iflag &= ~IGNPAR; длина правильная, но на месте байта с ошибкой 0.
Если PARMRK=1, то получаем 255 0 0, хотя должно быть 255 0 2.
То есть ошибочный байт где то в linux подменяется на 0, хотя на осциллографе отчётливо видно что это 2.
Спуститься к концу Подняться к началу
Персональная информация
sasamy
Добавлено 13.10.2015 15:29 Сообщение: 8
sasamy
4.77

Пункты: 64519
Регистрация: 14.08.2009
Это баг в драйвере. Поправьте строку

http://git.freescale.com/git/cgit.cgi/imx/linux-2.6-imx.git/tree/drivers/tty/serial/imx.c?h=imx_3.10.17_1.0.0_ga#n695

rx &= sport->port.read_status_mask;

замените на

rx &= sport->port.read_status_mask | 0xFF;
Спуститься к концу Подняться к началу
Персональная информация
Wad1970
Добавлено 13.10.2015 15:59 Редактировалось 13.10.2015 16:00 Сообщение: 9
Wad1970
5

Пункты: 3692
Регистрация: 24.11.2014
sasamy, может есть какие-то предположения, куда копать?
О уже вижу ответ, спасибо.
Спуститься к концу Подняться к началу
Персональная информация
Wad1970
Добавлено 14.10.2015 07:34 Сообщение: 10
Wad1970
5

Пункты: 3692
Регистрация: 24.11.2014
Огромное спасибо. Работает!!
Спуститься к концу Подняться к началу
Персональная информация
Форум » starterkit.ru » Embedded Linux