Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
59 / 47 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
1

Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше

31.03.2014, 19:53. Просмотров 4521. Ответов 28


Через HyperTerminal доступна частота COM порта 921600, но когда я пишу на C++ максимальная частота гораздо меньше. Кто знает, как на с++ работать с com портом на частоте 921600, как HyperTerminal.

Добавлено через 39 секунд
сейчас я просто читаю его, как файл.

Добавлено через 7 часов 10 минут
Ну что, никто не знает? Я что единственный кто с COM портом работает?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2014, 19:53
Ответы с готовыми решениями:

Критично ли, если частота шины мамки меньше, чем частота шины проца?
у проца 5.2ГГц а у мамки 4.8 ГТ/с хотя я так понял еденицы измерения тут разные но все же будет...

Не максимальная частота
Я в форумах новичок, не могу создать красивую тему, простите. Мой процессор i5-7500 с максимальной...

Не максимальная частота у ЦП
Впервые сталкиваюсь с подобным. Как бороться?

Максимальная частота процессора
Я купил новый 4-х ядерный процессор,мне в магазине сразу выставили максимальную частоту процессора...

28
Заблокирован
31.03.2014, 21:03 2
Могу перенаправить вас сюда: https://www.cyberforum.ru/drivers-programming/
1
59 / 47 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
31.03.2014, 22:41  [ТС] 3
Цитата Сообщение от IrineK Посмотреть сообщение
Могу перенаправить вас сюда: https://www.cyberforum.ru/drivers-programming/
Спасибо, это поможет мне в другом не менее важном деле, но, боюсь, что я не найду там ответа на мой вопрос. Все темы в разделе преимущественно про написание драйверов, а с com портом С++ работает без драйверов . Так что тут как вопрос по с++, а точнее по структуре DCB и методу SetCommState.

дело в том, что константы, задающие частоту com порта кончаются на CBR_115200,CBR_128000,CBR_256000. частот 256000 и 128000 я вообще не нашёл ни в одном описании COM порта. К тому же куда-то делась частота 921600.
0
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
11.04.2014, 00:13 4
...что вы бабушку лохматите, причем тут язык. Добавьте константы.

Код
..., CBR_256000, $70800, $E1000)
В DCB задаете прямым текстом DCB.BaudRate = 0хE1000, соответствует 921600.
0
59 / 47 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
11.04.2014, 08:27  [ТС] 5
Цитата Сообщение от raxp Посмотреть сообщение
В DCB задаете прямым текстом DCB.BaudRate = 0хE1000, соответствует 921600.
Так ведь не работает так. Иначе я бы не спрашивал
0
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
11.04.2014, 09:19 6
Неужели У меня ведь работает, что я делаю не так?

0
59 / 47 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
11.04.2014, 09:23  [ТС] 7
Цитата Сообщение от raxp Посмотреть сообщение
что я делаю не так?
Ну тогда, скорее что я не так делаю? На С++ я с COM портом не очень, мне проще другую плису с первой заставить через COM общаться, чем с компьютером. Так что может я действительно что-то не так настраиваю.

Добавлено через 48 секунд
Но нужно мне именно с компьютером и, желательно, С++.
0
Почетный модератор
Эксперт С++
5842 / 2851 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
11.04.2014, 09:31 8
Цитата Сообщение от НеСказочник Посмотреть сообщение
константы, задающие частоту com порта кончаются
Так вы же и пишите программу, - добавьте.
(хотя частота действительно редкая. Я думаю тут корень зол в том, что все распространенные куски кода для работы с ком портом писались в те еще времена, когда такая частота была запредельна)

Цитата Сообщение от НеСказочник Посмотреть сообщение
Так ведь не работает так. Иначе я бы не спрашивал
А остальные настройки: стоповые биты, четность?..
0
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
11.04.2014, 09:37 9
Без понятия, что вы не так делаете, код свой вы не показываете и мне все равно что вам нужно. А у меня это выглядит так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
type
  TBaudRate = (br110, br300, br600, br1200, br2400, br4800, br9600, br14400,
    br19200, br38400, br56000, br57600, br115200, br128000, br256000,br460800, br921600);
 
 
procedure ApplyDCB;
const
  CBaudRate: array[TBaudRate] of Integer = (CBR_110, CBR_300, CBR_600,
    CBR_1200, CBR_2400, CBR_4800, CBR_9600, CBR_14400, CBR_19200, CBR_38400,
    CBR_56000, CBR_57600, CBR_115200, CBR_128000, CBR_256000, $70800, $E1000);
var
  DCB: TDCB;
begin
    FillChar(DCB, SizeOf(TDCB), 0);
    DCB.DCBlength := SizeOf(TDCB);
    DCB.BaudRate := CBaudRate[FBaudRate];
    DCB.ByteSize := Ord(TByteSize(FByteSize)) + 5;
    DCB.Flags := 1 or ($30 and (DTR_CONTROL_ENABLE shl 4))
                   or ($3000 and (RTS_CONTROL_ENABLE shl 12));
    if FParity <> paNone then
      DCB.Flags := DCB.Flags or 2;
    DCB.Parity   := Ord(TParity(FParity));
    DCB.StopBits := Ord(TStopBits(FStopBits));
    DCB.XonChar  := #17;
    DCB.XoffChar := #19;
    SetCommState(FHandle, DCB)
end;
0
59 / 47 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
11.04.2014, 09:45  [ТС] 10
Цитата Сообщение от raxp Посмотреть сообщение
Без понятия, что вы не так делаете, код свой вы не показываете и мне все равно что вам нужно. А у меня это выглядит так:
простите, но у Вас на Delphi.

А вот мой код, а если точнее тот кусок, в котором я открываю COM порт:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
LPCWSTR comName=_T("COM1");
 
    hCOM=CreateFile(comName,GENERIC_READ |GENERIC_WRITE,0,NULL,OPEN_EXISTING, 0, NULL);
    if (hCOM==INVALID_HANDLE_VALUE)
    {
        printf("Ошибка открытия %s!\n",comName);
        getchar();
        return 1;
    }
    
    dcb.fBinary = true;
    dcb.BaudRate = 921600; //921600
    dcb.fParity= true;
    dcb.fOutxCtsFlow = false;
    dcb.fOutxDsrFlow = false;
    dcb.fDtrControl = DTR_CONTROL_DISABLE;
    dcb.fDsrSensitivity = false;
    dcb.fRtsControl = RTS_CONTROL_DISABLE;
    dcb.ByteSize = 8;
    dcb.StopBits = ONESTOPBIT;
    dcb.Parity = EVENPARITY;
    if ( !SetCommState(hCOM, &dcb))  
    {
        CloseHandle (hCOM);
        printf("Ошибка настройки COM прота.");
        getchar();
        return 1;//выходим из функции с ошибкой
    }
Добавлено через 3 минуты
если вместо
dcb.BaudRate = 921600
написать, скажем
C++
1
dcb.BaudRate = CBR_115200
Добавлено через 13 секунд
то всё работает.

Добавлено через 59 секунд
В с++ CBR_115200 просто равен 115200.
0
Почетный модератор
Эксперт С++
5842 / 2851 / 390
Регистрация: 01.11.2011
Сообщений: 6,903
11.04.2014, 09:56 11
Цитата Сообщение от НеСказочник Посмотреть сообщение
В с++ CBR_115200 просто равен 115200.
В C++ нет CBR_115200. Эта константа просто где-то описана в подключенном файле.
0
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
11.04.2014, 10:03 12
если вместо
dcb.BaudRate = 921600
написать, скажем
бред, неудивительно, что у вас не получается.

простите, но у Вас на Delphi.
у меня на WinAPI в синтаксисе Delphi и изменяется это элементарнейшим образом.

Эта константа просто где-то описана в подключенном файле.
именно, в windows.h по идее, у меня в windows.pas . В данном случае ее можно просто задать напрямую, CBR_115200 = $1C200 = 0x1C200
0
59 / 47 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
11.04.2014, 10:13  [ТС] 13
CBR_115200 - у меня и так работает. А вот 921600, который 0xE1000 нет
0
Миниатюры
Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше  
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
11.04.2014, 12:29 14
Два раза повторили, что константа CBR_115200 уже прописана, тыкните по ней и посмотрите ее значение.

А вот 921600, который 0xE1000 нет
ваша ОС и среда компиляции? Код выложить не скриншотом и полностью.
0
59 / 47 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
11.04.2014, 12:32  [ТС] 15
Я уже выкладывал код. Среда Visual Studio 2010. ОС windows 7 и windows 8.

Цитата Сообщение от НеСказочник Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
LPCWSTR comName=_T("COM1");
hCOM=CreateFile(comName,GENERIC_READ |GENERIC_WRITE,0,NULL,OPEN_EXISTING, 0, NULL);
    if (hCOM==INVALID_HANDLE_VALUE)
    {
        printf("Ошибка открытия %s!\n",comName);
        getchar();
        return 1;
    }
dcb.fBinary = true;
    dcb.BaudRate = 921600; //921600
    dcb.fParity= true;
    dcb.fOutxCtsFlow = false;
    dcb.fOutxDsrFlow = false;
    dcb.fDtrControl = DTR_CONTROL_DISABLE;
    dcb.fDsrSensitivity = false;
    dcb.fRtsControl = RTS_CONTROL_DISABLE;
    dcb.ByteSize = 8;
    dcb.StopBits = ONESTOPBIT;
    dcb.Parity = EVENPARITY;
    if ( !SetCommState(hCOM, &dcb))  
    {
        CloseHandle (hCOM);
        printf("Ошибка настройки COM прота.");
        getchar();
        return 1;//выходим из функции с ошибкой
    }
0
10214 / 6595 / 495
Регистрация: 28.12.2010
Сообщений: 21,164
Записей в блоге: 1
11.04.2014, 13:01 16
C++
1
2
3
4
5
6
7
8
9
10
11
12
hCOM=CreateFile(comName,GENERIC_READ |GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_OVERLAPPED, NULL);
...
 memset(&dcb, 0, sizeof(dcb));
 GetCommState(hCOM, &DCB);
 
 DCB.BaudRate= 921600;
 DCB.Parity  = EVENPARITY;
 DCB.ByteSize= 8;
 DCB.StopBits= OneStopBit;
 
 if (! SetCommState (hcom, &dcb))
...
Для портов выше 9-го имя задается как:
\\\\.\\COMN
0
59 / 47 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
11.04.2014, 13:04  [ТС] 17
Имя порта COM1 и на частоте 115200 он работает, а выше нет. Проверено на двух разных машинах и на двух разных ОС на каждой.

Цитата Сообщение от raxp Посмотреть сообщение
C++
1
hCOM=CreateFile ...
Извините, но с Вашими исправлениями та же ошибка.

Добавлено через 37 секунд
Правда проверял только на Visual C++ 2010.
0
Заблокирован
11.04.2014, 13:07 18
Цитата Сообщение от НеСказочник Посмотреть сообщение
Имя порта COM1 и на частоте 115200 он работает, а выше нет
а он и не будет на большей частоте работать )) Это ж ком порт
0
59 / 47 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
11.04.2014, 13:12  [ТС] 19
Цитата Сообщение от newbie666 Посмотреть сообщение
а он и не будет на большей частоте работать )) Это ж ком порт
Но ведь Гипертерминал же на такой частоте с COM портом работает
0
Миниатюры
Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше  
59 / 47 / 13
Регистрация: 12.11.2012
Сообщений: 373
Записей в блоге: 2
11.04.2014, 13:13  [ТС] 20
Это, считай почти 1 Мбит/с. прямо как USB 1.0.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.04.2014, 13:13

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

Максимальная частота процессора Intel
Здравствуйте, может уже кто-то сталкивался с этим процессором и аналогичным вопросом. Перейду сразу...

Максимальная тактовая частота ПЛИС
Знает кто как определить максимальную тактовую частоту для ПЛИС. Например, для ПЛИС фирмы Altera...

i7-4770K и максимальная частота памяти
Привет! Собираю такую систему: процик Intel Core i7-4770K Haswell (3500MHz, LGA1150, L3 8192Kb),...

Asus eah5550 Максимальная частота только 30 Гц
Windows 7 x64 Видеокарта Asus EAH5550/DI/1GD3(LP) Раньше работало два монитора 19 дюймовых -...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.