singlepost

как можно управлять COM портом в C++? << На главную или назад  

Добрый день!
Подскажите, как можно управлять COM портом в C++?
При использовании conio и функции outb он пишет Privleged instrunction! и не работает!

30 ответов в теме “как можно управлять COM портом в C++?”

  1. 8
    zubr kabbi ответил:

    Всё понял, Спасибо!

  2. 7
    Николай Труфанов ответил:

    Через WinAPI – когда ты из пользовательского режима обращаешься.
    А zubr kabbi пытается воспользоваться командами, доступными только в режиме ядра. Если он не хожет особо заморациваться, то ему через WinAPI, а про команды, которые он писал, пусть забудет

  3. 6
    Макс Донцов ответил:

    Все таки без WinAPI тут не обойтись

  4. 5
    Николай Труфанов ответил:

    что бы использовать команды conio и тому подобные которые напрямую к памяти или оборудованию обращаются, тебе надо в режим ядра перейти, иначе винда ругаться будет.

  5. 4
    Денис Мелёшин ответил:

    Работа с СОМ портом, вообще дело веселое, лично я делал при помощи WinAPI, только несколькими функциями там не обойдешся. вот например открытия и настройка порта:
    #include <windows.h>
    #include <iostream>

    HANDLE COMPort;

    int main()
    {
    DCB dcb;
    COMMTIMEOUTS timing;

    COMPort = CreateFile("COM2", GENERIC_WRITE|GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);

    if(COMPort != INVALID_HANDLE_VALUE)
    printf("COM port is open.\n");
    else
    printf("Couldn't open COM port .\n");

    dcb.DCBlength = sizeof(DCB);

    if(GetCommState(COMPort, &dcb))
    printf("Structure DCB is read.\n");
    else
    printf("Couldn't read structure DCB.\n");

    dcb.BaudRate = speed;
    dcb.fBinary = TRUE;
    dcb.fOutxCtsFlow = FALSE;
    dcb.fOutxDsrFlow = FALSE;
    dcb.fDtrControl = DTR_CONTROL_DISABLE;
    dcb.fDsrSensitivity = FALSE;
    dcb.fNull = FALSE;
    dcb.fRtsControl = RTS_CONTROL_DISABLE;
    dcb.fAbortOnError = FALSE;
    dcb.ByteSize = 8;
    dcb.Parity = 0;
    dcb.StopBits = 0;

    if(SetCommState(COMPort, &dcb))
    printf("Loading structure DCB is compleate.\n");
    else
    printf("Couldn't load structure DCB.\n");

    timing.ReadIntervalTimeout = 0;
    timing.ReadTotalTimeoutMultiplier = 0;
    timing.ReadTotalTimeoutConstant = 0;
    timing.WriteTotalTimeoutMultiplier = 0;
    timing.WriteTotalTimeoutConstant = 0;

    if(SetCommTimeouts(COMPort, &timing))
    printf("Structure COMMTIMEOUTS is writen.\n");
    else
    printf("Couldn't write structure COMMTIMEOUTS.\n");

    SetupComm(COMPort,2000,2000);
    PurgeComm(COMPort, PURGE_RXCLEAR);
    return 0;
    }

  6. 3
    Павел Пересторонин ответил:

    Только имена файлов "\\\\.\\COM1" и "\\\\.\\COM2"

  7. 2
    Александр Летов ответил:

    Под Вендой лучше файловые функции Win32 API использовать: CreateFile, ReadFile, и т.д.

  8. 1
    Александр Пинский ответил:

    Если под Виндой, то можно обращаться как к файлу (через fopen и иже с ним) – задёшь в качестве имени файла "com1" или "com2"

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.