Jak komunikovat s robotem přes seriový port

Andule

Jak komunikovat s robotem přes seriový port
« kdy: 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?


nhx

Re: Jak komunikovat s robotem přes seriový port
« Odpověď #1 kdy: 14. 04. 2010, 16:53:31 »
Kód: [Vybrat]
FILE* fp = fopen("com1:", "w+");
...
fputs("prikaz pro robota", fp);

Tohle nestaci?

nhx

Re: Jak komunikovat s robotem přes seriový port
« Odpověď #2 kdy: 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);

nhx

Re: Jak komunikovat s robotem přes seriový port
« Odpověď #3 kdy: 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().

Andule

Re: Jak komunikovat s robotem přes seriový port
« Odpověď #4 kdy: 14. 04. 2010, 18:14:20 »
Děkuji mnohokrát za odpovědi, jdu se na to vrhnout, snad se už zadaří


Andule

Re: Jak komunikovat s robotem přes seriový port
« Odpověď #5 kdy: 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;
}

nhx

Re: Jak komunikovat s robotem přes seriový port
« Odpověď #6 kdy: 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.

nhx

Re: Jak komunikovat s robotem přes seriový port
« Odpověď #7 kdy: 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