serielle schnittstelle: abfragen von CTS in thread



  • hallo,

    ich habe ein programm mit posix-threads geschrieben in dem ich unter anderem ein display an der seriellen schnittstelle ansteuere. daten kann ich aber nur senden wenn CTS=1 ist.

    #ifdef HAVE_CONFIG_H
    #include <config.h>
    #endif
    
    # include <stdio.h>
    # include <unistd.h>
    # include <fcntl.h>
    # include <sys/ioctl.h>
    # include <linux/serial.h>
    # include <linux/serial_reg.h>
    
    # if defined __GLIBC__
    #   include <sys/io.h>
    # else
    #   include <asm/io.h>
    # endif
    
    #include "define.h"
    #include "conf.h"
    #include "log.h"
    
    static int eakit_cts_fd  = -1;
    static int eakit_cts_adr = 0;
    
    int eakit_cts_init_flag   = FALSE;
    int eakit_cts_deinit_flag = FALSE;
    int eakit_cts_ready       = FALSE;
    
    /**
     * init
     *
     */
    int eakit_cts_init(void)
    {
    	struct serial_struct serial_port;
    
    	log_printf(LOG_DEBUG, "eakit_cts_init(): initializing\n");
    
    	if ((eakit_cts_fd = open(config_getstr(EAKIT_DEVICE_STR, EAKIT_DEVICE), O_RDONLY)) == -1)  {
    		log_printf(LOG_ERROR, "eakit_cts_init(): unable to open device '%s'\n", config_getstr(EAKIT_DEVICE_STR, EAKIT_DEVICE));
    
    		return FALSE;
    	}
    
    	if (ioctl(eakit_cts_fd, TIOCGSERIAL, &serial_port) == -1) {
    		log_printf(LOG_ERROR, "eakit_cts_init(): ioctl() failed\n");
    
    		return FALSE;
    	}
    
    	eakit_cts_adr = serial_port.port;
    
    	log_printf(LOG_VERBOSE, "eakit_cts_init(): device:\t%s (COM%d)\tPort:\t0x%x\tIRQ:\t%d\n", config_getstr(EAKIT_DEVICE_STR, EAKIT_DEVICE), serial_port.line +1, serial_port.port, serial_port.irq);
    
    	// set permissions
    	ioperm(eakit_cts_adr + UART_MSR, 1, 1);
    
    	eakit_cts_init_flag = TRUE;
    
    	// das hier funktioniert
    	eakit_cts_poll();
    
    	return TRUE;
    }
    
    /**
     * deinit
     *
     */
    int eakit_cts_deinit(void)
    {
    	log_printf(LOG_DEBUG, "eakit_cts_deinit(): deinitializing\n");
    
    	ioperm(eakit_cts_adr + UART_MSR, 1, 0);
    	close(eakit_cts_fd);
    
    	eakit_cts_init_flag = TRUE;
    
    	return TRUE;
    }
    
    /**
     * poll
     *
     */
    void eakit_cts_poll(void)
    {
    	int msr = 0;
    
    	// hier kassiere ich einen seg-fault
    	msr = inb(eakit_cts_adr + UART_MSR);
    	eakit_cts_ready = (msr & UART_MSR_CTS) ? TRUE : FALSE;
    
    	printf("cts = %d\n", eakit_cts_ready);
    }
    

    hier ein auszug aus dem hauptprogramm:

    // init cts-check
    	if(eakit_cts_init() == FALSE) {
    		log_printf(LOG_ERROR, "eakit_cts_init(): failed!\n");
    		exit(0);
    	}
    
    	// poll cts-line
    	if(pthread_create(&pt_cts, NULL, (void *)&main_thread_cts, NULL) != 0) {
    		log_printf(LOG_ERROR, "error creating thread: cts!\n");
    		exit(0);
    	}
    

    und hier die funktion für den thread

    void main_thread_cts(void)
    {
    	sigset_t mask;
    
    	log_printf(LOG_DEBUG, "main_thread_cts(): started thread with id %ld\n", pthread_self());
    
    	// ignore signals
    	sigemptyset(&mask);
    	sigaddset(&mask, SIGINT);
    	sigaddset(&mask, SIGTERM);
    	sigaddset(&mask, SIGHUP);
    
    	if((pthread_sigmask(SIG_BLOCK, &mask, NULL)) != 0) {
    		log_printf(LOG_ERROR, "main_thread_cts(): error creating signal-mask\n");
    		return;
    	}
    
    	// loop
    	while(terminate == FALSE) {
    		eakit_cts_poll();
    
    		usleep(5000);
    	}
    
    	log_printf(LOG_NOISYDEBUG, "main_thread_cts(): thread %ld shutting down\n", pthread_self());
    
    	// exit;
    	pthread_exit((void *)0);
    }
    

    das problem: rufe ich die funktion eakit_cts_poll() in dem thread auf, kassiere ich einen seg-fault, rufe ich die funktion oben in der init-funktion auf, funktioniert das ganze *planlos*

    hoffe mir kann jemand auf die sprünge helfen


Anmelden zum Antworten