|
各位达人,我最近在学着写多线程,就是2个线程,串口通信一个发,一个收,由pthread_mutex_t阻塞,以达到轮流执行,问题就是,写了数据后就读不到数据了,是不是因为线程没有结束,send的线程占用的串口资源没有释放,造成读不到数据。如果是的话,能不能给想个办法,多谢!!
代码如下!!
#include <pthread.h>
#include <termios.h>
#include <stdio.h>
#include <sys/select.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/time.h>
#define BAUDRATE B9600
#define COM1 "/dev/ttyS0"
#define ENDMINITERM 27 /* ESC to quit miniterm */
#define FALSE 0
#define TRUE 1
volatile int STOP=FALSE;
volatile int fd;
pthread_mutex_t mut;
struct timespec delay;
void child_handler(int s)
{
printf("stop!!!\n");
STOP=TRUE;
}
/*--------------------------------------------------------*/
void* keyboard(void * data)
{
int c;
for ( ; ; )
{
c=getchar();
if( c== ENDMINITERM){
STOP=TRUE;
break ;
}
}
return NULL;
}
/*--------------------------------------------------------*/
/*--------------------------------------------------------*/
void *send(void *data)
{ int retvalp;
unsigned char c = 200 ,cc;
for(cc=0 ; cc < 5 ; cc++)
{pthread_mutex_lock(&mut);
if ( (retvalp =write (fd ,&c ,1) ) == -1)
printf("write the data erro\n");
else printf ("write the data %d \n" ,c);
c++;
pthread_mutex_unlock(&mut);
usleep(1000000);
}
return NULL; /* wait for child to die or it will become a zombie */
}
/*--------------------------------------------------------*/
/* modem input handler */
void *receive(void *data)
{
unsigned char c ,cci;
int retvalp;
struct timeval tv_timeout;
static fd_set fs_read;
FD_ZERO (&fs_read);
FD_SET (fd, &fs_read);
tv_timeout.tv_sec = 1;
tv_timeout.tv_usec = 0;
printf("read!!!!read!!!\n");
for (c=0 ; c<5 ; c++)
{printf("read!!!!\n");
pthread_mutex_lock(&mut);
retvalp = select (fd + 1, &fs_read, NULL, NULL, &tv_timeout);
printf("out out!!");
if ( retvalp && FD_ISSET(fd,&fs_read) )
{
printf("out out in in!!");
if ( (retvalp = read (fd ,&cci , 1)) == -1)
printf ("read the data erro\n");
else printf("read the data %d\n" ,cci );
}else printf("tooooooooo");
pthread_mutex_unlock(&mut);
sleep(1);
}
return NULL;
}
/*--------------------------------------------------------*/
main()
{
if( (fd = open(COM1, O_RDWR | O_NOCTTY |O_NONBLOCK ) ) <0 )
printf("device open faild!!!");
else printf("device is opened now\n");
struct termios termios_new;
struct sigaction sa;
pthread_t th_a, th_b, th_c;
void * retval;
pthread_mutex_init(&mut,NULL);
delay.tv_sec = 1;
delay.tv_nsec = 0;
cfsetispeed(&termios_new, B9600);
cfsetospeed(&termios_new, B9600);
termios_new.c_cflag |= CLOCAL | CREAD;
termios_new.c_cflag &= ~CSIZE;
termios_new.c_cflag |= CS8;
termios_new.c_cflag &= ~PARENB;
termios_new.c_iflag &= ~INPCK;
termios_new.c_cflag &= ~CSTOPB;
termios_new.c_oflag = 0;
termios_new.c_lflag &=~ ( ICANON | ECHO | ECHOE | ISIG); /*RAW only termios_new.c_lflag|= 0;*/
termios_new.c_oflag &= ~OPOST; /*RAW*/
termios_new.c_cc[VTIME] = 1; /* unit: 1/10 second. */
termios_new.c_cc[VMIN] = 1; /* minimal characters for reading */
tcflush (fd, TCIFLUSH);
tcsetattr (fd, TCSANOW, &termios_new);
sa.sa_handler = child_handler;
sa.sa_flags = 0;
sigaction(SIGCHLD,&sa,NULL); /* handle dying child */
pthread_create(&th_a, NULL, keyboard, 0);
pthread_create(&th_c, NULL, send, 0);
pthread_create(&th_c, NULL, receive, 0);
pthread_join(th_a, &retval);
pthread_join(th_c, &retval);
pthread_join(th_b, &retval);
close(fd);
exit(0);
}
注:串口的2,3脚我短接了。 |
|