Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Andule 14. 04. 2010, 15:45:12

Název: Jak komunikovat s robotem přes seriový port
Přispěvatel: Andule 14. 04. 2010, 15:45:12
Píšu program na robota se systemem SOS-AT. Tento program by měl pracovat tak, že na stisk klávesy bude vykonán určitý pohyb robota. Bohužel jsem se zasekla už na té komunikaci pro seriový port přes který je ten robot napojen. Píšu to v jazyce C pod windowsem. byl by prosím někdo tak hodný a poradil mi?
Název: Re: Jak komunikovat s robotem přes seriový port
Přispěvatel: nhx 14. 04. 2010, 16:53:31
Kód: [Vybrat]
FILE* fp = fopen("com1:", "w+");
...
fputs("prikaz pro robota", fp);

Tohle nestaci?
Název: Re: Jak komunikovat s robotem přes seriový port
Přispěvatel: nhx 14. 04. 2010, 17:01:04
Tak jsem kouknul do manualu od toho bastlu a zrejme bude port vhodne otevrit v binarnim modu a zapisovat do nej fwrite(), takze treba takhle:
Kód: [Vybrat]
unsigned char cmd[3];
FILE* com;
...
com = fopen("com1:", "wb+");
cmd[0] = 0xFF; /* synchronizace */
cmd[1] = 0x01; /* cislo serva */
cmd[2] = 0xAA; /* pozice */

fwrite (cmd , 1 , sizeof(cmd) , com);
Název: Re: Jak komunikovat s robotem přes seriový port
Přispěvatel: nhx 14. 04. 2010, 17:21:49
Ackoliv, je-li treba z programu nastavit prenosovou rychlost, paritu apod., je treba otevrit seriovy port pomoci CreateFile(), parametry nastavit fci SetCommState() a zapis provadet WriteFile().
Název: Re: Jak komunikovat s robotem přes seriový port
Přispěvatel: Andule 14. 04. 2010, 18:14:20
Děkuji mnohokrát za odpovědi, jdu se na to vrhnout, snad se už zadaří
Název: Re: Jak komunikovat s robotem přes seriový port
Přispěvatel: Andule 21. 04. 2010, 17:39:06
tak jsem vytvořila toto, zatim bez posílání, ale ted mám porblém, že mi to nidke nejde zkompiovat, takže to dělám asi blbě.. Jako základy programování krapet mám, ale nevim, jestli to otveřiát jako windows application nebo console application a jetsli mi na to stačí codeblock?

#include <windows.h>

int main()

HANDLE hSerial;
hSerial=CreateFile("COM4",
               GENERIC_READ | GENERIC_WRITE, //MOZNA POSTACI JEN WRITE, KDYZ NECHCEME CIST
               0,
               0,
               OPEN_EXISTING,
               FILE-ATRIBUTE_NORMAL,
               0);

if (hSerial=INVALID_HANDLE_VALUE){
   if (GetLastError()==ERROR_FILE_NOT_FOUND){
      //Serial port does nost exost. Inform user.
   }
   //Some other error ocurred. Inform user.
}

DCB dcbSerialParams={0};
dcbSerial.DCBlenght=sizeof(dcbSerialParams);
if (!GetCommState(hSerial,&dcbSerialParams)){
   //error getting state
}
dcbSerialParams.BaudRate=CBR_9600;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialparams.Parity=NOPARITY;

/*if (!SetCommState(hSerial;&dcbSerialParams)){
   //error setting serial port state
}

COMMTIMEOUTS timeouts={0}; //casy v milisekundach
timeouts.ReadInternalTiomeout=50;
timeouts.ReadTotalTimeoutMultiplier=10;
timeouts.WriteTotalTimeoutConstant=50;
timeoutes.WriteTotalTimeoutMultiplier=10;
if (!SetCommTimeouts(hSerial;&timeouts)){
   //error ocureed. Inform user.
} */

char szBuff[4]={0}; // n+1
DWOR dwBytesWrite=0;

if (!WriteFile(hSerial,szBuff, 3, &dwBytesWrite, NULL)){
   //error ocurres. Report to user.
}

CloseHandle(hSerial);
return 0;
}
Název: Re: Jak komunikovat s robotem přes seriový port
Přispěvatel: nhx 22. 04. 2010, 20:57:25
Mas tam zejmena hromadu preklepu.

Kód: [Vybrat]

#include <windows.h>

int main()
{
  HANDLE hSerial;
  hSerial=CreateFile("COM1:",
                 GENERIC_READ | GENERIC_WRITE, //MOZNA POSTACI JEN WRITE, KDYZ NECHCEME CIST
                 0,
                 0,
                 OPEN_EXISTING,
                 FILE_ATTRIBUTE_NORMAL,
                 0);
 
  if (hSerial==INVALID_HANDLE_VALUE){
     if (GetLastError()==ERROR_FILE_NOT_FOUND){
        //Serial port does nost exost. Inform user.
     }
     //Some other error ocurred. Inform user.
  }
 
  DCB dcbSerialParams={0};
  dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
  if (!GetCommState(hSerial,&dcbSerialParams)){
     //error getting state
  }
  dcbSerialParams.BaudRate=CBR_9600;
  dcbSerialParams.ByteSize=8;
  dcbSerialParams.StopBits=ONESTOPBIT;
  dcbSerialParams.Parity=NOPARITY;
 
  if (!SetCommState(hSerial, &dcbSerialParams)){
     //error setting serial port state
  }
 
  /*
  COMMTIMEOUTS timeouts={0}; //casy v milisekundach
  timeouts.ReadInternalTiomeout=50;
  timeouts.ReadTotalTimeoutMultiplier=10;
  timeouts.WriteTotalTimeoutConstant=50;
  timeoutes.WriteTotalTimeoutMultiplier=10;
  if (!SetCommTimeouts(hSerial;&timeouts)){
     //error ocureed. Inform user.
  } */
 
  char szBuff[4]={0}; // n+1
  DWORD dwBytesWrite=0;
 
  if (!WriteFile(hSerial,szBuff, 3, &dwBytesWrite, NULL)){
     //error ocurres. Report to user.
  } else
  {

  }
 
  CloseHandle(hSerial);
  return 0;
}

Pod gcc to "opravene" zkompilovat jde bez problemu.
Název: Re: Jak komunikovat s robotem přes seriový port
Přispěvatel: nhx 22. 04. 2010, 21:06:10
Jinak doporucuju se nezatezovat s nejakym IDE (Code::Blocks), ktery te zrejme akorat mate a pouze stahnout MinGW (opensource sada kompilatoru, pridruzenych utilit, knihoven a headeru pro vyvoj aplikaci pod Windows) a zdrojaky psat v nejakym jednoduchym textovym editoru - postaci i notepad, ale spis neco, co umi alespon auto-indent (treba PSPad).

Pro preklad tohodle zdrojaku (pokud si ho pojmenujes robot.cpp) pak staci v konzoli napsat
Kód: [Vybrat]
gcc robot.cpp -o robot.exe