Проблема при работе с com-портом. vs 6.0
От: zipper3  
Дата: 26.02.06 17:44
Оценка:
Здравствуйте! У меня проблема с основами управления com-портом ч-з winapi. Начальная задача передать строчку и сразу прочитать ее. Прочитал, что для этого надо замкнуть 2й и 3й пины на компорте.

Код:
    
    HANDLE hCOM=CreateFile("COM1",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    DCB  DCB;
    DCB.BaudRate=4799;
    DCB.ByteSize = 8;
    DCB.Parity = 0;
    DCB.StopBits = 0;
    SetCommState(hCOM,&DCB);
    
    COMMTIMEOUTS timeCom;
    GetCommTimeouts(
    hCOM,     // handle to comm device
    &timeCom  // time-out values
    );
  
        timeCom.ReadIntervalTimeout=100;
        timeCom.ReadTotalTimeoutConstant=50;
        timeCom.ReadTotalTimeoutMultiplier=0;
        timeCom.WriteTotalTimeoutMultiplier=0;
        timeCom.WriteTotalTimeoutConstant=0;

    SetCommTimeouts(
        hCOM,     // handle to comm device
        &timeCom  // time-out values
        );


    if (hCOM!=INVALID_HANDLE_VALUE)
    {
        AfxMessageBox("COM1 is open OK!");
        char buffer[30];
    //    buffer=m_wdata;
        //AfxMessageBox(buffer);
        memset(buffer,0,sizeof(buffer));
            strcpy(buffer,"SAVE TO COM1");
        DWORD nb;
        OVERLAPPED ov;
        WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
        CloseHandle(hCOM);
    }
    else AfxMessageBox("Error Open COM1");

Запись, помоему, не происходит. В дебаггере переменная nb =0, так же происходит, если заменить на readFile (массив buffer остаеться тем же, nb=0).

p.s. nb — кол-во записаных/считанных байт.
p.p.s. Всем заранее спасибо!
.
Re: Проблема при работе с com-портом. vs 6.0
От: Аноним  
Дата: 26.02.06 23:24
Оценка:
Здравствуйте, zipper3, Вы писали:

Z>Здравствуйте! У меня проблема с основами управления com-портом ч-з winapi. Начальная задача передать строчку и сразу прочитать ее. Прочитал, что для этого надо замкнуть 2й и 3й пины на компорте.


Z>Код:

Z>
    
Z>    HANDLE hCOM=CreateFile("COM1",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
Z>    DCB  DCB;
Z>    DCB.BaudRate=4799;
Z>    DCB.ByteSize = 8;
Z>    DCB.Parity = 0;
Z>    DCB.StopBits = 0;
Z>    SetCommState(hCOM,&DCB);
    
Z>    COMMTIMEOUTS timeCom;
Z>    GetCommTimeouts(
Z>    hCOM,     // handle to comm device
Z>    &timeCom  // time-out values
Z>    );
  
Z>        timeCom.ReadIntervalTimeout=100;
Z>        timeCom.ReadTotalTimeoutConstant=50;
Z>        timeCom.ReadTotalTimeoutMultiplier=0;
Z>        timeCom.WriteTotalTimeoutMultiplier=0;
Z>        timeCom.WriteTotalTimeoutConstant=0;

Z>    SetCommTimeouts(
Z>        hCOM,     // handle to comm device
Z>        &timeCom  // time-out values
Z>        );


Z>    if (hCOM!=INVALID_HANDLE_VALUE)
Z>    {
Z>        AfxMessageBox("COM1 is open OK!");
Z>        char buffer[30];
Z>    //    buffer=m_wdata;
Z>        //AfxMessageBox(buffer);
Z>        memset(buffer,0,sizeof(buffer));
Z>            strcpy(buffer,"SAVE TO COM1");
Z>        DWORD nb;
Z>        OVERLAPPED ov;
Z>        WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
Z>        CloseHandle(hCOM);
Z>    }
Z>    else AfxMessageBox("Error Open COM1");
Z>

Z>Запись, помоему, не происходит. В дебаггере переменная nb =0, так же происходит, если заменить на readFile (массив buffer остаеться тем же, nb=0).

Z>p.s. nb — кол-во записаных/считанных байт.

Z>p.p.s. Всем заранее спасибо!
Z>.

Там, по-моему, вместе с СОМ еще куча черточек и точечек должна быть нарисованна. А так скорее всего создастся файл с именем СОМ.
Re: Проблема при работе с com-портом. vs 6.0
От: mishin  
Дата: 27.02.06 08:14
Оценка:
Z> HANDLE hCOM=CreateFile("COM1",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
Z> DCB DCB;
Z> DCB.BaudRate=4799;
Z> DCB.ByteSize = 8;
Z> DCB.Parity = 0;
Z> DCB.StopBits = 0;
Z> SetCommState(hCOM,&DCB);

Что то какая-то странная скорость 4799

Воспользуйся BuildCommDCB("baud=9600 parity=N data=8 stop=1");
Re: Проблема при работе с com-портом. vs 6.0
От: aik Австралия  
Дата: 27.02.06 10:02
Оценка:
Здравствуйте, zipper3, Вы писали:

Z>Здравствуйте! У меня проблема с основами управления com-портом ч-з winapi. Начальная задача передать строчку и сразу прочитать ее. Прочитал, что для этого надо замкнуть 2й и 3й пины на компорте.


Прицепись к этому порту терминалкой (HyperTerm/SecureCRT/...) и понажимай кнопки, должно быть эхо.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Проблема при работе с com-портом. vs 6.0
От: _const_  
Дата: 27.02.06 10:42
Оценка: 1 (1)
Здравствуйте, zipper3, Вы писали:

Z>Здравствуйте! У меня проблема с основами управления com-портом ч-з winapi. Начальная задача передать строчку и сразу прочитать ее. Прочитал, что для этого надо замкнуть 2й и 3й пины на компорте.


Z>Код:

Z>
    
Z>    HANDLE hCOM=CreateFile("COM1",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
Z>    DCB  DCB;
Z>    DCB.BaudRate=4799;
Z>    DCB.ByteSize = 8;
Z>    DCB.Parity = 0;
Z>    DCB.StopBits = 0;
Z>    SetCommState(hCOM,&DCB);
    
Z>    COMMTIMEOUTS timeCom;
Z>    GetCommTimeouts(
Z>    hCOM,     // handle to comm device
Z>    &timeCom  // time-out values
Z>    );
  
Z>        timeCom.ReadIntervalTimeout=100;
Z>        timeCom.ReadTotalTimeoutConstant=50;
Z>        timeCom.ReadTotalTimeoutMultiplier=0;
Z>        timeCom.WriteTotalTimeoutMultiplier=0;
Z>        timeCom.WriteTotalTimeoutConstant=0;

Z>    SetCommTimeouts(
Z>        hCOM,     // handle to comm device
Z>        &timeCom  // time-out values
Z>        );


Z>    if (hCOM!=INVALID_HANDLE_VALUE)
Z>    {
Z>        AfxMessageBox("COM1 is open OK!");
Z>        char buffer[30];
Z>    //    buffer=m_wdata;
Z>        //AfxMessageBox(buffer);
Z>        memset(buffer,0,sizeof(buffer));
Z>            strcpy(buffer,"SAVE TO COM1");
Z>        DWORD nb;
Z>        OVERLAPPED ov;
Z>        WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
Z>        CloseHandle(hCOM);
Z>    }
Z>    else AfxMessageBox("Error Open COM1");
Z>

Z>Запись, помоему, не происходит. В дебаггере переменная nb =0, так же происходит, если заменить на readFile (массив buffer остаеться тем же, nb=0).

Z>p.s. nb — кол-во записаных/считанных байт.

Z>p.p.s. Всем заранее спасибо!
Z>.

Значит, что бросилось в глаза.
1. Проверку hCOM != INVALID_HANDLE_VALUE надо делать сразу после CreateFile, иначе SetComm... не сработают.
2. Если предполагается работать с портами с номером выше чего-то там, то лучше задать имя \\.\COMx.
3. На Win старше 98 скорости устанавливаются только стандартные (из констант CBR_xxx).
4. Кол-во Stop bits не может быть нулевым. По определению.
5. Из вышеозначенного — проверять лучше результат вызова всех ф-ций.
6. DCB все-таки либо перед установкой нужных параметров очищать, либо инициализировать все поля.

Пока, по-моему, достаточно.
Re[2]: Проблема при работе с com-портом. vs 6.0
От: Anton Batenev Россия https://github.com/abbat
Дата: 27.02.06 10:56
Оценка:
Здравствуйте, <Аноним>, Вы писали:

Z>> HANDLE hCOM = CreateFile("COM1",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

А>Там, по-моему, вместе с СОМ еще куча черточек и точечек должна быть нарисованна. А так скорее всего создастся файл с именем СОМ.

Нет, откроется именно COM, хотя более м... правильно чтоли...

HANDLE h_serial = CreateFile("\\\\.\\COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);


Псоле чего, что-то в стиле:

DCB dcb;
dcb.DCBlength = sizeof(DCB);
GetCommState(h_serial, &dcb);

dcb.BaudRate = CBR_4800;
dcb.ByteSize = 8;
dcb.fParity  = FALSE;
dcb.Parity   = NOPARITY;
dcb.StopBits = ONESTOPBIT;

SetCommState(h_serial, &dcb);


ну и далее по тексту...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Проблема при работе с com-портом. vs 6.0
От: zipper3  
Дата: 27.02.06 14:21
Оценка:
Здравствуйте, Anton Batenev, Вы писали:

AB>Здравствуйте, <Аноним>, Вы писали:


Z>>> HANDLE hCOM = CreateFile("COM1",GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

А>>Там, по-моему, вместе с СОМ еще куча черточек и точечек должна быть нарисованна. А так скорее всего создастся файл с именем СОМ.

AB>Нет, откроется именно COM, хотя более м... правильно чтоли...


AB>
AB>HANDLE h_serial = CreateFile("\\\\.\\COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
AB>


AB>Псоле чего, что-то в стиле:


AB>
AB>DCB dcb;
AB>dcb.DCBlength = sizeof(DCB);
AB>GetCommState(h_serial, &dcb);

AB>dcb.BaudRate = CBR_4800;
AB>dcb.ByteSize = 8;
AB>dcb.fParity  = FALSE;
AB>dcb.Parity   = NOPARITY;
AB>dcb.StopBits = ONESTOPBIT;

AB>SetCommState(h_serial, &dcb);
AB>


AB>ну и далее по тексту...


Всем спасибо, но что-то не помогло. Прочитал все, переписал код вот так
    HANDLE hCOM=CreateFile("\\\\.\\COM1", GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0, 0);
    if (hCOM!=INVALID_HANDLE_VALUE)
    {
            DCB dcb;
    dcb.DCBlength = sizeof(DCB);
    GetCommState(hCOM, &dcb);

    dcb.BaudRate = CBR_4800;
    dcb.ByteSize = 8;
    dcb.fParity  = FALSE;
    dcb.Parity   = NOPARITY;
    dcb.StopBits = ONESTOPBIT;

    SetCommState(hCOM, &dcb);
        
        
        AfxMessageBox("COM1 is open OK!");
        char buffer[30];
        char buffer2[30];
    //    buffer=m_wdata;
        strcpy(buffer,m_wdata);
        //AfxMessageBox(buffer);
        memset(buffer,0,sizeof(buffer));
        strcpy(buffer,"SAVE TO COM1");
        
        DWORD nb;
        OVERLAPPED ov;
        WriteFile(hCOM,&buffer,sizeof(buffer),&nb,&ov);
        for(int i=0; i<30;i++)
        {
            buffer2[i]=0;        
        }
        ReadFile(hCOM,buffer2,sizeof(buffer),&nb,&ov);
        AfxMessageBox(buffer2);

        CloseHandle(hCOM);
    }
    else AfxMessageBox("Error Open COM1");


И все равно не работает. Может кто-нибудль просто скинет мне рабочий пример. MSDN не помог.
Re[4]: Проблема при работе с com-портом. vs 6.0
От: _const_  
Дата: 27.02.06 16:52
Оценка:
Здравствуйте, zipper3, Вы писали:


Z>И все равно не работает. Может кто-нибудль просто скинет мне рабочий пример. MSDN не помог.


Сказал же — проверяйте коды возврата ВСЕХ ф-ций. Помогает. Хотя бы понять, где именно проблема.
И еще. Если файл открыт без FILE_FLAG_OVERLAPPED, переменная ov лишняя.
А пример можно взять здесь.
Re[5]: Проблема при работе с com-портом. vs 6.0
От: zipper3  
Дата: 28.02.06 06:23
Оценка:
Здравствуйте, _const_, Вы писали:

__>Здравствуйте, zipper3, Вы писали:



Z>>И все равно не работает. Может кто-нибудль просто скинет мне рабочий пример. MSDN не помог.


__>Сказал же — проверяйте коды возврата ВСЕХ ф-ций. Помогает. Хотя бы понять, где именно проблема.

__>И еще. Если файл открыт без FILE_FLAG_OVERLAPPED, переменная ov лишняя.
__>А пример можно взять здесь.

Всем спасибо. Проблема была в переменной ov если вместо нее написать NULL, то все работает.
Re: Проблема при работе с com-портом. vs 6.0
От: explorus Россия  
Дата: 01.03.06 08:48
Оценка:
Во первых, нужно научиться пользоваться поиском, он очень многое знает...

Во вторых, вот это тебе поможет
Автор: explorus
Дата: 11.10.05
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.