zabawa z uchwytami ;-/

0

witam,

ponizej przedstawiam programik do MATLABA acz zawierajacy wiekszosc kodu w C++, ktory wysylac cos na COMa otwierajac go wczesniej za pomoca funkcji WinAPI Create File i uchwytu. mam taki problem, ze: tutaj to ja mam jakby "stwarzanie portu". a za zadanie mam otworzyc port za pomoca funkcji, ktora potem ma zwracac ten uchwyt i go uzyc jako parametru wejsciowego do np innych funkcji, ktore np beda wysylac cos i zamykac port. jak to zrealizowac ?? [???]

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#include "mex.h"

//#define CBR_9600            9600

    DCB dcb;                           //struktura Data Control Block
    HANDLE PortHandle;                 //uchwyt do portu
    LPSTR PortNum = "COM1";
    
    DWORD   fdwEvtMask;
  //COMSTAT Stat;
  //DWORD   Errors;
    DWORD NumberOfBytesWritten;
    DWORD NumberOfBytesRead;
  //DWORD WINAPI ReadThreadFunc( LPVOID );
    unsigned int SendByte;
    bool Succes;

//poczatek mexFunkcji   
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
 int port;
 int CBR = 9600;
 
     port = mxGetScalar(prhs[0]);      //pobiera numer portu z wejscia
     CBR = mxGetScalar(prhs[1]);       //pobiera predkosc przesylu
         
    switch (port)
           {
            case 1 : PortNum = "COM1";
                   break;
            case 2 : PortNum = "COM2";
                   break;
            case 3 : PortNum = "COM3";
                   break;
            case 4 : PortNum = "COM4";
                   break;
            default : PortNum = "COM1";
                   break;
           }
    mexPrintf("Wybrano port COM%d\n",port);
              
    PortHandle = CreateFile(PortNum , GENERIC_WRITE|GENERIC_READ , 0 , NULL , OPEN_EXISTING , 0 , NULL);    
    
    if(PortHandle == INVALID_HANDLE_VALUE)
    {
        mexPrintf("Proba otwarcia portu nie powiodla sie!\n");
        return;
    }
     
    SetupComm(PortHandle , 1 , 1);          // inicjalizuje parametry komunikacyjne portu (wskaznik i bufory)
    
    dcb.DCBlength  = sizeof(dcb);           //dlugosc struktury
        GetCommState(PortHandle , &dcb);    //udostepnienie aktualnych parametrow DCB 
    
    dcb.BaudRate = CBR;                    //szybkosc transmisji
  //dcb.fBinary = TRUE;                    //tryb binarny wlaczony - w windows musi byc TRUE                                   
    dcb.fParity = FALSE;                   //TRUE - wlaczone sprawdzanie parzystosci i raportowanie bledow                  
  //dcb.fParity = TRUE;
  //dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;
    dcb.ByteSize = 8;                      //od 5 do 8
    dcb.fDtrControl = DTR_CONTROL_ENABLE;  //DTR wylaczony gdy urzadzenie jest otwarte
    dcb.fRtsControl = RTS_CONTROL_ENABLE;

    Succes = SetCommState(PortHandle , &dcb);
   
    if(!Succes)
    {
        mexPrintf("Wystapil blad dostepu do portu!\n");
        return;
    }   
    
    GetCommMask(PortHandle, &fdwEvtMask);
        SetCommMask(PortHandle, EV_RXCHAR);    

    SendByte = mxGetScalar(prhs[2]);

    WriteFile(PortHandle , &SendByte , 1 , &NumberOfBytesWritten , NULL);
        mexPrintf("Wyslano %d bajtow zawierajacych %d\n", NumberOfBytesWritten, SendByte); 
 
    CloseHandle(PortHandle);    

    return;   
}
0

CreateFile z parametrem OPEN_EXISTING nie 'tworzy portu', tylko uchwyt do 'pliku' urządzenia portu. Zauważ, że to co ona zwraca, jest tym, czego potrzebujesz - używasz tego uchwytu zarówno przy ustawianiu portu (SetCommState), jak i przy wysyłaniu (WriteFile). Ostatecznie też zamykasz go, aby inne procesy miały do portu dostęp (CloseHandle).

1 użytkowników online, w tym zalogowanych: 0, gości: 1