Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Работа с COM портами


Автор: JiMKE 4.12.2008, 22:20
Привет всем.

Ситуация такая.
Написал небольшую программу в качестве эксперимента работы с COM портами, для дальнейшей разработки более серьезного приложения.

Код

// COM_EX.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <tchar.h>

 
void check_port (){
    HANDLE hCOM=CreateFile(_T("COM3:"),GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 
if (hCOM!=INVALID_HANDLE_VALUE) { 
    printf("COM PORT IS OPEN");
    char buffer[30]; 
    memset(buffer,0,sizeof(buffer)); 
    strcpy(buffer,"HELLO WORLD!"); 
    DWORD nb; 
    OVERLAPPED ov; 
    WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov); 
    CloseHandle(hCOM); 
} else {
    printf("ERROR OPEN COM PORT\n");
    printf("%d",hCOM);
}

}
int _tmain(int argc, _TCHAR* argv[])
{
    //printf("Hello World!\n");
    check_port();
    return 0;
}




И сразу же столкнулся с неприятностью.
HANDLE hCOM возвращает -1, почему может происходить подобная ситуация?

Заранее спасибо.

Автор: Dmi3ev 4.12.2008, 22:59
у меня вот такая ситуация встречалась как-то:
http://forum.codenet.ru/showthread.php?t=5605
 smile

Автор: UniBomb 4.12.2008, 23:04
JiMKE, на первый взгляд ты неправильно задаёш имя порта. Не нужно двоеточие. Да и потом - ты уверен, что в системе присутсвует третий ком-порт?

Автор: JiMKE 4.12.2008, 23:11
Цитата(UniBomb @  4.12.2008,  23:04 Найти цитируемый пост)
JiMKE, на первый взгляд ты неправильно задаёш имя порта. Не нужно двоеточие. Да и потом - ты уверен, что в системе присутсвует третий ком-порт? 

Дело в том, что пробовал как с двоеточием так и без него, и нумерацию портов меня от 0 до 9.

Добавлено через 6 минут и 35 секунд
Вот попробовал указывать имя порта немного другим способом
Код

// COM_EX.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <windows.h>
#include <tchar.h>
char strComPort[5];
 
void check_port (){
    strcpy((char *)strComPort,"COM1:");
    HANDLE hCOM=CreateFile((LPCTSTR)strComPort,GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); 
if (hCOM!=INVALID_HANDLE_VALUE) { 
    printf("COM PORT IS OPEN");
    char buffer[30]; 
    memset(buffer,0,sizeof(buffer)); 
    strcpy(buffer,"HELLO WORLD!"); 
    DWORD nb; 
    OVERLAPPED ov; 
    WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov); 
    CloseHandle(hCOM); 
} else {
    printf("ERROR OPEN COM PORT\n");
    printf("%d",hCOM);
}

}
int _tmain(int argc, _TCHAR* argv[])
{
    //printf("Hello World!\n");
    check_port();
    return 0;
}


Проблема осталась.

Автор: vinick 4.12.2008, 23:44
Цитата(JiMKE @  4.12.2008,  23:11 Найти цитируемый пост)

[code=cpp]
char strComPort[5];
....
strcpy((char *)strComPort,"COM1:");

"COM1:" не влезет в strComPort[5], не забываем про завершающий ноль.

из MSDN
Код

    hCom = CreateFile( TEXT("\\\\.\\COM1"),
        GENERIC_READ | GENERIC_WRITE,
        0,    // exclusive access 
        NULL, // default security attributes 
        OPEN_EXISTING,
        FILE_FLAG_OVERLAPPED,
        NULL 
        );

Автор: Severyanin 5.12.2008, 05:32
и до того, как писать в порт, его надо инициализировать. Задать ему таймауты с помощью функций settCommTimeouts и параметры самого портта - скоростьпередачи, контроль четности и т д. Поищите, mrbrooks ыкладывал мануал по ком-порту в разделе по Builder

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)