I'm writing a little program to exercise the modbus interface on our embedded system (modbus is a serial protocol). I have an infinite loop, which sends a request from the PC to the embedded device, and then receives a response. So far so good. But, it will only do it 127 times.
The library I'm using (libmodbus) has a verbose mode, where it will print out all the information coming & going, as well as the pid's . Each write & read of data generates a new pid. While it's working, it looks like this: pid reading 25443 return -1 pid timeout 25442 return 0 When it stops, it looks like this: pid reading 0 return 0 pid timeout 25444 return -1 The code from the library looks like this: int Mbm_send_and_get_result(byte trame[], int timeout, int long_emit, int longueur) { int i,stat1=-1,stat2=-1; pthread_t thread1,thread2; Mbm_result = (unsigned char *) malloc(longueur*sizeof(unsigned char)); /* clean port */ tcflush(Mb_device, TCIFLUSH); /* create 2 threads for read data and to wait end of timeout*/ pthread_create(&thread2, NULL,(void*)&Mbm_sleep,&timeout); pthread_create(&thread1, NULL,(void*)&Mbm_get_data,&longueur); if (Mb_verbose) fprintf(stderr,"start writing \n"); for(i=0;i<long_emit;i++) { /* send data */ write(Mb_device,&trame[i],1); /* call pointer function if exist */ if(Mb_ptr_snd_data!=NULL) (*Mb_ptr_snd_data)(trame[i]); } if (Mb_verbose) fprintf(stderr,"write ok\n"); do { if (Mbm_Pid_Child!=0) /* kill return 0 if the pid is running or -1 if the pid don't exist */ stat1=kill(Mbm_Pid_Child,0); else stat1=0; if (Mbm_Pid_Sleep!=0) stat2=kill(Mbm_Pid_Sleep,0); else stat2=0; /* answer of the slave terminate or and of the timeout */ if (stat1==-1 || stat2==-1) break; } while(1); if (Mb_verbose) { fprintf(stderr,"pid reading %d return %d\n",Mbm_Pid_Child,stat1); fprintf(stderr,"pid timeout %d return %d\n",Mbm_Pid_Sleep,stat2); } /* stop both childs */ Mbm_Pid_Child=0; Mbm_Pid_Sleep=0; pthread_cancel(thread1); pthread_cancel(thread2); /* error : timeout fealure */ if (stat1==0) { return 0; } /* ok : store the answer packet in the data trame */ for (i=0;i<=longueur;i++) trame[i]=Mbm_result[i]; return 1; Any help or pointing in the right direction would be greatly appreciated. Amanda -- SLUG - Sydney Linux User's Group - http://slug.org.au/ More Info: http://lists.slug.org.au/listinfo/slug