Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
31.03.2014, 19:53     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #1
Через HyperTerminal доступна частота COM порта 921600, но когда я пишу на C++ максимальная частота гораздо меньше. Кто знает, как на с++ работать с com портом на частоте 921600, как HyperTerminal.

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

Добавлено через 7 часов 10 минут
Ну что, никто не знает? Я что единственный кто с COM портом работает?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2014, 19:53     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше
Посмотрите здесь:

Частота появления буквы в строке C++
Частота вхождения C++
Частота горизонтальной и вертикальной развёртки экрана C++
частота встречи символа C++
C++ Прослушивание сом-порта через USB переходник
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IrineK
Заблокирован
31.03.2014, 21:03     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #2
Могу перенаправить вас сюда: http://www.cyberforum.ru/drivers-programming/
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
31.03.2014, 22:41  [ТС]     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #3
Цитата Сообщение от IrineK Посмотреть сообщение
Могу перенаправить вас сюда: http://www.cyberforum.ru/drivers-programming/
Спасибо, это поможет мне в другом не менее важном деле, но, боюсь, что я не найду там ответа на мой вопрос. Все темы в разделе преимущественно про написание драйверов, а с com портом С++ работает без драйверов . Так что тут как вопрос по с++, а точнее по структуре DCB и методу SetCommState.

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

Код
..., CBR_256000, $70800, $E1000)
В DCB задаете прямым текстом DCB.BaudRate = 0хE1000, соответствует 921600.
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
11.04.2014, 08:27  [ТС]     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #5
Цитата Сообщение от raxp Посмотреть сообщение
В DCB задаете прямым текстом DCB.BaudRate = 0хE1000, соответствует 921600.
Так ведь не работает так. Иначе я бы не спрашивал
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
11.04.2014, 09:19     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #6
Неужели У меня ведь работает, что я делаю не так?

НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
11.04.2014, 09:23  [ТС]     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #7
Цитата Сообщение от raxp Посмотреть сообщение
что я делаю не так?
Ну тогда, скорее что я не так делаю? На С++ я с COM портом не очень, мне проще другую плису с первой заставить через COM общаться, чем с компьютером. Так что может я действительно что-то не так настраиваю.

Добавлено через 48 секунд
Но нужно мне именно с компьютером и, желательно, С++.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
11.04.2014, 09:31     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #8
Цитата Сообщение от НеСказочник Посмотреть сообщение
константы, задающие частоту com порта кончаются
Так вы же и пишите программу, - добавьте.
(хотя частота действительно редкая. Я думаю тут корень зол в том, что все распространенные куски кода для работы с ком портом писались в те еще времена, когда такая частота была запредельна)

Цитата Сообщение от НеСказочник Посмотреть сообщение
Так ведь не работает так. Иначе я бы не спрашивал
А остальные настройки: стоповые биты, четность?..
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
11.04.2014, 09:37     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #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;
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
11.04.2014, 09:45  [ТС]     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #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.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,334
Завершенные тесты: 1
11.04.2014, 09:56     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #11
Цитата Сообщение от НеСказочник Посмотреть сообщение
В с++ CBR_115200 просто равен 115200.
В C++ нет CBR_115200. Эта константа просто где-то описана в подключенном файле.
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
11.04.2014, 10:03     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #12
если вместо
dcb.BaudRate = 921600
написать, скажем
бред, неудивительно, что у вас не получается.

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

Эта константа просто где-то описана в подключенном файле.
именно, в windows.h по идее, у меня в windows.pas . В данном случае ее можно просто задать напрямую, CBR_115200 = $1C200 = 0x1C200
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
11.04.2014, 10:13  [ТС]     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #13
CBR_115200 - у меня и так работает. А вот 921600, который 0xE1000 нет
Миниатюры
Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше  
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
11.04.2014, 12:29     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #14
Два раза повторили, что константа CBR_115200 уже прописана, тыкните по ней и посмотрите ее значение.

А вот 921600, который 0xE1000 нет
ваша ОС и среда компиляции? Код выложить не скриншотом и полностью.
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
11.04.2014, 12:32  [ТС]     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #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;//выходим из функции с ошибкой
    }
raxp
10140 / 6527 / 475
Регистрация: 28.12.2010
Сообщений: 21,167
Записей в блоге: 1
11.04.2014, 13:01     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #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
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
11.04.2014, 13:04  [ТС]     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #17
Имя порта COM1 и на частоте 115200 он работает, а выше нет. Проверено на двух разных машинах и на двух разных ОС на каждой.

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

Добавлено через 37 секунд
Правда проверял только на Visual C++ 2010.
newbie666
Заблокирован
11.04.2014, 13:07     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #18
Цитата Сообщение от НеСказочник Посмотреть сообщение
Имя порта COM1 и на частоте 115200 он работает, а выше нет
а он и не будет на большей частоте работать )) Это ж ком порт
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
11.04.2014, 13:12  [ТС]     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #19
Цитата Сообщение от newbie666 Посмотреть сообщение
а он и не будет на большей частоте работать )) Это ж ком порт
Но ведь Гипертерминал же на такой частоте с COM портом работает
Миниатюры
Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.04.2014, 13:13     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше
Еще ссылки по теме:

Частота встречаемости символов в файле C++
C++ Построение гистограммы (частота встречающихся чисел типа long int)
C++ Частота повторения букв в тексте

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

Или воспользуйтесь поиском по форуму:
НеСказочник
58 / 46 / 7
Регистрация: 12.11.2012
Сообщений: 339
Записей в блоге: 2
11.04.2014, 13:13  [ТС]     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше #20
Это, считай почти 1 Мбит/с. прямо как USB 1.0.
Yandex
Объявления
11.04.2014, 13:13     Через HyperTerminal доступна частота COM порта 921600, но в приложении максимальная частота гораздо меньше
Ответ Создать тему

Метки
921600, com порт, hyperterminal, частота
Опции темы

Текущее время: 12:46. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru