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()).