LINUX.ORG.RU

Как определить формат UART: 8n1 или 7e1 или 5o2 или ...?

 


0

2

Контроллер передает информацию на дисплей по UART. Скорость известна. Есть возможность прослушать и сдампить обмен данными с помошью USB-UART адаптера. Как определить формат?

★★★

Последнее исправление: nvl (всего исправлений: 4)

Пробовать «распарсить» с разными параметрами, пока не начнёт приниматься без ошибок

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

Есть возможность прослушать и сдампить обмен данными с помошью USB-UART адаптера.

ты издеваешься, да?

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

а теперь запиши rx и tx

и попробуй обмануть дисплей

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

Зависит от того, что известно о протоколе обмена. Если бинарный и неизвестно совсем ничего, тогда сложновато будет.

Elyas ★★★★★
()

Обычно символы идут не непрерывном потоком, а между посылками есть заметные паузы. Дальше просто считаешь какому количеству бит кратны все посылки. Чётность можно определить перебором вариантов - сойдётся только один режим чётности.

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

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

А каким-то образом возможно получение сырого потока данных без интерпретации по битам четности и старт/стоп битам? Тогда можно было бы визуально попробовать идентифицировать формат.

Известны: скорость и что данные бинарные.

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

блин, да пиши уже с разными вариациями, потом скармливай что записал дисплею, как получишь что-то адекватное, значит это твой формат и есть

Morin ★★★★
()

Ну если не лень запиши на звуковую карту и рассматривай, или подбором.

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

пошамань с cat /dev/ttyUSBX

Как скорость (baud rate) задать?

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

Правильно ли я понимаю, что при 7e1, байт не может быть больше 0x7f?

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

Осциллограф только или логический анализатор. Но я не вижу проблемы просто перебрать все варианты, там их меньше десятка же.

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

Вроде как 7e1, данные четко идентифицируются. Не понимаю пока, почему получаю данные больше 0x7f...

Что не так?:

public static int main (string[] args) {

	int fd;
	Posix.termios tty;
	string path = "/dev/ttyUSB0";

	fd = Posix.open(path, Posix.O_RDWR | Posix.O_NOCTTY | Posix.O_SYNC);
	if (fd < 0) {
		warning ("Error opening %s", path);
	}

	if (Posix.tcgetattr (fd, out tty) != 0) {
		warning ("Error from tcgetattr");
	}

	Posix.cfsetispeed (ref tty, Posix.B38400);

	// 7E1
	tty.c_cflag |=  Posix.PARENB;
	tty.c_cflag &= ~Posix.PARODD;
	tty.c_cflag &= ~Posix.CSTOPB;
	tty.c_cflag &= ~Posix.CSIZE;
	tty.c_cflag |=  Posix.CS7;

	tty.c_cflag |= Posix.CREAD;
	tty.c_cflag |= Posix.CLOCAL;

	tty.c_iflag &= ~Posix.IXON;
	tty.c_iflag &= ~Posix.IXOFF;
	tty.c_iflag &= ~Posix.IXANY;

	tty.c_lflag &= ~Posix.ICANON;
	tty.c_lflag &= ~Posix.ECHO;
	tty.c_lflag &= ~Posix.ECHOE;
	tty.c_lflag &= ~Posix.ISIG;

	tty.c_oflag &= ~Posix.OPOST;

	tty.c_cc[Posix.VTIME] = 0;
	tty.c_cc[Posix.VMIN]  = 1;

	Posix.cfmakeraw (ref tty);

	if (Posix.tcsetattr(fd, Posix.TCSANOW, tty) != 0) {
		warning ("Error from tcsetattr");
	}


	char buf[1];
	ssize_t count = 0;

	while (true) {
		count = Posix.read (fd, buf, buf.length);
		if (count > 0) {
			for (int i = 0; i < buf.length; i++) {
				stdout.printf ("0x%02hhX\n ", buf[i]);
			}
		}
	}

	return 0;
}


В байте, который предположительно является контрольной суммой, выводит как 0xA5

nvl ★★★
() автор топика
Последнее исправление: nvl (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.