Stránka 1 z 1
Ovladani serioveho portu
Napsal: 15 lis 2010, 23:16
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
Napsal: 15 lis 2010, 23:24
od rnbw
Zalezi od operacneho systemu.
Napsal: 15 lis 2010, 23:32
od nettle
Jasne zacal bych na windows ale vubec by me pozdeji linux nevadil )
Napsal: 15 lis 2010, 23:34
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.
Napsal: 15 lis 2010, 23:42
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
Napsal: 16 lis 2010, 00:16
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;
}
Napsal: 16 lis 2010, 14:41
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
Napsal: 16 lis 2010, 16:26
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()).