Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: COM-porttien ohjaus C++:lla

Danne [12.05.2004 17:34:36]

#

Mitenköhän onnistuu?? Olisiko jossain hyvää opastusta aiheesta??

peran [15.05.2004 18:10:35]

#

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.

Danne [26.05.2004 13:06:13]

#

Windowsilla ois tarkotus. Jos ois valmista jotain pientä esimerkkiä niin vois sitä sitten yrittää sovittaa C++:aan.

Meca [26.05.2004 16:15:39]

#

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

Danne [27.05.2004 14:46:47]

#

Kiitoksia, auttoi jo alkuun. Nyt vaan pakertamaan esimerkin avulla oman sovelluksen pariin... :D

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta