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, 00: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: 37416
Registrován: 21 bře 2006, 00: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, 00: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: 1844
Registrován: 06 dub 2005, 00: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, 00: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: 1691
Registrován: 30 čer 2005, 00: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, 00: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, 00: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“