Pesquisar neste blog

quarta-feira, 7 de março de 2012

Comunicação Serial RS232 - Monitor Samsung 400MX

Olá pessoal,
para quem usa o sistema de digital signage e deseja fazer a automação/programação para ligar e desligar os monitores conectados aos mini-pcs via porta serial rs232. Esse mesmo código abaixo pode ser usado para outros tipos de Monitores, basta verificar nos manuais quais são os comandos, no meu caso o monitor aceita comandos pré-definidos pelo manual, esses comandos são em hexadecimais.


#include iostream
#include conio.h
#include stdio.h
#include time.h
#include windows.h
#include string.h
#include serial.h

// Flow control flags

#define FC_DTRDSR 0x01
#define FC_RTSCTS 0x02
#define FC_XONXOFF 0x04

// ascii definitions

#define ASCII_BEL 0x07
#define ASCII_BS 0x08
#define ASCII_LF 0x0A
#define ASCII_CR 0x0D
#define ASCII_XON 0x11
#define ASCII_XOFF 0x13

HANDLE* ptr;

using namespace std;
// variables used with the com port
BOOL bPortReady;
DCB dcb;
COMMTIMEOUTS CommTimeouts;
BOOL bWriteRC;
BOOL bReadRC;
DWORD iBytesWritten;
DWORD iBytesRead;

HANDLE SerialInit(char *ComPortName, int BaudRate)
{
char status;
DWORD dwStoredFlags;

HANDLE hCom;

hCom = CreateFile(ComPortName,
GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security
OPEN_EXISTING,
0, // no overlapped I/O
NULL); // null template

if (hCom == INVALID_HANDLE_VALUE)
{
printf ("CreateFile failed with error %d.\n", GetLastError());
printf("Can not open %s!!\n\n",ComPortName);
system("pause");
exit(1);
} else {
status = 1;
}

dwStoredFlags = EV_BREAK | EV_CTS | EV_DSR | EV_ERR | EV_RING |\
EV_RLSD | EV_RXCHAR | EV_RXFLAG | EV_TXEMPTY ;
if (!SetCommMask(hCom, dwStoredFlags))
printf("Can not open %s!!\n\n",ComPortName);

bPortReady = SetupComm(hCom, 2, 128); // set buffer sizes


if (bPortReady = GetCommState(hCom, &dcb))
{
dcb.BaudRate = BaudRate;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.fAbortOnError = TRUE;

// set XON/XOFF
dcb.fOutX = FALSE; // XON/XOFF off for transmit
dcb.fInX = FALSE; // XON/XOFF off for receive
// set RTSCTS
dcb.fOutxCtsFlow = FALSE; // turn on CTS flow control
dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; //
// set DSRDTR
dcb.fOutxDsrFlow = FALSE; // turn on DSR flow control
//dcb.fDtrControl = DTR_CONTROL_ENABLE; //
dcb.fDtrControl = DTR_CONTROL_DISABLE; //
// dcb.fDtrControl = DTR_CONTROL_HANDSHAKE; //
} else {
printf("Erro de parametrizacao!!\n\n");
}

bPortReady = SetCommState(hCom, &dcb);

// Communication timeouts are optional

bPortReady = GetCommTimeouts (hCom, &CommTimeouts);

CommTimeouts.ReadIntervalTimeout = 5000;
CommTimeouts.ReadTotalTimeoutConstant = 5000;
CommTimeouts.ReadTotalTimeoutMultiplier = 1000;
CommTimeouts.WriteTotalTimeoutConstant = 5000;
CommTimeouts.WriteTotalTimeoutMultiplier = 1000;

bPortReady = SetCommTimeouts (hCom, &CommTimeouts);

if (status == 1){
printf("Comunicacao com a porta %s: Ok\n",ComPortName);
}

return hCom;
}

char SerialGetc(HANDLE *hCom)
{
char rxchar;
BOOL bReadRC;
static DWORD iBytesRead;

bReadRC = ReadFile(*hCom, &rxchar, 1, &iBytesRead, NULL);

return rxchar;
}

void SerialPutc(HANDLE *hCom, char txchar)
{
BOOL bWriteRC;
static DWORD iBytesWritten;
bWriteRC = WriteFile(*hCom, &txchar, 1, &iBytesWritten,NULL);
return;
}

char* SerialGets(HANDLE *hCom)
{
static char rxstring[256];
char c;
int pos = 0;

while(pos <= 255) { c = SerialGetc(hCom); if(c == '\r') continue; // discard carriage return rxstring[pos++] = c; if(c == '\n') break; } rxstring[pos] = 0; return rxstring; } void SerialPuts(HANDLE *hCom, char *txstring) { BOOL bWriteRC; static DWORD iBytesWritten; bWriteRC = WriteFile(*hCom, txstring, strlen(txstring), &iBytesWritten,NULL); } void sleep( int _wait) { clock_t goal; goal = clock() + _wait; while( goal > clock() );
}

int desliga(HANDLE *hCom)
{
if(!WriteFile(*hCom,"\xAA",1,&iBytesWritten,NULL)) printf("Erro ao enviar comando.\n");
if(!WriteFile(*hCom,"\x11",1,&iBytesWritten,NULL)) printf("Erro ao enviar comando.\n");
if(!WriteFile(*hCom,"\xFE",1,&iBytesWritten,NULL)) printf("Erro ao enviar comando.\n");
if(!WriteFile(*hCom,"\x01",1,&iBytesWritten,NULL)) printf("Erro ao enviar comando.\n");
if(!WriteFile(*hCom,"\x00",1,&iBytesWritten,NULL)) printf("Erro ao enviar comando.\n");
if(!WriteFile(*hCom,"\x10",1,&iBytesWritten,NULL)) printf("Erro ao enviar comando.\n");
}

int liga(HANDLE *hCom)
{
if(!WriteFile(*hCom,"\xAA",1,&iBytesWritten,NULL)) printf("Erro ao enviar comando.\n");
if(!WriteFile(*hCom,"\x11",1,&iBytesWritten,NULL)) printf("Erro ao enviar comando.\n");
if(!WriteFile(*hCom,"\xFE",1,&iBytesWritten,NULL)) printf("Erro ao enviar comando.\n");
if(!WriteFile(*hCom,"\x01",1,&iBytesWritten,NULL)) printf("Erro ao enviar comando.\n");
if(!WriteFile(*hCom,"\x01",1,&iBytesWritten,NULL)) printf("Erro ao enviar comando.\n");
if(!WriteFile(*hCom,"\x11",1,&iBytesWritten,NULL)) printf("Erro ao enviar comando.\n");
}



int main(int argc, char *argv[])
{
int op = atoi(argv[1]);

HANDLE my=SerialInit("com2",9600);


switch (op) {
case 1:
liga(&my);
break;
case 0:
desliga(&my);
break;
}

liga(&my);
//Fecha porta serial
printf(" %c ",SerialGetc(&my));
CloseHandle(&my);
return 0;
system("pause");
}



Arquivo Serial.h

// Flow control flags

#define FC_DTRDSR 0x01
#define FC_RTSCTS 0x02
#define FC_XONXOFF 0x04

// ascii definitions
#include stdio.h
#include time.h
#include string.h

#define ASCII_BEL 0x07
#define ASCII_BS 0x08
#define ASCII_LF 0x0A
#define ASCII_CR 0x0D
#define ASCII_XON 0x11
#define ASCII_XOFF 0x13


HANDLE SerialInit(char*, int);

char SerialGetc(HANDLE*);

void SerialPutc(HANDLE*, char);

char* SerialGets(HANDLE*);

void SerialPuts(HANDLE*, char*);

void sleep(int);

4 comentários:

Murilo Fernandes disse...

Amigo, sou leigo no assunto. Como faço para enviar o sinal para a TV? Sei que devo utilizar um cabo do tipo RS232, mas devo usar uma aplicação no PC?

Grato,
Murilo.

Murilo Fernandes disse...

Amigo, sou leigo no assunto. Como faço para enviar o sinal para a TV? Sei que devo utilizar um cabo do tipo RS232, mas devo usar uma aplicação no PC?

Grato,
Murilo.

Marcos Abadi disse...

Ala amigo,
Como no exemplo acima, vc tem que ter um programa com os comandos. Blz.

Murilo Fernandes disse...

Que programa vc usa?

Grato,
Murilo.