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


Автор: anking 8.7.2011, 18:19
Проблема возникает при открытии порта. Программа зависает без возможности оживления. Не сбрасывается даже через диспетчер задач. Помогаем только кнопка перезагрузки. При открытии второго экземпляра программы во время зависшего первого работа идет нормально но выводится "Unable to open port".
Собственно что тут не так?

Код

#undef UNICODE

#include <string>
#include <windows.h>
#include <stdio.h>
//#include "stdafx.h"

int main ()
{
using namespace std;

//port variables
DCB dcb;
COMMTIMEOUTS ct;
HANDLE port;
DWORD bc;
//.....

char str_file[100];
const char* comm1;
comm1="L_1_1";

while(1){

    

    FILE* fp = fopen("commands.txt","r");
    if(fp != NULL){

        
        char *buf_out="#010001#";
        char *buf_in;
        dcb.DCBlength=sizeof(DCB);
        BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dcb);
        dcb.fNull=TRUE;

        ct.ReadIntervalTimeout=10;
        ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
        ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;

        port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
        if(port==INVALID_HANDLE_VALUE) printf("Unable to open port\n");
        SetCommState(port,(LPDCB)&dcb);
        SetCommTimeouts(port,&ct);
        PurgeComm(port,PURGE_TXCLEAR|PURGE_RXCLEAR);
        SetupComm(port,256,256);

        //buf_in=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,strlen(buf_out)+1);
        WriteFile(port,buf_out,strlen(buf_out),&bc,NULL);
        //ReadFile(port,buf_in,strlen(buf_out),&bc,NULL);

        //HeapFree(GetProcessHeap(),0,buf_in);
        CloseHandle(port);
        

    fflush(stdin);
    fclose(fp);
    _unlink("commands.txt");
    }
    else printf("No commands posted or Error open file.\n");
     
    Sleep(1000);
}

}

Автор: anking 9.7.2011, 17:54
Проблема решилась. Оказалось зависало при вызове writefile

Сделал явное определение структуры dcb и проблема исчезла
Код

port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
            if(port==INVALID_HANDLE_VALUE) printf("Unable to open port\n");

            dcb.DCBlength=sizeof(DCB);
            //BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dcb);
            //dcb.fNull=TRUE;

            // Get the default port setting information.
            GetCommState (port, &dcb);

            // Change the DCB structure settings.
            dcb.BaudRate = 9600;                    // Current baud 
            dcb.fBinary = TRUE;                        // Binary mode; no EOF check 
            dcb.fParity = TRUE;                        // Enable parity checking 
            dcb.fOutxCtsFlow = FALSE;                // No CTS output flow control 
            dcb.fOutxDsrFlow = FALSE;                // No DSR output flow control 
            dcb.fDtrControl = DTR_CONTROL_ENABLE;    // DTR flow control type 
            dcb.fDsrSensitivity = FALSE;            // DSR sensitivity 
            dcb.fTXContinueOnXoff = TRUE;            // XOFF continues Tx 
            dcb.fOutX = FALSE;                        // No XON/XOFF out flow control 
            dcb.fInX = FALSE;                        // No XON/XOFF in flow control 
            dcb.fErrorChar = FALSE;                    // Disable error replacement 
            dcb.fNull = FALSE;                        // Disable null stripping 
            dcb.fRtsControl = RTS_CONTROL_ENABLE;    // RTS flow control 
            dcb.fAbortOnError = FALSE;                // Do not abort reads/writes on error
            dcb.ByteSize = 8;                        // Number of bits/byte, 4-8 
            dcb.Parity = NOPARITY;                    // 0-4=no,odd,even,mark,space 
            dcb.StopBits = ONESTOPBIT;                // 0,1,2 = 1, 1.5, 2 

            ct.ReadIntervalTimeout=10;
            ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
            ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;

            SetCommState(port,&dcb);
            SetCommTimeouts(port,&ct);
            PurgeComm(port,PURGE_TXCLEAR|PURGE_RXCLEAR);
            SetupComm(port,256,256);

            WriteFile(port,sBuf,strlen(sBuf),&bc,NULL);


            CloseHandle(port);

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