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