Quantcast
Channel: Active questions tagged gcc - Stack Overflow
Viewing all articles
Browse latest Browse all 22016

Cannot read from /dev/parport by timeout

$
0
0

Please help with a question.
I'm trying to resolve programm example for parport loopback wtire/read.
While reading program skip first 6 symbols due to select timeoutand I can't understand what to do in that situation.
How to trace what is hold function and how to fix it.
Thanks.

Some profile data:

Kernel: Linux pc-Cantiga-ICH9M-Chipset 5.4.0-33-generic  Ubuntu: bullseye/sid  Compiler: gcc (Ubuntu 9.3.0-10ubuntu2) 9.3.0

Write to port

# write.c#include "testlpt.h"#include <sys/types.h>/* example how to write data */void  *write_data() {unsigned char status='\0';  for(int i=0;i<SIZE_BUF;i++)  {    int mode=0xFF;int     res=ioctl(fd, PPDATADIR, &mode);      fprintf(stdout,"Data= %c\n",data);#if 1#endifcounter=counter+0;  res=ioctl(fd, PPWDATA, &data);      if (res < 0)   {       fprintf(stdout,"Error write (%d)(%s)\n",errno,strerror(errno));       break;    }  data++;  usleep(USLEEP);   } int res=ioctl(fd, PPRELEASE); if (res < 0 ){fprintf(stdout,"Release error \n");  }pthread_exit(0);}/* example how to read the status lines. */int status_pins(int fd){    unsigned char val;    int res=ioctl(fd, PPRSTATUS, &val);    if (res <0){        fprintf(stdout,"PPRSTATUS ERROR res = %d\n",res);        return -1;    }// val ^= PARPORT_STATUS_BUSY; /* /BUSY needs to get inverted */fprintf(stdout,"ERROR  = 0x%02x \n", (val & (PARPORT_STATUS_ERROR | PARPORT_STATUS_BUSY))); //==PARPORT_STATUS_ERROR)?"HI":"LO",val ^= PARPORT_STATUS_BUSY);fprintf(stdout,"BUSY = 0x%02x \n", (val & PARPORT_STATUS_BUSY)); //==PARPORT_STATUS_ERROR)?"HI":"LO",val ^= PARPORT_STATUS_BUSY);fprintf(stdout,"SELECT  = 0x%02x \n", (val & PARPORT_STATUS_SELECT)); //==PARPORT_STATUS_ERROR)?"HI":"LO",val ^= PARPORT_STATUS_BUSY);fprintf(stdout,"ACK  = 0x%02x \n", (val & PARPORT_STATUS_ACK)); //==PARPORT_STATUS_ERROR)?"HI":"LO",val ^= PARPORT_STATUS_BUSY);}

Header

# testlpt.h#ifndef _TESTLPT_H#define _TESTLPT_H#include <stdio.h>#include <fcntl.h>      #include <sys/types.h>      #include <sys/stat.h>       #include <sys/ioctl.h>#include <linux/parport.h>#include <linux/ppdev.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <signal.h>#include <sys/io.h>#include <errno.h>#include <error.h>#include <string.h> #define DEVICE "/dev/parport0"#define SIZE_BUF 26#define USLEEP 1000#define TIMEOUT 1#include <poll.h>#include <sys/epoll.h>void *reads_data();void *write_data();int claim_port ();int port_select(int fd);extern int fd;extern unsigned char data;extern int counter;static pthread_mutex_t lock;#endif /* testlpt.h */

Read from port

/* read.c */#include <sys/select.h>#include "testlpt.h"void *reads_data() {unsigned char data;data='\0';int res=0;fd_set rfds;counter =0;for(;;) {struct timeval tv;  tv.tv_sec = 0;tv.tv_usec = 100;errno =0;FD_ZERO(&rfds);FD_SET(fd, &rfds);#if 1    int mode=0x00;    res=ioctl(fd, PPDATADIR, &mode);  res=select (fd + 1, &rfds, (fd_set *)NULL, (fd_set *)NULL, &tv);    fprintf(stdout,"res select = %d counter = %d \n",res,counter);  if( res== -1 ) {    fprintf(stdout,"End Read by select \n");       continue;    } else if (res == 0){    fprintf(stdout,"Select timeout\n");    } else {    counter++;    if ( FD_ISSET(fd , &rfds ) ) {    res=ioctl(fd, PPRDATA, &data);  /* now fetch the data! */    if (res < 0) {    fprintf(stdout,"End Read by end of array\n");    break;        }    }   }#endif      fflush(stdout);    usleep(USLEEP); if (( data > 0x40 ) && ( data < 0x5B)) {    fprintf(stdout,"counter = %d data = %c\n",counter,data);    }counter++;}FD_ZERO(&rfds);    fprintf(stdout,"End Read\n");pthread_exit(0);}

Main function

#include <testlpt.h>int fd;unsigned char data=0x41;int counter=0;int main(int argc, char **argv){    pthread_t id[1];     pthread_attr_t attr;            if ((fd=open(DEVICE, O_RDWR | O_NOCTTY )) < 0) {        fprintf(stderr, "can not open %s\n", DEVICE);        return 5;    }    int  mode = IEEE1284_MODE_COMPAT;     int res=ioctl(fd, PPSETMODE, &mode);     if( res== -1 ) {    fprintf(stdout,"PPSETMODE ERROR\n");  }unsigned int modes;     res=ioctl(fd, PPGETMODE, &modes);    if( res ==0 ) {    fprintf(stdout,"MODES= 0x%02x\n", modes);  }#if 1  while (claim_port() <0 ){fprintf (stdout,"Claimt port error = %d\n",0);sleep(1);continue;}#endifpthread_attr_init(&attr);pthread_mutex_init(&lock, NULL);#if 1    if (pthread_create(&id[0],0,&write_data,NULL)){perror("pthread create error!");    }    if (pthread_create(&id[1],0,&reads_data,NULL)){perror("pthread create error!");    }if (pthread_join(id[0],NULL)) {        perror("pthread exit error!");        }if (pthread_join(id[1],NULL)) {        perror("pthread exit error!");        }    ioctl(fd, PPRELEASE);    close(fd);    exit(EXIT_SUCCESS);#endif}int claim_port() {  if (ioctl(fd, PPCLAIM) < 0) {//  if (ioctl(fd, PPEXCL) < 0) {  int errsv = errno;  fprintf(stdout,"CLAIM errno %s \n",strerror(errsv));        close(fd);        return -1;    }        return 0;}

Program output

Data= AData= BSelect timeoutData= CSelect timeoutData= DSelect timeoutData= ESelect timeoutData= FSelect timeoutData= GSelect timeoutData= HData= IData= Jcounter = 7 data = IData= Kcounter = 9 data = JData= Lcounter = 11 data = KData= Mcounter = 13 data = LData= Ncounter = 15 data = Mcounter = 17 data = NData= Ocounter = 19 data = NData= Pcounter = 21 data = OData= Qcounter = 23 data = PData= RData= Scounter = 25 data = QData= Tcounter = 27 data = SData= Ucounter = 29 data = TData= Vcounter = 31 data = UData= Wcounter = 33 data = VData= Xcounter = 35 data = Wcounter = 37 data = XData= YData= Zcounter = 39 data = Xcounter = 41 data = Z

Viewing all articles
Browse latest Browse all 22016

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>