XoffXon & Cp2101

pepelxl
Offline
Зарегистрирован: 22.12.2020

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

Использую UNO в качестве программатора, надо управлять потоком при передаче от компа к UNO.

на плате распаяна CP2101, в спеках заявлена поддержка управления потоком, но вот не доходит до меня где она реализована. Логично предположить, что  должна быть аппаратной на базе чипа. Вот только не работает ни черта. Если на базе драйвера, то горбуха получается(буфер CP забьёт буфер arduino).

Понимаю, что можно взять ногу у ардуино и подключить её как аппаратное управление, но решение не будет тогда универсальным.

кусок кода:

bool wait(uint8_t len)
{
	uint8_t it = 0;
	while (Serial.available() < len) 
	{
		it++;
		if (it > 10000)
		{
			while (Serial.available())
				Serial.read();
			return true;
		}
	}
	return false;
}


void write_block_wide16_buff32_J3()
{
	uint32_t start_adr = 0;
	uint32_t len = 0;
	uint32_t iter = 0;
	uint8_t it = 4;
	byte error = 'E';
	byte check;
	uint16_t iterror = 100;
	byte Xon = 0x11;
	byte Xoff = 0x13;
	const uint8_t sizeJ3 = 32;
	if (wait(8)) return;

	// останавливаем приём
	Serial.write(Xoff);

.........

	for (; iter + sizeJ3 <= len; iter += sizeJ3)
	{
.........
//принимаем блок с serial
		Serial.write(Xon);
		if(wait(40)) return;
		Serial.write(Xoff);
..........

	}
}

Принимаемые данные всё равно разваливаются. 

Передача должна вестись на больших скоростях, от arduino к компу стабильно передаётся на скорости 500000 бод, желательно и от компа на плату с такой же скоростью. Может кто подскажет как правильно это организовать. 

Со стороны пк, код на Си, для остановки передачи использую величину исходящего буфера, так как нет понимания когда образуется значение в windows fXoffHold

rkit
Offline
Зарегистрирован: 23.11.2016

Очевидно, что в чипе поддержка аппаратная. А если ты делаешь софтовую, то и делать надо в софте.

b707
Онлайн
Зарегистрирован: 26.05.2017

pepelxl пишет:

Передача должна вестись на больших скоростях, от arduino к компу стабильно передаётся на скорости 500000 бод, желательно и от компа на плату с такой же скоростью. Может кто подскажет как правильно это организовать.

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

pepelxl
Offline
Зарегистрирован: 22.12.2020

Я, видимо, плохо объяснил. Windows даёт управление портом только через свои библиотеки. Соответственно я говорю WINAPI использовать XoffXon через DCB.fOutX = TRUE. далее windows скармливает всю структуру драйверу CP2101. Что происходит дальше, даже сама windows не знает. Результат может отрабатываться в чипе CP или в драйвере. Второй вариант мне не подходит. Вот и не могу понять как это реализовано. В datasheet указана поддержка и не более.

pepelxl
Offline
Зарегистрирован: 22.12.2020

b707 пишет:
чтобы это организовать, в первую очередь надо научиться обрабатывать входящие данные с такой скорстью. А пока, глядя на куски кода, что вы выложили - что-то я сомневаюсь...

так я и не успеваю их обрабатывать, поэтому мне надо и останавливать входящий поток.

b707
Онлайн
Зарегистрирован: 26.05.2017

pepelxl пишет:

так я и не успеваю их обрабатывать, поэтому мне надо и останавливать входящий поток.

прежде чем "поток останавливать", вы для начала со своим кодом разберитесь... Процедура wait(), например - у вас всегда возвращает false или тупо виснет. Не уверен. что это то, что вы планировали...

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

.

b707
Онлайн
Зарегистрирован: 26.05.2017

ua6em пишет:

что-то Вы перемудрили, в настройках виндовс поставили управление потоком и далее чип по этому протоколу с виндовс и работает

именно. Причем сам, никакого "управления" от ардуины и не требуется...

А у ТС проблема судя по всему не в чипе, а в его , мягко говоря, кривоватом коде...

rkit
Offline
Зарегистрирован: 23.11.2016

pepelxl пишет:
Я, видимо, плохо объяснил. Windows даёт управление портом только через свои библиотеки. Соответственно я говорю WINAPI использовать XoffXon через DCB.fOutX = TRUE. далее windows скармливает всю структуру драйверу CP2101. Что происходит дальше, даже сама windows не знает. Результат может отрабатываться в чипе CP или в драйвере. Второй вариант мне не подходит. Вот и не могу понять как это реализовано. В datasheet указана поддержка и не более.

Дальше передача происходит с учетом xon/xoff. Где это происходит - фиолетово, на самом деле. Ты чет путаешь сильно.

pepelxl
Offline
Зарегистрирован: 22.12.2020

b707 пишет:

прежде чем "поток останавливать", вы для начала со своим кодом разберитесь... Процедура wait(), например - у вас всегда возвращает false или тупо виснет. Не уверен. что это то, что вы планировали...

Раскажите пожалуйста почему? Пересмотрел, на мой взгляд всё верно. Планировал так: дожидаемся нужное количество в буфере Serial, если за 10000 не дождались, то вычищаем буфер и возвращаем true, что бы выскочить из функции. Нужно если обрыв свази, зависание и тд, arduino не ждала данных.

 

b707
Онлайн
Зарегистрирован: 26.05.2017

pepelxl пишет:

Раскажите пожалуйста почему? Пересмотрел, на мой взгляд всё верно. Планировал так: дожидаемся нужное количество в буфере Serial, если за 10000 не дождались

во ковид действует...

Во времена пандемии значение типа uint8_t  может превысить 10000...

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

pepelxl пишет:
я говорю WINAPI использовать XoffXon через DCB.fOutX = TRUE.

Позволь поинтересоваться ДЛЯ ЧЕГО ты включаешь XonXoff? Вот просто, как бабушке своей, простыми словами объясни, плз.

pepelxl
Offline
Зарегистрирован: 22.12.2020

rkit пишет:

Дальше передача происходит с учетом xon/xoff. Где это происходит - фиолетово, на самом деле. Ты чет путаешь сильно.

Нет не фиалетово. У USB есть ограничение на пересылку кадров в 1мс, я так вообще это аппаратное ограничение в архитектуре usb. С другой стороны CP имеет буфер в 512 байт. Теперь представте, если Xoff обрабатывается драйвером? Если не дошло то - посылаем поток в чип, ардуино отправляет Xoff , пока команда дойдёт до драйвера и вернётся в CP, CP будет слать свой буфер в порт.

pepelxl
Offline
Зарегистрирован: 22.12.2020

b707 пишет:

во ковид действует...

Во времена пандемии значение типа uint8_t  может превысить 10000...

Спасибо, на форум выкладывал из заготовок, а смотрел в свой текущий код.

b707
Онлайн
Зарегистрирован: 26.05.2017

pepelxl пишет:

ардуино отправляет Xoff

ардуино ничего не отправляет. Если аппаратная поддержка имеется в чипе - он с драйвером договаривается сам, и скорости им хватит.

Ты не догоняешь, что у тебя два отдельных канала - 1) винда - СР2101 и 2) СР2101 - ардуина

Тебе надо управлять вторым каналом, а ты зачем-то все твердишь о первом. Забудь про первый, винда с СР2101 договорятся без тебя.

b707
Онлайн
Зарегистрирован: 26.05.2017

pepelxl пишет:

Спасибо, на форум выкладывал из заготовок, а смотрел в свой текущий код.

ну вот, пошли отмазки...

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Короче у тебя есть некая каша в голове, дорогой. Если ты готов внимать - поясню, если хочешь спорить - полный форум слушателей! ;)))

Хон-хофф - это не так, как тебе кажется.

Теперь про скорость: примерно 2Мегабайта в обе стороны на Линухе, на Винде не проверял. Не на CP2101, я проверял на простой Нанке с CH340 и на Меге с 16u4 или что там стоит - не помню. Тест был на Питоне. Может быть я смогу его найти. Порт настраиваешь БЕЗ управления потоком, а управление ПРИДУМЫВАЕШЬ сам. Разделители блоков, код длины, CRC, и все эти вещи. Я использовал ЦРЦ и длину.

Проверил тот же код на ОранжПи - получилось максимум 500К в сек.

pepelxl
Offline
Зарегистрирован: 22.12.2020

wdrakula пишет:

Позволь поинтересоваться ДЛЯ ЧЕГО ты включаешь XonXoff? Вот просто, как бабушке своей, простыми словами объясни, плз.

Пишу программатор, надо прокачивать 48МБ данных, точнее пока передаю каждый пятый байт контролькой, поэтому ещё больше.

Соответственно, нет уверенности, что мой код будет успевать обрабатывать входящий поток, т.к. на каждые 32(40)байта входящих данных в spi надо отправлять от 105 байт .  Естественно скорости нужны для уменьшения времени программирования. 

pepelxl
Offline
Зарегистрирован: 22.12.2020

b707 пишет:

ардуино ничего не отправляет. Если аппаратная поддержка имеется в чипе - он с драйвером договаривается сам, и скорости им хватит.

Ты не догоняешь, что у тебя два отдельных канала - 1) винда - СР2101 и 2) СР2101 - ардуина

Тебе надо управлять вторым каналом, а ты зачем-то все твердишь о первом. Забудь про первый, винда с СР2101 договорятся без тебя.

В каком месте библиотека Serial имеет управление потоком?

Xoff я отправляю сам в своём коде. 

И ожидаю, что получив код Xoff CP2101 прекратит передачу, но где-то что-то идёт у меня не так, и контрольки при очередной передаче начинают не совпадать,  чем скорость ниже, тем дольше работает, но вот зараза, даже при 9600 разваливается. 

b707
Онлайн
Зарегистрирован: 26.05.2017

pepelxl пишет:

ожидаю, что получив код Xoff CP2101 прекратит передачу

еще раз - вы управляете потоком от CP2101 к ардуине, а сами все время обсуждаете какие-то драйвера на винде. Поймите уже, что к вашей задаче драйвер винды не имеет ни малейшего отношения...

А что касается того, почему разваливается - покажите весь код, тогда можно будет говорить. Если код слишком велик или содержит части, не имеющие отношения к вопросу - соберите тестовый код, который воспроизводил бы проблему, чтобы желающие вам помочь могли его попробовать у себя.

Думаю. что управление Xoff скорее всего тут не при чем :)

pepelxl
Offline
Зарегистрирован: 22.12.2020

b707 пишет:

еще раз - вы управляете потоком от CP2101 к ардуине, а сами все время обсуждаете какие-то драйвера на винде. Поймите уже, что к вашей задаче драйвер винды не имеет ни малейшего отношения...

А что касается того, почему разваливается - покажите весь код, тогда можно будет говорить. Если код слишком велик или содержит части, не имеющие отношения к вопросу - соберите тестовый код, который воспроизводил бы проблему, чтобы желающие вам помочь могли его попробовать у себя.

Думаю. что управление Xoff скорее всего тут не при чем :)

Код слишком сырой, просто даже стыдно выкладывать. Да и смысла я не вижу что бы кто то тратил своё время на ковыряние портянок. Тем более, что ошибка скорее всего в программе на пк.

Мой основной вопрос такой: если я отправляю

byte Xon = 0x11;
byte Xoff = 0x13;
Serial.write(Xon);
if (wait(40)) return;
Serial.write(Xoff);

То могу я быть уверенным, что я получу во входной буфер Serial 40 байт и далее не произойдёт переполнение буфера( то есть получив Xoff CP2101 сразу перестанет слать данные)? 

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

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

pepelxl пишет:

И ожидаю, что получив код Xoff CP2101 прекратит передачу

Нет, так не будет. Ты вообще читаешь, что тебе пишут?

Ты в каком месте сказал микросхеме CP2101 про использование некоего кода как Xoff???

Показать тебе передачу из Ардуино в питон, могу даже на вин 10 проверить, раз Линукс для тебя сложен, с ЦРЦ и на скорости примерно 1000000 байт в сек?

 

pepelxl
Offline
Зарегистрирован: 22.12.2020

wdrakula пишет:

Нет, так не будет. Ты вообще читаешь, что тебе пишут?

Ты в каком месте сказал микросхеме CP2101 про использование некоего кода как Xoff???

Показать тебе передачу из Ардуино в питон, могу даже на вин 10 проверить, раз Линукс для тебя сложен, с ЦРЦ и на скорости примерно 1000000 байт в сек?

 

 

Вот так я указываю:

// обработчик com порта
HANDLE hSerial;
// структура для работы с портом
bdm_t bdm_port;
//структура состояния порта
COMSTAT statusSerial;
DWORD statusError;
// структура содержащая настройки com порта
DCB dcbSerialParams = { 0 };
COMMTIMEOUTS  ctSerialParams = { 0 };


int init(LPCTSTR sPortName)
{
	hSerial = CreateFile(sPortName,				
		GENERIC_READ | GENERIC_WRITE,			
		0,										
		0,										
		OPEN_EXISTING,							
		FILE_ATTRIBUTE_NORMAL,					
		0										
	);

	if (hSerial == INVALID_HANDLE_VALUE)
	{
		if (GetLastError() == ERROR_FILE_NOT_FOUND)
		{
			 printf("serial port does not exist.\n");
		}
		else printf("some other error occurred.\n");
		exit(-1);
	}

	
	// задаём размер структуры
	dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
	// читаем текущие настройки и заполняем структуру
	if (!GetCommState(hSerial, &dcbSerialParams))
	{
		printf("getting state error\n");
		close_bdm();
	}
	if (!GetCommTimeouts(hSerial, &ctSerialParams))
	{
		printf("getting state error\n");
		close_bdm();
	}


	dcbSerialParams.fDtrControl = DTR_CONTROL_DISABLE;
	dcbSerialParams.fRtsControl = RTS_CONTROL_DISABLE;
	dcbSerialParams.XoffChar = 0x13;
	dcbSerialParams.XonChar = 0x11;
	dcbSerialParams.fOutX = TRUE;



	if (!BuildCommDCBAndTimeouts(L"baud=9600 parity=N data=8 stop=1 TO=OFF", &dcbSerialParams, &ctSerialParams))
	{
		printf("error setting serial port\n");
		close_bdm();
	}



	// применяем настройки к порту
	if (!SetCommState(hSerial, &dcbSerialParams))
	{
		printf("error setting serial port state\n");
		close_bdm();
	}
	if (!SetCommTimeouts(hSerial, &ctSerialParams))
	{
		printf("error setting serial port state\n");
		close_bdm();
	}

	
	if (!SetupComm(hSerial, 1024, 1024))
	{
		printf("error buff serial port state\n");
		close_bdm();
	}

	if (!PurgeComm(hSerial, PURGE_TXCLEAR | PURGE_RXCLEAR | PURGE_TXABORT | PURGE_RXABORT))
	{
		printf("error purge serial port state\n");
		close_bdm();
	}
	...
}

 

pepelxl
Offline
Зарегистрирован: 22.12.2020

wdrakula пишет:

и на скорости примерно 1000000 байт в сек?

Да с удовольствием выставил, но данный экземпляр стабильно тянет только 0,5M. проверял генерированием трафика.

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

давай данные по "экземпляру". Что и в какую сторону у тебя "не тянет"?

pepelxl
Offline
Зарегистрирован: 22.12.2020

wdrakula пишет:

давай данные по "экземпляру". Что и в какую сторону у тебя "не тянет"?

да как бы если выставить Serial.begin(1000000);

в интерфейсе каша малаша.

другие скорости между 0,5м - 1м я так понимаю не будут кратны частоте делителя. И эксперементировать здесь не хочу.

железка эта https://www.chipdip.ru/product/vanil

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

то есть на скорости больше 1000000 ты не можешь передавать данные ИЗ ардуино вКОМП? Так? Комп хоть не с помойки? Там не ВинХР? ;)))

===============

Я спрашиваю, чтобы написать тебе ЗАВЕДОМО рабочий пример, для проверки. Писать буду на Питоне, так быстрее. Интерернет есть? ;))) Поставь Питон вот какой на сайте предлагают 3.9.что-то-там, и потом набери выполнить: pip install pyserial

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Интересно! УСАРТу атмеги Вы каким образом сказали поддерживать программное управление потоком? Своя библиотека Serial.h

ЗЫ смотрю фьючи, оно там есть, то-есть если по умолчанию включено, то со стороны программы ничего не требуется, как я понимаю...хотя адруина для меня тёмный лес...
24.1. Features
• Full Duplex Operation (Independent Serial Receive and Transmit Registers)
• Asynchronous or Synchronous Operation
• Master or Slave Clocked Synchronous Operation
• High Resolution Baud Rate Generator
• Supports Serial Frames with 5, 6, 7, 8, or 9 data bits and 1 or 2 stop bits
• Odd or Even Parity Generation and Parity Check Supported by Hardware
• Data OverRun Detection
• Framing Error Detection
• Noise Filtering Includes False Start Bit Detection and Digital Low Pass Filter
• Three Separate Interrupts on TX Complete, TX Data Register Empty and RX Complete
• Multi-processor Communication Mode• Double Speed Asynchronous Communication Mod

pepelxl
Offline
Зарегистрирован: 22.12.2020

wdrakula пишет:

то есть на скорости больше 1000000 ты не можешь передавать данные ИЗ ардуино вКОМП? Так? Комп хоть не с помойки? Там не ВинХР? ;)))

===============

Я спрашиваю, чтобы написать тебе ЗАВЕДОМО рабочий пример, для проверки. Писать буду на Питоне, так быстрее. Интерернет есть? ;))) Поставь Питон вот какой на сайте предлагают 3.9.что-то-там, и потом набери выполнить: pip install pyserial

1  - я работаю на скорости в 500000, то что выше рассыпается. 

То есть я генерирую трафик ардуиной и принимаю его компом через CP2101. 20МБ за 6,99 минуты. Целевая платформа читается 16МБ(20) за 12,3 минуты, что меня устраивает. Теперь надо передать поток для записи, и вот тут проблемы в получении ардуиной. Надо останавливать, если ничего не выйдет, то забью и сделаю HW реализацию.

2- а не пофигу чем отправлять через CP2101, хоть тетрисом, для этого я и реализовал функцию wait().

3- питон не интересен, я его не знаю, от слова совсем

pepelxl
Offline
Зарегистрирован: 22.12.2020

ua6em пишет:

Интересно! УСАРТу атмеги Вы каким образом сказали поддерживать программное управление потоком? Своя библиотека Serial.h

ЗЫ смотрю фьючи, оно там есть, то-есть если по умолчанию включено, то со стороны программы ничего не требуется, как я понимаю...хотя адруина для меня тёмный лес...

• Data OverRun Detection
 

На офф форуме говорят, что ничего для управления потоком нет, Да и у пользователя не так много методов для работы с Serial.

Вы видимо сами не понимаете, что такое аппаратное \ программное управление потоком

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

1.То есть нужно написать пример устойчивого приема в Ардуино ИЗ компа на высокой скорости с проверками CRC?

2. Питон не тебе, а мне, какая разница - знаешь ты его или нет??? Что за бред, кто про тебя-то говорит? ;))) Я пример напишу - ты запустишь. Для проверки. Я запущу у себя, ты - потом у себя. Просто у меня винда только на виртуалке и нет инструментов программирования в ней. Не пишу я для винды. Единственный путь проверить работоспособность железа - вот такой, как я написал выше.

rkit
Offline
Зарегистрирован: 23.11.2016

pepelxl пишет:

да как бы если выставить Serial.begin(1000000);

в интерфейсе каша малаша.

А что ты ждал, когда выставлял неподдерживаемую частоту?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

pepelxl пишет:

На офф форуме говорят, что ничего для управления потоком нет, Да и у пользователя не так много методов для работы с Serial.Вы видимо сами не понимаете, что такое аппаратное \ программное управление потоком

на уровне программы не понимаю, на уровне железа немного, когда включен режим xon/xoff при заполнении буфера (детектор переполнения) вставляет в поток эти символы, чтобы другая сторона прекратила передачу, на другой стороне у вас cp2102, в драйверах соответственно надо установить скорость и управление потоком, можно ли это сделать программно, скорее всего да...
Аппаратно - соответствующими линиями (готовность терминала данных)

pepelxl
Offline
Зарегистрирован: 22.12.2020

rkit пишет:

pepelxl пишет:

да как бы если выставить Serial.begin(1000000);

в интерфейсе каша малаша.

А что ты ждал, когда выставлял неподдерживаемую частоту?


Не поддерживается чем???
Uno держит 2м или 2,5м при замене кварца 20мгц.
В cp2101 заявлено free up 1М

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Сорри, коллеги. Супруга рвет и мечет ;))) в магазине ехать надо! Так что завтра теперь уже.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

pepelxl][quote=rkit пишет:

 Не поддерживается чем??? Uno держит 2м или 2,5м при замене кварца 20мгц. В cp2101 заявлено free up 1М

НЕТ, 24Mhz - да

pepelxl
Offline
Зарегистрирован: 22.12.2020

ua6em пишет:

на уровне программы не понимаю, на уровне железа немного, когда включен режим xon/xoff при заполнении буфера (детектор переполнения) вставляет в поток эти символы, чтобы другая сторона прекратила передачу, на другой стороне у вас cp2102, в драйверах соответственно надо установить скорость и управление потоком, можно ли это сделать программно, скорее всего да...

Аппаратно - соответствующими линиями (готовность терминала данных)

 

Так надо разделить аппаратную реализацию  и программную. Кроме того надо разделять направление потоков, в обоих случаях оно регулируется не зависимо. Сейчас я пытаюсь организовать программное решение. Чтобы ардуино останавливала поток генерируемый CP2101. 

Программный метод подразумевает отправку символа(байта) Xoff, по умолчанию Ctrl+S (0x13) , после получения источник должен прекратить посылать данные. Для возобновления надо послать символ Xon, по умолчанию Ctrl+Q (0x11). 

Вот если в библиотеке Serial реализован программный метод, то где об этом почитать, какие символы XoffXon. ни где ни слова об этом нет. Но тогда мой код действительно не будет работать.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

видимо даташит, но я в этом не силен, сдаётся мне, что переводом контролера cp2102 в режим xon/xoff USART переведёт себя в сей режим автоматом, раз там детектор переполнения буфера есть, он же что-то делает...если это 328P то даташит очень неплохо знает Евгений Петрович, может что подскажет

pepelxl
Offline
Зарегистрирован: 22.12.2020

ua6em пишет:

видимо даташит, но я в этом не силен, сдаётся мне, что переводом контролера cp2102 в режим xon/xoff USART переведёт себя в сей режим автоматом, раз там детектор переполнения буфера есть, он же что-то делает...если это 328P то даташит очень неплохо знает Евгений Петрович, может что подскажет

Чипом CP2101 управляет его драйвер, для windows нет прямого доступа к порту, всё управление происходит через WINAPI, и тот же питон будет использовать обёртки для WINAPI. Соответственно структура описана мелкомягкими, и можно почитать перевод например здесь.

b707
Онлайн
Зарегистрирован: 26.05.2017

pepelxl пишет:

Программный метод подразумевает отправку символа(байта) Xoff, по умолчанию Ctrl+S (0x13) , после получения источник должен прекратить посылать данные. Для возобновления надо послать символ Xon, по умолчанию Ctrl+Q (0x11). 

Вот если в библиотеке Serial реализован программный метод, то где об этом почитать, какие символы XoffXon. ни где ни слова об этом нет. Но тогда мой код действительно не будет работать.

совершенно очевидно, что это не работает так, как вы думаете

В обычном двоичном потоке данных запросто могут встретится байты 0х11 и 0х13, соответвенно протокол не может строится на однобайтных значениях.

 

b707
Онлайн
Зарегистрирован: 26.05.2017

pepelxl пишет:

Чипом CP2101 управляет его драйвер, для windows нет прямого доступа к порту, всё управление происходит через WINAPI, и тот же питон будет использовать обёртки для WINAPI. Соответственно структура описана мелкомягкими, и можно почитать перевод например здесь.

вы опять не оттуда подходите. Управлять чипом CP2101 вам надо со стороны ардуины, а не винды

pepelxl
Offline
Зарегистрирован: 22.12.2020

b707 пишет:

совершенно очевидно, что это не работает так, как вы думаете

В обычном двоичном потоке данных запросто могут встретится байты 0х11 и 0х13, соответственно протокол не может строится на однобайтных значениях.

Тогда это вы не понимаете как это работает. Именно это является ограничением программной реализации. И за этим надо следить автору. В моём случаи я просто включаю управлением потоком, когда начинаю передавать данные в ардуино. И ДА, чип настраивается средствами винды, ЧТО БЫ поток останавливался со СТОРОНЫ ардуино.

b707
Онлайн
Зарегистрирован: 26.05.2017

pepelxl пишет:

Тогда это вы не понимаете как это работает. Именно это является ограничением программной реализации. И за этим надо следить автору. В моём случаи я просто включаю управлением потоком, когда начинаю передавать данные в ардуино. И ДА, чип настраивается средствами винды, ЧТО БЫ поток останавливался со СТОРОНЫ ардуино.

ок, возможно.

Тогда надо копать со стороны драйвера. В даташите на СР2101 написано, что XON/XOFF контроль настраивается через USBXpress API

pepelxl
Offline
Зарегистрирован: 22.12.2020

b707 пишет:

 В даташите на СР2101 написано, что XON/XOFF контроль настраивается через USBXpress API

 

Хм, можно попробовать, но тогда всё переписывать надо. Хотя я работал с ftdi D2XX - это просто своя реализация того же самого , просто без ужасного синтаксиса WINAPI.  Подозреваю, что USBXpress это теже яйца от производителя Cp2101. 

pepelxl
Offline
Зарегистрирован: 22.12.2020

Да, и учтите что когда я отправляю из ардуино Xoff, то в windows я вижу СТАТУС ДРАЙВЕРА Xoff. 

Это так информация для размышления, возвращаясь к своему вопросу

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

pepelxl пишет:

Да, и учтите что когда я отправляю из ардуино Xoff, то в windows я вижу СТАТУС ДРАЙВЕРА Xoff. 

Это так информация для размышления, возвращаясь к своему вопросу

попробовать настроить в Мелкомягкиих так, и посмотреть, правда на уровне драйвера максимально поддерживаемая скорость 128000

 

pepelxl
Offline
Зарегистрирован: 22.12.2020

Господа, пришёл сюда как сосунок, не понимающий что происходит, но сейчас складывается впечатление , что отвечают люди просто жаждующие общения. То что вы видите в конфиге винды , это пережиток прошлого. Проидите по ссылке в 38 посте, чтиво подойдёт всем  для любой оси и языка программирования. Там описаны на примере WINAPI все аргументы которые использует serial интерфейс так как он придуман. И проблемы с которыми сталкиваются разработчики. Понятно что в nix можно слать напрямую в порт, но он также настраивается перед этим. Когда будете читать внимательно обратите внимание на структуру COMMCONFIG, одно из полей передаёт поддерживаемую скорость, так вот там должен быть аргумент freebaudrate(не помню как он точно называется). Тогда порт примет любую скорость (соответственно надо будет считать погрешность от встроенного  делителя)

b707
Онлайн
Зарегистрирован: 26.05.2017

pepelxl пишет:

То что вы видите в конфиге винды , это пережиток прошлого. Проидите по ссылке в 38 посте, чтиво подойдёт всем  для любой оси и языка программирования. Там описаны на примере WINAPI все аргументы которые использует serial интерфейс так как он придуман.

по ссылке в 38 посте и вот тут на картинке - одно и то же. Если вы этого не понимаете. но то надо больше читать

pepelxl
Offline
Зарегистрирован: 22.12.2020

b707 пишет:

по ссылке в 38 посте и вот тут на картинке - одно и то же. Если вы этого не понимаете. но то надо больше читать

Вы проверяли? Может поспорим?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Интересная структура для API:

typedef struct _DCB {
DWORD DCBlength; // sizeof(DCB)
DWORD BaudRate; // current baud rate
DWORD fBinary:1; // binary mode, no EOF check
DWORD fParity:1; // enable parity checking
DWORD fOutxCtsFlow:1; // CTS output flow control
DWORD fOutxDsrFlow:1; // DSR output flow control
DWORD fDtrControl:2; // DTR flow control type
DWORD fDsrSensitivity:1; // DSR sensitivity
DWORD fTXContinueOnXoff:1; // XOFF continues Tx
DWORD fOutX:1; // XON/XOFF out flow control
DWORD fInX:1; // XON/XOFF in flow control
DWORD fErrorChar:1; // enable error replacement
DWORD fNull:1; // enable null stripping
DWORD fRtsControl:2; // RTS flow control
DWORD fAbortOnError:1; // abort reads/writes on error
DWORD fDummy2:17; // reserved
WORD wReserved; // not currently used
WORD XonLim; // transmit XON threshold
WORD XoffLim; // transmit XOFF threshold
BYTE ByteSize; // number of bits/byte, 4-8
BYTE Parity; // 0-4=no,odd,even,mark,space
BYTE StopBits; // 0,1,2 = 1, 1.5, 2
char XonChar; // Tx and Rx XON character
char XoffChar; // Tx and Rx XOFF character
char ErrorChar; // error replacement character
char EofChar; // end of input character
char EvtChar; // received event character
WORD wReserved1; // reserved; do not use
} DCB;

 

pepelxl
Offline
Зарегистрирован: 22.12.2020

Иии? Я ещё в первом посту писал что использую эти функции. На что мне сказали, что я ни черта не понимаю