LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1057|回复: 0

串口多线程问题

[复制链接]
发表于 2007-3-21 17:49:35 | 显示全部楼层 |阅读模式
各位达人,我最近在学着写多线程,就是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脚我短接了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表