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

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

17.06.2010, 23:53. Показов 16430. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru