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);
Blog com conteúdo sobre os projetos que tenho trabalhado: SEGURANÇA DA INFORMAÇÃO, VOIP COM ASTERISK, VIRTUALIZAÇÃO DE SERVIDORES VMWARE SERVER, ESX, EMAIL, FIREWALL, WEB-PROXIES, VPN, MIGRAÇÕES, LDAP, SAMBA, AD, ORACLE, MySQL, RADIUS, DHCP, DNS, PHP, C++, AUTENTICAÇÃO WIFI, CAPTIVEPORTAL, SATELITE, NETWORK...
Pesquisar neste blog
Assinar:
Postar comentários (Atom)
4 comentários:
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.
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.
Ala amigo,
Como no exemplo acima, vc tem que ter um programa com os comandos. Blz.
Que programa vc usa?
Grato,
Murilo.
Postar um comentário