С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 04.09.2018
Сообщений: 2

Функция чтения ком порта

18.11.2018, 13:08. Показов 1154. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Господа помогите новичку. Необходимо написать функцию чтения строк с ком порта длина которых больше 19.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DLL_API DWORD COM_Read( DWORD hOpenContext, LPVOID pBuffer, DWORD Count )
{
    if (hOpenContext != OPEN_CONTEXT)
        return 0;
}
    DWORD dwBytes = 0;
    ReadFile(hComm, pBuffer, Count, &dwBytes, NULL);
       char* pCh = (char*)pBuffer;
     if (dwBytes <=19)
     {memset (pCh,0,dwBytes);dwBytes = 0;}
    else
     pBuffer=pCh;
     return dwBytes;
}
Иногда выдает на выходе все строки иногда работает. Что может быть?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.11.2018, 13:08
Ответы с готовыми решениями:

Инициализации ком порта
Нужно прочитать данные с ком порта, но перед этим его открыть. У нас есть USB RS 485 , при подключении создается какой-то COM порт. Нужно...

Два потока, чтения и записи с ком порта
с++, старый,не нэтовский, вроде 2000, может старее два потока, чтения и записи с ком порта, чтение всегда запущен,читает, записи же...

Как узнать кол-во допупных байтов для чтения с ком-порта
Доброго времени суток, уважаемые программисты! Есть скопированная отсюда прога, но она просто пишет на порт и читает в бесконечном цикле:...

4
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.11.2018, 13:15
Используй компонент BComPort.
С WinApi будет тяжело разобраться.
1
0 / 0 / 0
Регистрация: 04.09.2018
Сообщений: 2
18.11.2018, 13:22  [ТС]
Задача использовать использовать только WinApi. Никто не поможет?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
18.11.2018, 13:27
Можешь посмотреть мой код https://github.com/Avazart/Bic... Win/Serial
может как то поможет, но сомневаюсь.
1
51 / 39 / 15
Регистрация: 20.09.2018
Сообщений: 163
22.11.2018, 05:20
Вот мой код на WinAPI. Работает. Может поможет:
Инициализация порта:
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
int Measure_thread::COMOpen(int port_number,int baudrate,int parity,int databits,int stopbits,int read_wait_timeout,bool use_dtr,HANDLE * comport)
{
    String portname;
    DCB dcb;
    COMMTIMEOUTS timeouts;
 
    portname="COM"+IntToStr(port_number);
    *comport=CreateFile(portname.c_str(),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
    if(*comport==INVALID_HANDLE_VALUE)return -2;
 
    dcb.DCBlength=sizeof(DCB);
    if(!GetCommState(*comport,&dcb)){COMClose(comport);return -3;}
 
    dcb.BaudRate=baudrate;
    dcb.fBinary=TRUE;
    dcb.fOutxCtsFlow=FALSE;
    dcb.fOutxDsrFlow=FALSE;
    if(use_dtr==TRUE)dcb.fDtrControl=DTR_CONTROL_ENABLE;
    else dcb.fDtrControl=DTR_CONTROL_DISABLE;
    dcb.fDsrSensitivity=FALSE;
    dcb.fNull=FALSE;
    dcb.fRtsControl=RTS_CONTROL_DISABLE;
    dcb.fAbortOnError=FALSE;
    dcb.ByteSize=databits;
    dcb.Parity=parity;
    dcb.StopBits=stopbits;
    if(!SetCommState(*comport,&dcb)){COMClose(comport);return -4;}
 
    timeouts.ReadIntervalTimeout=0;
    timeouts.ReadTotalTimeoutMultiplier=0;
    timeouts.ReadTotalTimeoutConstant=read_wait_timeout;
    timeouts.WriteTotalTimeoutMultiplier=0;
    timeouts.WriteTotalTimeoutConstant=0;
    if(!SetCommTimeouts(*comport,&timeouts)){COMClose(comport);return -5;}
 
    SetupComm(*comport,2000,2000);
    PurgeComm(*comport,PURGE_RXCLEAR);
    if(use_dtr==TRUE)EscapeCommFunction(*comport,SETDTR);
    else EscapeCommFunction(*comport,CLRDTR);
 
    return 1;
}
Закрытие порта:
C++
1
2
3
4
5
6
7
8
9
int Measure_thread::COMClose(HANDLE * comport)
{
    if(*comport!=NULL)
    {
        if(CloseHandle(*comport)==0)return -1;
        *comport=0;
    }
    return 1;
}
Запись в порт:
C++
1
2
3
4
5
6
7
8
9
10
11
int Measure_thread::SendCommandToGenerator(float amp,int freq)
{
    static unsigned long t;
    static unsigned char request[100];
 
    memset(request,0,sizeof(request));
    sprintf(request,"APPL:SIN %d HZ, %.4f VPP\r\n",freq,amp);
    PurgeComm(gen_port,PURGE_TXCLEAR);
    if(WriteFile(gen_port,request,strlen(request),&t,NULL)!=true)return GetLastError();
    return 1;
}
Чтение из порта:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int Measure_thread::GetDataFromMultimeter(unsigned char * command,float coefficient,float * value)
{
    static unsigned long t;
    static unsigned char respond[100],log_text[200];
 
    memset(respond,0,sizeof(respond));
    PurgeComm(mm_port,PURGE_TXCLEAR);
    if(WriteFile(mm_port,command,strlen(command),&t,NULL)!=true)return GetLastError();
 
    if(ReadFile(mm_port,respond,17,&t,NULL)!=true)return GetLastError();
 
    //Заменяем точку на запятую
    for(t=0;t<strlen(respond);t++)
        if(respond[t]=='.')respond[t]=',';
    respond[15]=0;
    respond[16]=0;
    try{*value=coefficient*StrToFloat((String)((char*)(respond)));}
    catch(...){return -1;}
 
    return 1;
}
Много лишнего применительно к моей задаче. Нет времени чистить. И так разберешься наверно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.11.2018, 05:20
Помогаю со студенческими работами здесь

Перекодировать данные с ком порта
Доброго времени суток, ребят подскажите как в дельфи получить данные как в мониторе COM. В мониторе вижу так: . В отладчике дельфи 6...

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

2 ком порта с одним прерыванием
Линухи под рукой нет, но вопрос (хоть и чайника но), требует быстрого разрешения. В Bash скрипте поменял значения для 2-х ком портов....

Ошибки при настройке ком-порта
Здравствуйте! Я пишу программу для ком-порта. Пытаюсь заполнить структуры DCB. Четность, количество битов, скорость, стоповые биты задаются...

Чтение ком порта с отключенным устройством
Есть такая задача написать модуль для проверки работает ли устройство подключённое по RS(COM порт).Для проверки я просто читаю данные и...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru