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
Ovladani serioveho portu
Moderátor: Moderátoři
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;
}
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()).
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()).