Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/82: Рейтинг темы: голосов - 82, средняя оценка - 4.51
3 / 3 / 0
Регистрация: 24.03.2010
Сообщений: 11

COM-порт, как правильно настроить

17.06.2010, 23:53. Показов 16428. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Прошу помощи в решении следующей проблемы: на 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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
{  String ComPort = "\\\\.\\COM3";
   String Speed = "9600";
   
   dcb=(DCB*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DCB));
   dcb->DCBlength=sizeof(DCB);
 
   BuildCommDCB("baud=9600 parity=N data=8 stop=1",dcb);
 
   dcb->fNull = TRUE;      //отбрасываем нулевые байты
   dcb->BaudRate = StrToInt(Speed);
 
   //тайминги
   ct.ReadIntervalTimeout = 5;
   ct.ReadTotalTimeoutMultiplier = 2;
   ct.ReadTotalTimeoutConstant=2;
   ct.WriteTotalTimeoutMultiplier = ct.WriteTotalTimeoutConstant=0;
 
   port=CreateFile(ComPort.c_str(), GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
 
      SetCommState(port,dcb);
      SetCommTimeouts(port,&ct);
      HeapFree(GetProcessHeap(),0,dcb);
 
      SetupComm(port,256,256);  //размеры(в байтах)очередей приема и передачи
 
      PurgeComm(port,PURGE_TXCLEAR|PURGE_RXCLEAR);    //обнуление буфера, но он не обнуляется т.к. остаются данные после того, 
                        //поработает другая программа.. 
      tmrReadPort->Enabled = True;  //в таймере идет считывание с порта
}
 
 
void __fastcall TMainForm::tmrReadPortTimer(TObject *Sender)
{
 
TStringList *inCOMstr = new TStringList;
DWORD    bc;
   
   byte buf_in[256];
   memset(buf_in, 0x00, 256);
   int value;
   AnsiString s = AnsiString((char*)buf_in);
 
   ReadFile(port,buf_in,256,&bc,NULL);
 
  //дальше обработка информации в buf_in
 
}
Буду рад любым советам
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.06.2010, 23:53
Ответы с готовыми решениями:

как настроить USB порт
как настроить USB порт потомушо когда я включаю флешку то у меня пишит в нижнем углу слева что ето обородывание может работать быстрее и...

Как настроить в Windows 7 подключение через com-порт?
Если кто знает, подскажите решение проблемы: как в семерке выбрать тип сетевого подключения "прямое подключение к другому...

Как настроить интернет на микротике во второй порт
Пытаюсь настроить интернет на маршрутизаторе микротик- версия 6.42.. Стояла заводская конфигурация- первый порт ван а остальные лан и...

6
 Аватар для radiohobbyt
192 / 190 / 15
Регистрация: 27.01.2009
Сообщений: 548
21.06.2010, 19:41
ну да. увеличь их в сотню раз, свои тайминги.
для проверки можешь в диспетчере устройств порт настроить и в программе не настраивать. если заработает, значит проблема в его настройках.

Добавлено через 4 минуты
C
1
 String ComPort = "COM3";
а то чтото мудрено выглядит
0
3 / 3 / 0
Регистрация: 24.03.2010
Сообщений: 11
25.06.2010, 02:13  [ТС]
Спасибо, проблема пофиксена использованием левой библиотеки.
В борланде, запись вида
C++
1
String ComPort = "COM3";
работает до 9 или 11 номера. Мой вариант работает со всеми 255 штуками
1
 Аватар для El Fuego
16 / 15 / 2
Регистрация: 07.12.2009
Сообщений: 52
25.06.2010, 07:19
Цитата Сообщение от Sergo88 Посмотреть сообщение
Спасибо, проблема пофиксена использованием левой библиотеки.
В борланде, запись вида
C++
1
String ComPort = "COM3";
работает до 9 или 11 номера. Мой вариант работает со всеми 255 штуками
Таки похвастайтесь этой библиотекой...
Наверное интересно не только мне
0
3 / 3 / 0
Регистрация: 24.03.2010
Сообщений: 11
08.07.2010, 22:57  [ТС]
Цитата Сообщение от El Fuego Посмотреть сообщение
Таки похвастайтесь этой библиотекой...
Наверное интересно не только мне
Библиотека PComm Lite от Moxa. Свободная версия выложена на сайте компании: http://www.moxa.com/product/do... e_info.htm
Устанавливаются еще какие-то приблуды, но главное библиотека. Есть как 32, так и 64 битная версия. Подробности использования расписывать времени нет, если кому нужно, пишите, расскажу.
1
ivanov3000
22.11.2010, 01:48
radiohobbyt, тема давнишняя, но актуальная для такого новичка как я, посоветуйте, пожалуйста, с чем может быть связана вот такая ошибка в работе: настраиваю и читаю своей С++ программой COM порт, эмулированный USB устройством (FT232). Почему то после подключения моего USB устройства читается из порта какая то белиберда, а после вызова Гипертерминала и последующего чтения моей программой - все читается на ура так как и должно было бы быть.
Вопрос такой - ЧТО именно может настраивать Гипертерминал в 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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
char com[4]="COM6";
 
DCB dcb;
HANDLE hLpt =
CreateFile(com, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
SetupComm(hLpt, BUSZ, BUSZ);  // размер буфера чтения / записи
 
BOOL fSuccess=GetCommState(hLpt, &dcb); // читаем текущие настройки порта
if (!fSuccess)       // проверяем наличие ошибки открытия
{
Label6->Caption=("ошибка порта ");
return;   // если порт не открывается - выход из процедуры
}
else
{
Label6->Caption=("открыт порт ");
 
}
//далее установим наши параметры
dcb.BaudRate = CBR_9600;      
dcb.fBinary = TRUE;
dcb.fOutxCtsFlow = FALSE;
dcb.fOutxDsrFlow = FALSE; 
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE; 
dcb.fDsrSensitivity = FALSE; 
dcb.fNull = FALSE; 
dcb.fRtsControl = RTS_CONTROL_DISABLE; 
dcb.fAbortOnError = FALSE;
dcb.ByteSize = 8; 
dcb.Parity = NOPARITY; 
dcb.StopBits = 1;
 
 
SetCommState(hLpt, &dcb);  //запишем параметры в порт
 
 
COMMTIMEOUTS CommTimeOuts;
GetCommTimeouts(hLpt, &CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout= 100;
CommTimeOuts.ReadTotalTimeoutMultiplier = 1; 
 
CommTimeOuts.ReadTotalTimeoutConstant = 1000;
 
CommTimeOuts.WriteTotalTimeoutMultiplier = 1;
CommTimeOuts.WriteTotalTimeoutConstant = 1000;
SetCommTimeouts(hLpt, &CommTimeOuts);
 
 
PurgeComm(hLpt, PURGE_RXCLEAR);  // очистка буфера приема
PurgeComm(hLpt, PURGE_TXCLEAR);  // очистка буфера передачи
 
// далее чтение порта
BOOL bResult;
char buf[BUSZ]; // массив BUSZ букв
 
DWORD dwEvtMask;
SetCommMask(hLpt, EV_RXCHAR);  // установить маску на отслеживание драйвером события - чтение байта
bResult=WaitCommEvent(hLpt, &dwEvtMask, NULL); // событие приема байта
loop: if (!(bResult&&(dwEvtMask&EV_RXCHAR)))
{
bResult=WaitCommEvent(hLpt, &dwEvtMask, NULL); // событие приема байта
goto loop;                 // ожидание приема байта
} else {};
bResult =
ReadFile(hLpt, &buf, BUSZ, &ret, NULL);
 
if (!bResult) { ShowMessage("COM6 Read Error"); } // если ноль - то ошибка
3 / 3 / 0
Регистрация: 24.03.2010
Сообщений: 11
29.04.2011, 16:35  [ТС]
Эх, давно дело было, но может кому-нибудь поможет.
При реализации этой же программы (см. первый пост) на C# столкнулся с тем же поведением.
Захват данных через COM-порт происходил через стандартный компонент SerialPort. Стоило изменить его свойство DtrEnable на True, как все чудесным образом заработало без настройки таймингов. К сожалению решение было найдено методом тыка, разбираться особо времени не было.
Возможно, ivanov3000 следовало бы пошаманить с настройками в DCB.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.04.2011, 16:35
Помогаю со студенческими работами здесь

Как настроить ip порт мфу 1536 dnf mfp?
Как настроить на принтере ip адрес? Или бы документацию где то взять или может по шагам кто то подскажет, не могу найти меню, а настроить...

Как настроить модем TP-LINK TD-W8951ND через Wan порт?
Доброго времени суток! Проблема следующая, совсем недавно перешел с обычного скоростного интернета(adsl) на оптоволокно. Модем не...

Как правильно изменить порт?
Есть парсер. Суть парсера такая, он перехватывает от одной программы передаваемое значение на сервер в интернете, затем возвращает нужный...

Как настроить (или) включить порт USB 2 материнка ASRock AM2NF6G-VSTA?
Потскажите пожалуста как настроить (или)включить порт USB 2 материнка ASRock AM2NF6G-VSTA

C# и COM порт: как правильно прочитать данные
Здравствуйте. Написал простой код и не могу понять почему не работает. Кто подскажет буду очень признателен. using System; using...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru