Interface TV Samsung EX-link

De MicElectroLinGenMet.

Sommaire

Description

Interface série des téléviseurs Samsung permettant de les commander.

Attention, il y a une erreur dans le calcul de checksum de l'exemple donné => 0X08 0X22 0X0B 0x02 0x00 0x5A 0x6F




Shéma du cablâge

(Source: Domogik)

Fichier:ex_link_cablage.png



Vue de l'interface "Service" sur prise type "Jack stéréo"

Prise série "SERVICE" sur TV Samsung


Simple programme C de test

freevo@hestia:~$ bin/samsung_exlink/setsamsungtv_sourcehdmi1 
Set TV ...
08 22 0a 00 05 00 c7 
03 0c f1 
Commande Ok.
Terminé
freevo@hestia:~$ bin/samsung_exlink/setsamsungtv_sourcetv 
Set TV ...
08 22 0a 00 00 00 cc 
03 0c f1 
Commande Ok.
Terminé


// setsamsungtv
 
/*
- 11/11/2010
Envoie une commande sur port série (service port) de la TV Samsung.
Testé OK ave câble RS232/Jack relié sur USB/Série.
 
*/
 
 
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
#include <string.h>
#include <errno.h>
#include <sys/fcntl.h>
 
#define DEBUG 
 
// Paramètres série.
#define SERIALPORT "/dev/ttyUSB0"
#define BAUDRATE B9600
 
// Déclaration pour le port série.
int fdserial ;
 
/*------------------------------------------------------------------------------*/
/* Init port rs232								*/
/*------------------------------------------------------------------------------*/
int initserie(void)
// Mode Non-Canonical Input Processing, Attend 1 caractère ou time-out(avec VMIN et VTIME).
{
	int device ;
	struct termios  termiostv ;
 
        // Ouverture de la liaison serie (Nouvelle version de config.)
        if ( (device=open(SERIALPORT, O_RDWR | O_NOCTTY)) == -1 ) 
	{
		fprintf(stderr, "Erreur ouverture du port serie %s: %s !\n", SERIALPORT, strerror(errno));
                exit(1) ;
        }
 
        tcgetattr(device,&termiostv) ;				// Lecture des parametres courants.
 
	cfsetispeed(&termiostv, BAUDRATE) ;			// Configure le débit en entrée/sortie.
	cfsetospeed(&termiostv, BAUDRATE) ;
 
	termiostv.c_cflag |= (CLOCAL | CREAD) ;			// Active réception et mode local.
 
	termiostv.c_cflag &= ~PARENB ;				// Active 8 bits de donnees sans parite.
	termiostv.c_cflag &= ~CSTOPB ;
	termiostv.c_cflag &= ~CSIZE;
	termiostv.c_cflag |= CS8 ;
 
	termiostv.c_cflag &= ~CRTSCTS ;			// Désactive control de flux matériel.
 
	termiostv.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ;	// Mode non-canonique (mode raw) sans echo.
 
	termiostv.c_iflag &= ~(IXON | IXOFF | IXANY | ICRNL) ;	// Désactive control de flux logiciel, désactive conversion 0xOD en 0x0A.
 
	termiostv.c_oflag &= ~OPOST ;				// Pas de mode de sortie particulier (mode raw).
 
	termiostv.c_cc[VTIME] = 10 ;  				// time-out à ~1s.
	termiostv.c_cc[VMIN]  = 0 ;   				// 1 car. attendu.
 
	tcflush(device, TCIFLUSH) ;				// Efface les données reçues mais non lues.
        tcsetattr(device,TCSANOW,&termiostv) ;			// Sauvegarde des nouveaux parametres
	return device ;
}
 
/*-------------------------------------------------------------------------------*/
/* Affiche chaine en hexa.							 */
/*-------------------------------------------------------------------------------*/
void printhexstr(char *chaine, int longueur)
{
	int i ;
	for (i=0; i<longueur ;i++)  printf("%02x ", (unsigned char) chaine[i]);
	printf("\n");
}
 
/*---------------------------------------------------------------------------------------*/
/* Checksum	(2 complement of the sum of the 6 previous byte + 1)       		 */
/*---------------------------------------------------------------------------------------*/
void addchecksum(char *cmd) 
{
        unsigned char checksum ;
	checksum = ~((cmd[0] + cmd[1] + cmd[2] + cmd[3] + cmd[4] + cmd[5])) + 1 ;
        cmd[6]=checksum ;
#ifdef DEBUG
	printhexstr(cmd, 7) ;
#endif
}
 
 
/*--------------------------------------------------------------------------------*/
/* SendCommand	Send command to TV's service port      				  */
/*--------------------------------------------------------------------------------*/
void SendCommand(char *cmd) 
{
	int	i ;
	int	res ;
	char 	buff[1] ;
	char 	ack[3] ;
 
	tcflush(fdserial, TCIFLUSH) ;			// Efface les données reçues mais non lues.	
	tcflush(fdserial, TCOFLUSH) ;			// Flushes written but not transmitted.
	write(fdserial, cmd, 7) ;
        for(i=0; i<3 ;i++) 
        {
                res = read(fdserial, buff, 1) ;          // READ attend 1 car. pendant time-out.
                if (! res)
                {
                        printf("Pas de réception de la TV !\n");
                	close(fdserial) ;
                	exit(1) ;
                }
                ack[i] = buff[0] ;
        }
 
#ifdef DEBUG
	printhexstr(ack, 3) ;
#endif
 
	if ( ack[2] == 0xFF )				// "0x03 0x0C 0xFF" si FAILED sinon "0x03 0x0C 0xF1" si OK.
        {
                printf("Erreur dans la commande ! !\n");
                close(fdserial) ;
                exit(1) ;
        }
	else printf("Commande Ok.\n") ;
}
 
/*------------------------------------------------------------------------------*/
/*---------------------------------- MAIN --------------------------------------*/
/*------------------------------------------------------------------------------*/
int main(void)
{
 
	printf("Set TV ...\n") ;
 
	fdserial = initserie() ;
	//clearrxbuff(fdserial) ;
	tcflush(fdserial, TCIFLUSH) ;				// Efface les données reçues mais non lues.
 
	//memset(cmd, '\0', sizeof(cmd)) ;
	//char cmd[] = "\x08\x22\x01\x00\x02\x00\xFF" ;		// Cmd: "Volume down"
	//char cmd[] = "\x08\x22\x01\x00\x01\x00\xFF" ;		// Cmd: "Volume up"
	char cmd[] = "\x08\x22\x01\x00\x00\x05\xFF" ;		// Cmd: "Volume à 5/100"
	//char cmd[] = "\x08\x22\x02\x00\x00\x00\xFF" ;		// Cmd: "Volume Mute"
	//char cmd[] = "\x08\x22\x0b\x02\x00\x5a\xFF" ;		// Cmd: "Contraste à 90/100"
	//char cmd[] = "\x08\x22\x0b\x03\x00\x32\xFF" ;		// Cmd: "Lumière à 50/100"
	//char cmd[] = "\x08\x22\x0a\x00\x05\x00\xFF" ;		// Cmd: "Source HDMI1"
	//char cmd[] = "\x08\x22\x0a\x00\x05\x01\xFF" ;		// Cmd: "Source HDMI2"
	//char cmd[] = "\x08\x22\x0a\x00\x05\x02\xFF" ;		// Cmd: "Source HDMI3/DVI"
	//char cmd[] = "\x08\x22\x0a\x00\x00\x00\xFF" ;		// Cmd: "Source TV"
	//char cmd[] = "\x08\x22\x04\x01\x00\x02\xFF" ;		// Cmd: "Chaine 2 sur TNT"
	//char cmd[] = "\x08\x22\x04\x00\x00\x02\xFF" ;		// Cmd: "Chaine 2 sur Analogique"
	//char cmd[] = "\x08\x22\x00\x00\x00\x02\xFF" ;		// Cmd: "Power ON"
	//char cmd[] = "\x08\x22\x00\x00\x00\x01\xFF" ;		// Cmd: "Power OFF"
 
	addchecksum(cmd) ; 
	SendCommand(cmd) ; 					// Envoie commande à la TV.
 
        /* Fermeture */
        close(fdserial);
 
	printf("Terminé\n");
 
        /* Bye... */
        exit(0);
}



30/11/2010