Ovladani serioveho portu

Dotazy na technické problémy, vlastní řešení technických problémů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
nettle
Příspěvky: 4
Registrován: 15 lis 2010, 01:00

Ovladani serioveho portu

#1 Příspěvek od nettle »

Zdravim
Chtel bych si vyzkouset naprogramovat nejaky program co bude ovladat prenos po seriovem portu c jazyce C.
Ma nekdo s tim nejake zkusenosti popr. jake by doporucil materialy k nastudovani. Zejmena to jak se v C seriovy port ovlada.
Dekuji

Uživatelský avatar
rnbw
Příspěvky: 32312
Registrován: 21 bře 2006, 01:00
Bydliště: Bratislava

#2 Příspěvek od rnbw »

Zalezi od operacneho systemu.

Uživatelský avatar
nettle
Příspěvky: 4
Registrován: 15 lis 2010, 01:00

#3 Příspěvek od nettle »

Jasne zacal bych na windows ale vubec by me pozdeji linux nevadil )

Uživatelský avatar
mihal
Příspěvky: 1812
Registrován: 06 dub 2005, 02:00
Bydliště: Zilina

#4 Příspěvek od mihal »

Napr. ja pod win vo VB pouzivam Mscomm32.ocx, plne mi staci, v C budes mat lepsie moznosti, ale vzdy to bude sluzba OS.

Uživatelský avatar
nettle
Příspěvky: 4
Registrován: 15 lis 2010, 01:00

#5 Příspěvek od nettle »

No ja bych se rad dostal do stavu kdy dokazu napr ze sirioveho portu precist/zapsat data ale zatim vubec nevim jak na to ((. A byl bych rad kdybych mohl vyuzit jenom ovladace co sou ve winech

Uživatelský avatar
Zmije
Příspěvky: 1513
Registrován: 30 čer 2005, 02:00
Bydliště: Pardubický kraj

#6 Příspěvek od Zmije »

Možná tě nasměruje kód, který využívá winapi, více informací např. http://msdn.microsoft.com/cs-cz/default.aspx

Kód: Vybrat vše

#include <windows.h>

#include <stdio.h>



HANDLE m_hCom = 0;



void CloseCommunication() // ukoncuje komunikaci (asi se nemusi volat, windows to pri konci programu mozna zavrou)

{

	if(m_hCom) {

		CloseHandle(m_hCom);

		m_hCom = 0;

	}

}



unsigned char SetCommunication(const char *m_sComPort) // otevre komunikaci, parametr je jmeno portu ("Com1")

{

	if(m_hCom)

		CloseCommunication();

	// ...



	DCB m_dcb;

	COMMTIMEOUTS m_CommTimeouts;



	if(!(m_hCom = CreateFile(m_sComPort, GENERIC_READ | GENERIC_WRITE, 0,

	   NULL, OPEN_EXISTING, 0, NULL)))

		return 0;

	if(!SetupComm(m_hCom, 128, 128) || !GetCommState(m_hCom, &m_dcb)) {

		CloseCommunication();

		return 0;

	}

	// otevre com a nastavi i/o fronty



    m_dcb.BaudRate = 9600;

    m_dcb.ByteSize = 8;

    m_dcb.Parity = NOPARITY;

	m_dcb.StopBits = ONESTOPBIT;

	m_dcb.fAbortOnError = TRUE;

	if(!SetCommState(m_hCom, &m_dcb) ||

	   !GetCommTimeouts(m_hCom, &m_CommTimeouts)) {

		CloseCommunication();

		return 0;

	}

	// nastavi rychlost, pocet bitu, paritu a stop bit



	m_CommTimeouts.ReadIntervalTimeout = 50;

    m_CommTimeouts.ReadTotalTimeoutConstant = 50;

    m_CommTimeouts.ReadTotalTimeoutMultiplier = 10;

    m_CommTimeouts.WriteTotalTimeoutConstant = 50;

    m_CommTimeouts.WriteTotalTimeoutMultiplier = 10;

	if(!SetCommTimeouts(m_hCom, &m_CommTimeouts)) {

		CloseCommunication();

		return 0;

	}

	// nastavi timeouty (cas cekani na data)



	return 1;

}



int Transmit(unsigned char sBuffer) // vysle jeden bajt. funkce vraci -1 pri chybe, nebo pocet zapsanych bajtu (1)

{

	DWORD iBytesWritten;

	if(!WriteFile(m_hCom, &sBuffer, 1, &iBytesWritten, NULL))

		return -1;

	return iBytesWritten;

}



int Receive(unsigned char *sBuffer) // precte jeden bajt. funkce vraci -1 pri chybe, nebo pocet prectenych bajtu (1)

{

	DWORD iBytesRead;

	if(!ReadFile(m_hCom, sBuffer, 1, &iBytesRead, NULL))

		return -1;

	return iBytesRead;

}

Uživatelský avatar
nettle
Příspěvky: 4
Registrován: 15 lis 2010, 01:00

#7 Příspěvek od nettle »

Ok pokusim se nastudovat winapi, coz bude trochu na dyl nez sem cekal ale to se neda nic delat )
dekuji za priklad kodu

Uživatelský avatar
gombik
Příspěvky: 19
Registrován: 09 pro 2007, 01:00

#8 Příspěvek od gombik »

Dobrým zdrojem je taky příručka "Windows Serial Port Programming" viz:

http://www.robbayer.com/files/serial-win.pdf

Jinak pokud používáš jako IDE Visual Studio tak je potřeba vypnout UNICODE v opačném případě ti nepůjde výše uvedený kod zkompilovat(nebo používat ASCII verze funkci sufixem -A např. CreateFileA()).

Odpovědět

Zpět na „Poradna“