Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 09.05.2016, 13:43   #1
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию Работа с COM портом

Добрый день !

Нужно получить от знатоков краткие ответы на следующие вопросы.

1. Почему WriteFile завершается только, после того, как вся строка ушла

в линию. При скорости CBR_110 вообще можно ждать вечность.

2. Какая емкость буфера приема по умолчанию?

тест показывает что 4 кБ , но нужно знать точно.

3. Если не трогать тайм-ауты , какой интервал м-ду соседними

передающими символами ?


ссылки пожалуйста не выкладывать !!!
RAFA91 вне форума
Старый 09.05.2016, 14:26   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
1. Почему WriteFile завершается только, после того, как вся строка ушла

в линию. При скорости CBR_110 вообще можно ждать вечность.
Потому, что вы выбрали такой вариант. А во вторых это же удобнее. Особенно новичкам, как вы, позволяет не делать ошибок.
Цитата:
2. Какая емкость буфера приема по умолчанию?

тест показывает что 4 кБ , но нужно знать точно.
16 байт.

Цитата:
3. Если не трогать тайм-ауты , какой интервал м-ду соседними

передающими символами ?
1.5 бода

Цитата:
ссылки пожалуйста не выкладывать !!!
А для чего сей тест?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 09.05.2016 в 14:28.
Pavia вне форума
Старый 09.05.2016, 15:00   #3
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
16 байт.

почему тогда приемный буфер у меня тянет именно 4096 байт если ничего дополнительно не выделять?
Цитата:
Сообщение от Pavia Посмотреть сообщение

1.5 бода

в микросекундах пожалуйста
Цитата:
Сообщение от Pavia Посмотреть сообщение
Потому, что вы выбрали такой вариант.
какой вариант ? WriteFile завершается лишь после отправки всех

байтов в линию

Код:
HANDLE handle = CreateFile("COM1", 
		GENERIC_READ | GENERIC_WRITE, 
		NULL, NULL, OPEN_EXISTING, 
		0, NULL);
if(!WriteFile(handle, buffer_write, strlen(buffer_write), &numbytes_ok, 0))
			cout<<"WriteFile (((((((((((((("<<endl;

Последний раз редактировалось RAFA91; 09.05.2016 в 15:04.
RAFA91 вне форума
Старый 09.05.2016, 15:10   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

WriteFile синхронная процедура, они в принципе завершается после отправки/записи всех данных.
Цитата:
в микросекундах пожалуйста
https://ru.wikipedia.org/wiki/%D0%91%D0%BE%D0%B4
Цитата:
почему тогда приемный буфер у меня тянет именно 4096 байт если ничего дополнительно не выделять
он немного иной буфер назвал.
внутренний буфер системы зависит от драйвера, в среднем по умолчанию одна страница.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума
Старый 09.05.2016, 15:18   #5
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

после отправки куда ?

отправка понятие растяжимое в данном случае.

одно дело отправить в буфер передачи, другое в линию.
RAFA91 вне форума
Старый 09.05.2016, 15:25   #6
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Цитата:
в микросекундах пожалуйста
пакет данных UART, допустим 110,8n1: 10^6/110=9 090 мкс на бит. Фрейм 8n1 = 1 старт-бит + 8 DATA бит + 1 стоп-бит = 10 бит на фрейм = 90 мс на символ (байт данных). Межсимвольный (межфреймовый) интервал IDLE может быть от одного бита при реализации железом, на практике для передачи в ПК используют от 2 до 3 длительности 1 бита и выше (состояние IDLE высокого уровня идет в начале и в конце фрейма UART).
kutani вне форума
Старый 09.05.2016, 16:30   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в линию, но вообще советую начать читать офф документацию.
много ответов можно найти самому.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума
Старый 09.05.2016, 17:19   #8
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

в основном геморой с чтением данных.

что тут вызывает сомнение ?

Код:
#define BUFSIZE 255     //ёмкость буфера

unsigned char bufrd[BUFSIZE], bufwr[BUFSIZE]; //приёмный и передающий буферы

//---------------------------------------------------------------------------

HANDLE COMport;		//дескриптор порта

//структура OVERLAPPED необходима для асинхронных операций, при этом для операции чтения и записи
//нужно объявить разные структуры
//эти структуры необходимо объявить глобально, иначе программа не будет работать правильно
OVERLAPPED overlapped;		//будем использовать для операций чтения (см. поток ReadThread)
OVERLAPPED overlappedwr;       	//будем использовать для операций записи (см. поток WriteThread)
//---------------------------------------------------------------------------

//главная функция потока, реализует приём байтов из COM-порта
{
 COMSTAT comstat;		//структура текущего состояния порта, в данной программе используется
				//для определения количества принятых в порт байтов
 DWORD btr, temp, mask, signal;	//переменная temp используется в качестве заглушки

 //создать сигнальный объект-событие для асинхронных операций
 overlapped.hEvent = CreateEvent(NULL, true, true, NULL);

 //установить маску на срабатывание по событию приёма байта в порт
 SetCommMask(COMport, EV_RXCHAR);           		
 while(условие)	//пока поток не будет прерван, выполняем цикл
  {
   //ожидать события приёма байта (это и есть перекрываемая операция)
   WaitCommEvent(COMport, &mask, &overlapped);

   signal = WaitForSingleObject(overlapped.hEvent, INFINITE);	//приостановить поток до прихода байта
   if(signal == WAIT_OBJECT_0)				        //если событие прихода байта произошло
    {
     if(GetOverlappedResult(COMport, &overlapped, &temp, true)) //проверяем, успешно ли завершилась
								//перекрываемая операция WaitCommEvent
      if((mask & EV_RXCHAR)!=0)				//если произошло именно событие прихода байта
       {
        ClearCommError(COMport, &temp, &comstat);		//нужно заполнить структуру COMSTAT
        btr = comstat.cbInQue;                          	//и получить из неё количество принятых байтов
        if(btr)                         			//если действительно есть байты для чтения
        {
         ReadFile(COMport, bufrd, btr, &temp, &overlapped);     //прочитать байты из порта в буфер программы
        }
       }
    }
  }
 CloseHandle(overlapped.hEvent);		//перед выходом из потока закрыть объект-событие
}
RAFA91 вне форума
Старый 09.05.2016, 18:15   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

у меня лично ничего не вызывает сомнений.
обычное такое асинхронное IO.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума
Старый 10.05.2016, 11:29   #10
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

зачем тут применена
Код:
signal = WaitForSingleObject(overlapped.hEvent, INFINITE);
если есть
Код:
WaitCommEvent(COMport, &mask, &overlapped);


этот код пойдет для связи с микроконтроллером ?

Последний раз редактировалось RAFA91; 10.05.2016 в 11:31.
RAFA91 вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с COM портом ferrum88 Общие вопросы Delphi 17 30.09.2011 12:53
Работа с COM-портом Georgios Общие вопросы Delphi 12 28.09.2010 10:31
Работа с com портом Speeker Общие вопросы Delphi 1 06.09.2010 19:37
работа с com-портом larry Visual C++ 6 12.08.2010 16:21
работа с портом Assemblerru Win Api 16 10.06.2010 20:00