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

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

18.11.2018, 13:08. Показов 1179. Ответов 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
8488 / 6155 / 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
8488 / 6155 / 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
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru