Here is some code sample, but the issue is that the signal handler is not called when a 'break' is sent over the serial line with 'putty'.
#include <sys/ioctl.h>
#include <termios.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
void signal_handler(int status);
int main(void)
{
FILE* f = fopen("/dev/ttyS0", "r+b");
struct sigaction saio; /* definition of signal action */
saio.sa_handler = signal_handler;
// saio.sa_mask = 0;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGINT,&saio,NULL);
struct termios options;
tcgetattr (fileno(f), &options);
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);
options.c_iflag &= ~IGNBRK; // & ~IGNPAR;
options.c_iflag |= BRKINT; // | PARMRK | INPCK;
options.c_cc[VMIN] = 0;
options.c_cc[VTIME] = 1;
if (tcsetattr(fileno(f), TCSAFLUSH, &options) == -1)
{
printf("port setup failure\n");
return -1;
}
ioctl(fileno(f), TIOCSCTTY, (char *)NULL);
while (1) {
int ch = fgetc(f);
switch (ch) {
case EOF: break;
case EAGAIN: printf("[EAGAIN]"); break;
case EBADF: printf("[EBADF]"); break;
case EINTR: printf("[EINTR]"); break;
case EIO: printf("[EIO]"); break;
case EOVERFLOW: printf("[EOVERFLOW]"); break;
default:
if (isprint(ch))
putchar(ch);
else
printf("[%02x]", ch);
}
}
}
void signal_handler(int status)
{
printf("received SIGINT %d signal.\n", status);
exit(0);
}
Here are my stty settings:
user@dev:~/$ sudo stty -F /dev/ttyS0
speed 9600 baud; line = 0;
intr = <undef>; quit = <undef>; erase = <undef>; kill = <undef>; eof = <undef>; start = <undef>; stop = <undef>; susp = <undef>; rprnt = <undef>; werase = <undef>;
lnext = <undef>; flush = <undef>; min = 0; time = 1;
-imaxbel
-opost -onlcr
-icanon -iexten -echo -echoe -echok -echoctl -echoke
What am I missing / why do I not receive a signal? I'm using a USB-2-Serial converter and I can see that the break is sent over, but nothing is triggered at all on this client end.