Потеря данных при обмене по rs-232

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

vladsleping

Потеря данных при обмене по rs-232

Непрочитанное сообщение vladsleping » 19 мар 2014, 20:05

Всем привет!
Собственно, задачка с прежними условиями (ком-порт 8N1, без контроля четности, 115200 бод). Железка обменивается данными с ПК. Смотрим картинку обмена на логическом анализаторе. Данные выдаю кодограммами из 12 байт ( write (fd, buf,12) ).
Иногда возникает ситуация, что при выдаче от ПК кодограмма из нескольких байт разрывается на части, интервалы между частями кодограммы варьируются от 100 мкс до 1,5 мс (на картинке эти разрывы показаны красными стрелками). Сигнал RTS при этом живет своей жизнью и сбрасывается значительно раньше (сброс RTS показан синей стрелкой).
C чем такое может быть связано? Или такие разрывы правомерны в работе порта?

Изображение

Код: Выделить всё

	ioctl ( fd, TIOCMGET, &status ); 
	status = TIOCM_RTS;
	ioctl ( fd, TIOCMBIS, &status );
	ioctl ( fd, TIOCMGET, &status );
	
	while ( !(status&TIOCM_CTS) && (cntWr < 10) )
	{
		cntWr++;
		status = TIOCM_RTS;
		ioctl ( fd, TIOCMBIS, &status );
 		ioctl ( fd, TIOCMGET, &status );
	}
	if ( !(status&TIOCM_CTS) ) return 1;
	

	write ( fd, buf, len );


	do       
    {
    	ioctl ( fd, TIOCSERGETLSR, &status );
    } while ( !(status & TIOCSER_TEMT) ); 

	status |= TIOCM_RTS;
	ioctl ( fd, TIOCMBIC, &status );

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Потеря данных при обмене по rs-232

Непрочитанное сообщение Olej » 19 мар 2014, 21:18

vladsleping писал(а): Собственно, задачка с прежними условиями (ком-порт 8N1, без контроля четности, 115200 бод).
Иногда возникает ситуация, что при выдаче от ПК кодограмма из нескольких байт разрывается на части, интервалы между частями кодограммы варьируются от 100 мкс до 1,5 мс (на картинке эти разрывы показаны красными стрелками). Сигнал RTS при этом живет своей жизнью и сбрасывается значительно раньше (сброс RTS показан синей стрелкой).
C чем такое может быть связано? Или такие разрывы правомерны в работе порта?
По самому поверхностному взгляду (может там что глубже есть):
- передача RS-232 на скорости 115200 синхронная
- RTS и вообще протокол подтверждений - это асинхроные протоколы обмена...
- они испоьзуются в RS-232 на более низких скоростях - на каких? это уже зависит от конкретных чипов, что-то мне помнится такая скорость как 38ххх максимальная для чипов, применимых в стандартных компьютерах лет 7 назад.

Сделайте то же, что делаете, только снизьте скорость до синхронной.

Если вы всмомните, то нуль-модемные кабели по RS-232 делались по а). 3-х проводной схеме, б). 5-ти проводной схеме, в). 7-проводной схеме. Так вот у вас обмен идёт как по 3-х проводной схеме, независимо от того, сколько вы там проводов напаяете. ;-)

tundra37
Писатель
Сообщения: 149
Зарегистрирован: 03 мар 2012, 19:26
Контактная информация:

Re: Потеря данных при обмене по rs-232

Непрочитанное сообщение tundra37 » 31 мар 2014, 22:30

Прогресс не стоит на месте. Скорость 38ххх взялась от медленности микропроцессоров - они не успевали обрабатывать прерывания :-)
Микросхема UART 16550 выпускавшаяся в 90-е уже имела буфер 16 байт и макс. скорость асинхронной (!) передачи 115 Кбит.
А вот 8250 или ее модификации имели синхронный режим со скоростью 115 кбит(может меньше).
Синхронные микросхемы называются USART

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 37 гостей