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.