Mitenköhän onnistuu?? Olisiko jossain hyvää opastusta aiheesta??
DOS vai Win. Dosissa sen voineen tehdä Porttien avulla (outport() ja inport()), jos muistan oikein. Windowsissa sen voineen tehdä Streamien avulla. En osaa C:llä, mutta Delphillä ja TurboPascalilla kyllä luonnistuisi. Yleensä C:n ohjelmoinnissa ja Pascalin ohjelmoinnissa ei ole suuria teknisiä eroja.
Windowsilla ois tarkotus. Jos ois valmista jotain pientä esimerkkiä niin vois sitä sitten yrittää sovittaa C++:aan.
Tällaisen ohjelman tekaisin joskus, kun tarvitsin lukea tietoa sarjaportista. Mikään tyylipuhdas ohjelma tuo ei ole, mutta ajoi asiansa. Siitä saanee kuitenkin jotain vinkkiä. Ohjelma on tehty Visual C++:lla. http://msdn.microsoft.com/ antaa lisätietoa.
#include <iostream>
#include <dos.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <io.h>
#include <windows.h>
#include<fstream>
using namespace std;
DCB dcb;
class tiedonsiirto
{
public:
bool avaa_portti();
bool datan_luku();
void datan_lahetys();
void datan_tallennus();
void porttivahti();
DWORD kirjoitettu_maara;
char luettu_data[1024];
bool kirjoitus_onnistui;
bool avaus_onnistui;
bool tallennus_onnistui;
bool tiedosto_avattu;
char sana[1024];
char data;
bool luku_onnistui;
DWORD luettu_maara;
DWORD KirjoitetutRivit;
HANDLE Sarjap;
int ind;
};
bool tiedonsiirto::avaa_portti()
{
Sarjap = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (Sarjap == INVALID_HANDLE_VALUE)
{
cout<<"Tiedostokahvan luonti ei onnistunut"<<endl;
avaus_onnistui=FALSE;
}
else
{
GetCommState(Sarjap,&dcb);
dcb.BaudRate = CBR_9600;
dcb.Parity = NOPARITY;
dcb.fOutX = TRUE;
dcb.ByteSize = 8;
dcb.StopBits=ONESTOPBIT;
SetCommState(Sarjap,&dcb);
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
CommTimeOuts.ReadTotalTimeoutMultiplier= 0 ;
CommTimeOuts.ReadTotalTimeoutConstant = 0 ;
CommTimeOuts.WriteTotalTimeoutMultiplier = 10;
CommTimeOuts.WriteTotalTimeoutConstant = 0 ;
avaus_onnistui=TRUE;
}
return avaus_onnistui;
}
void tiedonsiirto::datan_tallennus()
{
int avauslippu=ios_base::app;
ofstream Tiedosto("C:\\Temp\\tiedonsiirto.txt",avauslippu);
if (Tiedosto.is_open())
{
Tiedosto.write(&data,sizeof data);
}
else
{
cout<<endl<<"Tiedostoon kirjoittaminen ei onnistunut"<<endl;
}
Tiedosto.close();
}
void tiedonsiirto::datan_lahetys()
{
ind=0;
do
{
data=sana[ind];
kirjoitus_onnistui = WriteFile(Sarjap, &data,sizeof(data),&kirjoitettu_maara, NULL);
if(!kirjoitus_onnistui)
{
cout << "Kirjoitus com1-porttiin epäonnistui"<<endl;
break;
}
ind++;
}while (sana[ind]!='\0');
if(kirjoitus_onnistui) cout <<endl<< "Data kirjoitettiin porttiin COM1"<<endl;
}
bool tiedonsiirto::datan_luku()
{
while (1)
{
luku_onnistui = ReadFile(Sarjap, &data,sizeof(data),&luettu_maara, NULL);
if(!luku_onnistui) cout << "luku com1-portista epäonnistui"<<endl;
else if(luettu_maara != 0)
{
cout << "COM1 luettiin, data oli: " << data << endl;
datan_tallennus();
}
}
return luku_onnistui;
}
void main(void)
{
int valinta;
tiedonsiirto dataolio;
if(dataolio.avaa_portti())
{
do
{
cout<<endl<<"*******Päävalikko*******"<<endl;
cout<<"1. Datan lähetys"<<endl<<"2. Datan vastaanotto"<<endl<<"3. Datan lähetys ja vastaanotto"<<endl<<"4. Lopetus"<<endl;
cin>>valinta;
switch (valinta)
{
case 1:
cout<<"Anna jokin merkkijono"<<endl;
cin>>dataolio.sana;
dataolio.datan_lahetys();
dataolio.datan_tallennus();
break;
case 2:
dataolio.datan_luku();
break;
case 3:
cout<<"Anna jokin merkkijono"<<endl;
cin>>dataolio.sana;
dataolio.datan_lahetys();
dataolio.datan_luku();
break;
}
}while(valinta!=4);
}
CloseHandle(dataolio.Sarjap);
}Kiitoksia, auttoi jo alkuun. Nyt vaan pakertamaan esimerkin avulla oman sovelluksen pariin... :D
Aihe on jo aika vanha, joten et voi enää vastata siihen.