Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема при открытии сом порта, повисон программы 
V
    Опции темы
anking
Дата 8.7.2011, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 24.3.2008
Где: Minsk

Репутация: нет
Всего: нет



Проблема возникает при открытии порта. Программа зависает без возможности оживления. Не сбрасывается даже через диспетчер задач. Помогаем только кнопка перезагрузки. При открытии второго экземпляра программы во время зависшего первого работа идет нормально но выводится "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);
}

}

PM MAIL ICQ   Вверх
anking
Дата 9.7.2011, 17:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 16
Регистрация: 24.3.2008
Где: Minsk

Репутация: нет
Всего: нет



Проблема решилась. Оказалось зависало при вызове 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);

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0727 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.