Ciao a tutti.
Per una piccola applicazione sto cercando di interfacciare qualche sample di OpenCV a dei servocomandi. Devo creare al momento uno script che mi invii sulla porta seriale del pc una sequenza di tre bytes secondo le specifiche dei controllori dei servocomandi. secondo il manuale (utilizzo un controller pololu) deco inviare dicevo 3 bytes di cui il primo deve essere sempre 255, il secondo indicante il numero del servocomando 0-3 , il terzo byte rappresenta la posizione da 0 a 255. la porta deve essere impostata a 2400 o 9600 bauds 8n1.
Ho trovato e cercato di adattare il seguente codice:
#include <windows.h>
int main(int argc, char* argv[])
{
// open port for I/O
HANDLE h = CreateFile("com5",
GENERIC_READ|GENERIC_WRITE,
0,NULL,
OPEN_EXISTING,0,NULL);
if(h == INVALID_HANDLE_VALUE) {
} else {
// set timeouts
COMMTIMEOUTS cto = {20000, 20000, 20000, 0, 0 };
DCB dcb;
if(!SetCommTimeouts(h,&cto))
// set DCB
memset(&dcb,0,sizeof(dcb));
dcb.DCBlength = sizeof(dcb);
dcb.BaudRate = 9600;
dcb.fBinary = 1;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
// dcb.fOutxCtsFlow = 1;
// dcb.fRtsControl = DTR_CONTROL_HANDSHAKE;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.ByteSize = 8;
if(!SetCommState(h,&dcb))
DWORD read = 1;
DWORD write= 1; // Number of bytes to write to serial port
char buf[3];
buf[0] = 255; // Decmial value to write to serial port
buf[1] = 0 ;
buf[2] = 0 ;
//char Stringa[3] = {'0xff','0x00','0x00'};
WriteFile(h,buf,write,&write,NULL); // write is updated with the number of bytes written
//CloseHandle(h);
}
return 0;
}
purtroppo ho dei malfunzionamenti del genere:
dovendo mandare 3 bytes dovrei scrivere DWORD write= 3; ma se lo faccio il controller mi segnala un errore irreversibile e devo resettarlo
settato ad 1 il controller non rileva malfunzioamenti ma secondo me rileva solo il primo byte e i 3 servocomandi che utulizzo si posizionano al centro....
qualcuno puo darmi una mano ad inviare quasta benedetta sequenza?
Grazie