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;
}