Работа с COM портом - C++

Подключаем наши девайсы к компьютеру. Обсуждаются: порты, протоколы, драйвера, языки программирования и т.д.
Аватара пользователя
СЦБист
Это не хвост, это антенна
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Re: Работа с COM портом - C++

Сообщение СЦБист »

Myp3ik писал(а): тогда WaitForSingleObject не работает.

мне это не грозит. у меня все работает.

а поточный вариант жрет проц на 50 процентов . вероятно из-за цикла.
Реклама
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Работа с COM портом - C++

Сообщение Мурик »

Sleep(1) в цикле и загрузка процессора минимальная.
Реклама
Аватара пользователя
СЦБист
Это не хвост, это антенна
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Re: Работа с COM портом - C++

Сообщение СЦБист »

Мурик писал(а):Sleep(1) в цикле и загрузка процессора минимальная.
с какой целью ?

чем смущает не поточная версия ?
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Работа с COM портом - C++

Сообщение Мурик »

СЦБист писал(а):с какой целью ?
СЦБист писал(а):жрет проц на 50 процентов . вероятно из-за цикла.
СЦБист писал(а):чем смущает не поточная версия
Ничем. :) Я только предложил простой способ избавится от загрузки процессора. :)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
СЦБист
Это не хвост, это антенна
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Re: Работа с COM портом - C++

Сообщение СЦБист »

практика покажет. пока еще с МК не увязывал.
Реклама
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Работа с COM портом - C++

Сообщение Siarzhuk »

СЦБист писал(а):
Мурик писал(а):Sleep(1)
с какой целью ?
Время исполнения кода в цикле исчезающе меньше 1 миллисекунды - и если добавить в цикл этот вызов - большую часть времени поток будет проводить в sleep-е, выскакивая оттуда раз в миллисекунду, чтобы проверить "чой-то там на улице?". Да и процессор во время Sleep-а будет заниматься более полезными деяниями нежели тупо цикл маслать с частотой пару сотен миллионов оборотов в секунду. :)

50% загрузки? Это на двухядернике? На одноголовом он пожрал бы всё, кмк.

Солидарен в том, что городить +2 потока для обеспечения примитивного ввод-вывода - это дюже по богатому. Ибо потоки - это не только головная боль при обеспечении их синхронизации на этапе проектирования но и геморрой при поиске ошибок этой синхронизации опосля. Но окончательную версию поточно пациента увидеть тем не менее хотелось-бы. :)
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Реклама
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: Работа с COM портом - C++

Сообщение Myp3ik »

Так WaitForSingleObject как раз и усыпляет цикл и процесс потребляет 0% процессора. У меня даже при передаче загрузка процессора не превышала 1% :))
Иван Сусанин - первый полупроводник :solder:
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Работа с COM портом - C++

Сообщение Siarzhuk »

Myp3ik писал(а):Так WaitForSingleObject как раз и усыпляет цикл
Совершенно верно, но если евент ручной и уже засигнален - циклу ведь и положено пролетать Wait-ы как пшёнке через дизентерийного пациента.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Vano79
Открыл глаза
Сообщения: 60
Зарегистрирован: Пт янв 11, 2013 10:54:43

Re: Работа с COM портом - C++

Сообщение Vano79 »

СЦБист писал(а): Поточный вариант сильно жрет процессор.
Смысл использования потоков как раз в высвобождении ресурсов процессора, что-то вы делаете не так ;)
СЦБист писал(а): if (btr >= 100)
Не очень красиво, читать нужно все, даже if (btr == 0), складывать в отдельный буфер, основным потоком приложения обрабатывать этот буфер. Для определения начала-конца пакета гуглите.
Аватара пользователя
СЦБист
Это не хвост, это антенна
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Re: Работа с COM портом - C++

Сообщение СЦБист »

Vano79 писал(а):Смысл использования потоков как раз в высвобождении ресурсов процессора, что-то вы делаете не так ;)
е.

прежде чем писать для начала подумайте что пишите. никаких задержек в не поточном варианте нету.

сидите разбирайтесь.
Vano79 писал(а):[ Не очень красиво,.
делай как хочешь. ))))))


___________________

добавил еще один метод ClearCom() в класс
Вложения
Class.cpp
(5.65 КБ) 191 скачивание
Аватара пользователя
СЦБист
Это не хвост, это антенна
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Re: Работа с COM портом - C++

Сообщение СЦБист »

Все думаю как лучше посылать данные с МК. Произвольно или по запросу ПК ?

У меня с МК приходит 10 байтов информации. Когда в буфере приема >= 10 то эти

байты читаю и обрабатываю.

Но тут не понятно будут ли эти 10 байт те которые я жду.

В буфере же может быть к примеру не 10, а 13 байт.

Следовательно после чтения в буфере останется 3 байта, которые закосячат очередной прием.

На ум приходит следующее:

После каждого приема 10 байт буфер приема принудительно очищать

PurgeComm(COMport, PURGE_RXCLEAR); //Очистка буфера приема

Или вводить два проверочных байта в начале и в конце информационных байтов.

Для надежности конечный проверочный байт должен быть инверсией начального проверочного

байта.

Достоверность посылки следовательно проверяем по этим контрольным байтам.

+ тоже очищаем буфер.
Вложения
Test.cpp
(7.21 КБ) 180 скачиваний
Безымянный.JPG
(46.2 КБ) 524 скачивания
Аватара пользователя
Siarzhuk
Потрогал лапой паяльник
Сообщения: 353
Зарегистрирован: Вс янв 19, 2014 22:41:55

Re: Работа с COM портом - C++

Сообщение Siarzhuk »

СЦБист писал(а):Произвольно или по запросу ПК ?
Если данные бинарные и в них может появиться любой байт из диапазона 0х00 - 0хFF - используем poll режим хоста с чексуммой для самоуспокоения. Если формат ASCII либо какие-то значения байтов заведомо не появятся в полезном теле посылки - выбираем из них кого-либо на роль терминатора и можем организовать асинхронный поток. Можно конечно вставлять мэджиков в начала пакетов и прикрывать задницы последних чексуммами после чего пытаться синхронизироваться на лету зачатками AI - но это скорее для сокрытия деталей реализации протокола от [начинающих] снифферистов может быть полезно.

PS:Мы пользуемся обычным ASCII с CR в качестве терминатора. Устройство наглядно отлаживается в любой терминалке.
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)
Аватара пользователя
СЦБист
Это не хвост, это антенна
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Re: Работа с COM портом - C++

Сообщение СЦБист »

Siarzhuk писал(а):[
Если данные бинарные и в них может появиться любой байт из диапазона 0х00 - 0хFF - используем poll режим хостае.
ниче не понял )))) решил передавать данные по запросу.

пришлось слепить класс которые будет посылать запросы через равные промежутки времени.

это время взял с запасом. 500 мс. цикл опроса.

информационная часть содержит 80 обьектов контроля. следовательно 10 кадров.

скорость передачи 1200 бод. 10 кадров будут идти где-то 100 мс с учетом времени сбора посылки в МК.

Собственно класс. :shock:

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

class Request
{
	LARGE_INTEGER time;
	bool request;
public:
	Request()
	{
		SYSTEMTIME st;
		FILETIME ft;
		GetSystemTime(&st);
		SystemTimeToFileTime(&st,&ft);

		time.LowPart = ft.dwLowDateTime;
		time.HighPart = ft.dwHighDateTime;

		request = true;
		Queue_message.push(212);
	}
	bool Check_request() const {return request;}
	void Reset_request() {request = false;}
	void Time_out_request()
	{
		LARGE_INTEGER time;
		SYSTEMTIME st;
		FILETIME ft;
		GetSystemTime(&st);
		SystemTimeToFileTime(&st,&ft);

		time.LowPart = ft.dwLowDateTime;
		time.HighPart = ft.dwHighDateTime;

		if ((time.QuadPart - this->time.QuadPart) >= 5000000)
		{
			if (request)
			{
				MessageBox(NULL,_T("От микроконтроллера не получено ответа"),
				_T("Ошибка связи"), MB_OK | MB_ICONERROR);
				
				GetSystemTime(&st);
				SystemTimeToFileTime(&st,&ft);
				
				time.LowPart = ft.dwLowDateTime;
				time.HighPart = ft.dwHighDateTime;
			}
			else request = true;
			
			this->time = time;
			Queue_message.push(212);
		}
	}
};
Последний раз редактировалось СЦБист Сб май 28, 2016 11:51:54, всего редактировалось 1 раз.
Аватара пользователя
Мурик
Друг Кота
Сообщения: 3383
Зарегистрирован: Пн окт 11, 2010 19:00:08

Re: Работа с COM портом - C++

Сообщение Мурик »

СЦБист писал(а):скорость передачи 1200 бод
Что так медленно? Не помешало бы увеличить скорость до 9600 или выше.
Аватара пользователя
СЦБист
Это не хвост, это антенна
Сообщения: 1337
Зарегистрирован: Сб июн 09, 2012 02:14:11
Откуда: ХАРЬКОВ

Re: Работа с COM портом - C++

Сообщение СЦБист »

Мурик писал(а):[q] Не помешало бы увеличить скорость до 9600 или выше.
Мне вполне хватает. Пробовал передавать информацию по медным проволокам с транса.

М-ду ПК и МК 3 проволоки. Расстояние м-ду ПК и МК 8 м. Вроде все норм.


на скорости 9600 большая погрешность 7%. я кварц не применяю.
Спойлер110 567 110.035 0.0320102
300 207 300.481 0.160256
600 103 600.962 0.160256
1200 51 1201.92 0.160256
2400 25 2403.85 0.160256
4800 12 4807.69 0.160256
9600 6 8928.57 -6.99405
http://ideone.com/9yk0iS
Ответить

Вернуться в «Интеграция с ПК»