K
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