Например TDA7294

Форум РадиоКот • Просмотр темы - Работа с COM портом - C++
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Ср июл 09, 2025 01:57:54

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 55 ]  1, ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Работа с COM портом - C++
СообщениеДобавлено: Вт апр 26, 2016 12:40:48 
Это не хвост, это антенна
Аватар пользователя

Карма: 3
Рейтинг сообщений: 76
Зарегистрирован: Сб июн 09, 2012 02:14:11
Сообщений: 1337
Откуда: ХАРЬКОВ
Рейтинг сообщения: 0
Добрый день !

У меня возник такой вопрос :

Принимается поток байтов ком портом.

Вопрос. Когда принятую строку символов можно считывать ?

Что является признаком того, что строка принята в полном составе, и ее можно считать функцией

ReadFile


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Вт апр 26, 2016 13:22:02 
Потрогал лапой паяльник

Карма: 5
Рейтинг сообщений: 81
Зарегистрирован: Вс июл 29, 2012 16:25:39
Сообщений: 312
Рейтинг сообщения: 2
СЦБист писал(а):
Когда принятую строку символов можно считывать ?
Всегда и сразу.
Как правило, FIFO у UART небольшой, вся "строка" там не поместится.
Да и нужно как-то её анализировать на предмет "конца строки".
ЗЫ: понятие "считывать" оооочень расплывчатое... :)))
СЦБист писал(а):
Что является признаком того, что строка принята в полном составе,
Обычно, маркером конца строки является... заранее оговорённый маркер конца строки.
Например "\0" или "\r\n"...
Либо, "строка" передаётся в составе "кадра" заранее оговорённого формата.
СЦБист писал(а):
и ее можно считать функцией
Вот этого не понял...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Вт апр 26, 2016 14:02:13 
Это не хвост, это антенна
Аватар пользователя

Карма: 3
Рейтинг сообщений: 76
Зарегистрирован: Сб июн 09, 2012 02:14:11
Сообщений: 1337
Откуда: ХАРЬКОВ
Рейтинг сообщения: 0
Честно говоря я тоже не сильно понял про что тут идет речь.

У меня есть приемный буфер определенного размера.

Пускай 1200 байт.http://www.vsokovikov.narod.ru/New_MSDN ... upcomm.htm

Считывать информацию из этого буфера я могу функцией http://www.vsokovikov.narod.ru/New_MSDN ... adfile.htm

Ясное дело считывать этот буфер раз за разом смысла нету.

Мне нужно считать полноценную строку, а не огрызки.

Считывать нужно в какой-то определенный момент.

Тут есть такое понятие как тайм-аут.

вот ее структура. не могу понять как ее правильно заполнить и как потом это использовать (((


typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutConstant;
DWORD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Вт апр 26, 2016 15:34:14 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 878
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 6013
Откуда: Minsk
Рейтинг сообщения: 2
mas123 писал(а):
СЦБист писал(а):
и ее можно считать функцией
Вот этого не понял...

Я это понял так: "ее можно считать успешным результатом вызова функции ReadFile"

_________________
Изображение


Вернуться наверх
 
Выбираем индустриальные и медицинские источники питания MEAN WELL в открытом исполнении

Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Вт апр 26, 2016 15:42:04 
Это не хвост, это антенна
Аватар пользователя

Карма: 3
Рейтинг сообщений: 76
Зарегистрирован: Сб июн 09, 2012 02:14:11
Сообщений: 1337
Откуда: ХАРЬКОВ
Рейтинг сообщения: 0
Jack_A писал(а):
[
Я это понял так: "ее можно считать успешным результатом вызова функции ReadFile"


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

Про тайм-ауты тоже хочу знать, на что они влияют и как ими пользоваться.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Вт апр 26, 2016 16:19:11 
Потрогал лапой паяльник

Карма: 5
Рейтинг сообщений: 81
Зарегистрирован: Вс июл 29, 2012 16:25:39
Сообщений: 312
Рейтинг сообщения: 2
СЦБист писал(а):
Мне нужно считать полноценную строку, а не огрызки.
Задайся вопросом: кто должен найти маркер окончания строки?
Есть некая волшебная функция "найти строку"? Нет, значит придется самому искать.
Найти можно только читая принятый поток в поисках маркера. Другого варианта нет.
СЦБист писал(а):
Считывать нужно в какой-то определенный момент.
Тут есть такое понятие как тайм-аут.
И что тебе это даст? Данные могут приходить когда угодно - зависит от скорости передачи, от "желания" источника передать данные.....

Формируешь кольцевой буфер. Постоянно читаешь из файла (сколько можно) и добавляешь данные в этот буфер.
После каждого успешного чтения ищешь маркер "конец строки" от текущего указателя чтения по последний принятый байт.
При нахождении строки - извлекаешь её, смещаешь указатель чтения... И так далее.

Либо читай по одному байту, анализируй его на "окончание". Если не конец - добавляешь байт в буфер строки и читаешь дальше...
Это будет более тормозно, но проще в реализации. :)


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Вт апр 26, 2016 16:35:22 
Мучитель микросхем
Аватар пользователя

Карма: 6
Рейтинг сообщений: 87
Зарегистрирован: Вс янв 09, 2011 23:05:37
Сообщений: 450
Откуда: СССР
Рейтинг сообщения: 3
http://www.piclist.ru/S-COM-THREAD-RUS/S-COM-THREAD-RUS.html

_________________
Иван Сусанин - первый полупроводник :solder:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Ср апр 27, 2016 11:20:04 
Это не хвост, это антенна
Аватар пользователя

Карма: 3
Рейтинг сообщений: 76
Зарегистрирован: Сб июн 09, 2012 02:14:11
Сообщений: 1337
Откуда: ХАРЬКОВ
Рейтинг сообщения: 0
Предположим что считываю я информацию с буфера через каждые 1 с.

Про кольцевой буфер не понял с какой целью его лепить.

Размер буфера я указываю тут

BOOL SetupComm(
HANDLE hFile,
DWORD dwInQueue,
DWORD dwOutQueue
);


что делать с тайм-аутами ? нужно их выставлять ?

typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutConstant;
DWORD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;



Данные у меня приходят по запросу а не когда угодно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Чт апр 28, 2016 13:54:10 
Потрогал лапой паяльник

Карма: 5
Рейтинг сообщений: 81
Зарегистрирован: Вс июл 29, 2012 16:25:39
Сообщений: 312
Рейтинг сообщения: 2
СЦБист писал(а):
Про кольцевой буфер не понял с какой целью его лепить.
Складывать данные в этот буфер, в процессе поиска конца строки.
Ибо можно вычитать не только символы из конца строки, плюс маркер окончания, но и начало новой строки - чтобы это начало не потерять.
Либо запрашивай по одному байту и анализируй на "конец строки". Тогда можно без кольцевого буфера.
СЦБист писал(а):
что делать с тайм-аутами ? нужно их выставлять ?
Разумеется. При отсутствии данных будет выход из функции по таймауту. Иначе можно зависнуть на ожидании.
СЦБист писал(а):
Данные у меня приходят по запросу а не когда угодно.
Это и есть "когда угодно".
Запрос может уйти в любой момент, запрос может "не дойти" до получателя, получатель может ответить в разное время, ответ может "не дойти" до компа.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Чт апр 28, 2016 14:12:19 
Это не хвост, это антенна
Аватар пользователя

Карма: 3
Рейтинг сообщений: 76
Зарегистрирован: Сб июн 09, 2012 02:14:11
Сообщений: 1337
Откуда: ХАРЬКОВ
Рейтинг сообщения: 0
Походу никто этого раньше не делал.

По поводу конца строки. Нету у нее не конца не начала.

Наверное придется делать параллельный поток и искать ответ в другом месте.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Чт апр 28, 2016 14:33:30 
Потрогал лапой паяльник

Карма: 5
Рейтинг сообщений: 81
Зарегистрирован: Вс июл 29, 2012 16:25:39
Сообщений: 312
Рейтинг сообщения: 2
СЦБист писал(а):
Походу никто этого раньше не делал.
Да-да-да, никто и никогда не передавал данные через различные соединения. Все эти Ethernet, RS-232, RS-485 и многие другие - это вымысел.
Все эти протоколы (как самодельные, так и промышленные) - сплошной обман. :facepalm:
СЦБист писал(а):
По поводу конца строки. Нету у нее не конца не начала.
Э-э-э, поясни? Если у строки нет конца - т что ты собираешься искать?
СЦБист писал(а):
и искать ответ в другом месте.
Удачи. Когда найдешь ответ - перечитай снова эту тему с самого начала. :))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Ср май 04, 2016 13:31:02 
Это не хвост, это антенна
Аватар пользователя

Карма: 3
Рейтинг сообщений: 76
Зарегистрирован: Сб июн 09, 2012 02:14:11
Сообщений: 1337
Откуда: ХАРЬКОВ
Рейтинг сообщения: 0
Добрый день !

Кто в курсах , функция WriteFile завершится после отправки всех символов строки в линию, или после окончания записи этой строки в буфер передачи ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Пт май 06, 2016 06:43:04 
Друг Кота
Аватар пользователя

Карма: 23
Рейтинг сообщений: 288
Зарегистрирован: Пт мар 09, 2007 15:01:52
Сообщений: 3077
Откуда: Биробиджан
Рейтинг сообщения: 2
Медали: 1
Получил миской по аватаре (1)
Если не ошибаюсь то это зависит от режима синхронный или асинхронный. В асинхронном после отправки в буфер.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Пт май 06, 2016 12:09:31 
Это не хвост, это антенна
Аватар пользователя

Карма: 3
Рейтинг сообщений: 76
Зарегистрирован: Сб июн 09, 2012 02:14:11
Сообщений: 1337
Откуда: ХАРЬКОВ
Рейтинг сообщения: 0
мне нужно точно знать

функция WriteFile завершится после отправки всех символов строки в линию, или после окончания записи этой строки в буфер передачи :o ?


режим передачи асинхронный ясен пень.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Пн май 09, 2016 13:35:40 
Друг Кота
Аватар пользователя

Карма: 9
Рейтинг сообщений: 96
Зарегистрирован: Пн июл 13, 2009 14:37:39
Сообщений: 3961
Откуда: Московская область, наукоград.....
Рейтинг сообщения: 2
Если передача относительно редкая, то можно опрашивать с наперед заданным периодом, запрашивая число байт в порту. После того как в очередной раз не будет принято ни одного байта - конец приема строки.

_________________
Загружая на вход компьютера "мусор", на выходе получим "мусор^32".
PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Пн май 09, 2016 13:41:21 
Это не хвост, это антенна
Аватар пользователя

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Вт май 10, 2016 11:21:55 
Друг Кота
Аватар пользователя

Карма: 1
Рейтинг сообщений: 178
Зарегистрирован: Пн окт 11, 2010 19:00:08
Сообщений: 3377
Рейтинг сообщения: 2
СЦБист писал(а):
режим передачи асинхронный ясен пень.
СЦБист писал(а):
тест показал что WriteFile завершится лишь когда все символы уйдут в линию.
Одно с другим не согласуется.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Вт май 10, 2016 13:00:27 
Это не хвост, это антенна
Аватар пользователя

Карма: 3
Рейтинг сообщений: 76
Зарегистрирован: Сб июн 09, 2012 02:14:11
Сообщений: 1337
Откуда: ХАРЬКОВ
Рейтинг сообщения: 0
столкнулся с такой бедой. может кто-то уже с этим сталкивался.

передаю посылку как-то так.

Код:
OVERLAPPED Overlap;

Overlap.hEvent = CreateEvent(NULL, true, true, NULL);

WriteFile(handle, buffer_write, strlen(buffer_write), &numbytes_ok, &Overlap);

WaitForSingleObject(Overlap.hEvent, INFINITE);


в буфере buffer_write 186 символов

если после строки

WaitForSingleObject(Overlap.hEvent, INFINITE);

посмотреть к-во байт в приемном буфере , то их там будет 176.

почему WaitForSingleObject(Overlap.hEvent, INFINITE); не сработало после отправки всех

186 символов ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Вт май 10, 2016 14:19:22 
Потрогал лапой паяльник
Аватар пользователя

Карма: 20
Рейтинг сообщений: 121
Зарегистрирован: Вс янв 19, 2014 22:41:55
Сообщений: 353
Рейтинг сообщения: 2
СЦБист писал(а):
посмотреть к-во байт в приемном буфере

После сработки события вызовите GetOverlappedResult - она скажет сколько данных на самом деле принялось/отослалось. И если идёт отправка - то почему вы отметили, что буфер приёмный? У приёма свой экземпляр OVERLAPPED должен быть и отдельное событие нужно создавать и Read вызывать.
СЦБист писал(а):
в буфере buffer_write 186 символов

186 - это размер буффера, либо длина С-строки там хранящейся?

_________________
Одновременным нажатием LIGHT и POWER, РП Sangean ATS-909X (ver 1.29) превращается в ATS-909XR! ;-)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Работа с COM портом - C++
СообщениеДобавлено: Вт май 10, 2016 14:33:39 
Это не хвост, это антенна
Аватар пользователя

Карма: 3
Рейтинг сообщений: 76
Зарегистрирован: Сб июн 09, 2012 02:14:11
Сообщений: 1337
Откуда: ХАРЬКОВ
Рейтинг сообщения: 0
я еще делал так

Код:
if((signal == WAIT_OBJECT_0) && (GetOverlappedResult(handle, &Overlap, &temp, true)))


186 это размер строки strlen(buffer_write)


_____


думал отправлять строку по символам .
Код:
char *p = buffer_write;

int N = strlen(buffer_write);

int K = 0;
      
while (K < N)
{
   if(!WriteFile(handle, p, 1, &numbytes_ok, &Overlap))
         

      signal = WaitForSingleObject(Overlap.hEvent, INFINITE);

       if((signal == WAIT_OBJECT_0) && (GetOverlappedResult(handle, &Overlap, &temp, true)))

         

       p++; K++;
}

то результат малость в лучшую сторону , но все равно недобор на

несколько байтов.

как устранить ?


все делал как тут

http://www.piclist.ru/S-COM-THREAD-RUS/ ... D-RUS.html


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 55 ]  1, ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y