I am using pipe as a means of IPC
process a: server
process b: read serial port and send data to process a via a pipe
however, when i start the process a which spawnl process b, the data corrupted as long as i use write (pipe_fd, buf, length);
and the series port also get corrupted when i use qtalk -m /dev/ser3 to view the data. that is to say, the data coming from ser3 becomes unstable as long as i use pipe and write (pipe_fd, buf, length).
After i restart the computer, the ser3 becomes normal when using qtalk to probe.
the following are the partial code for process b
/* process b
- ser3 data collection
**************************/
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/proxy.h>
#include <termios.h>
#include <sys/dev.h>
#include <sys/kernel.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#define RS232_SONAR_SPEED 9600
#define STRING_LENGTH 75
typedef struct _msgstr
{
short int msgno;
short int msghead;
char msgcontent[STRING_LENGTH];
}msgstr;
/* sio initialization */
int sioOpen(char *path, unsigned int baudrate)
{
int RS232_fd;
unsigned SER1RS232_OLDMODE;
struct termios SER1RS232_MODE;
RS232_fd = open (path, O_RDWR);
SER1RS232_OLDMODE = dev_mode ( RS232_fd, 0, _DEV_MODES);
tcgetattr ( RS232_fd, &SER1RS232_MODE);
cfsetispeed( &SER1RS232_MODE, baudrate);
cfsetospeed( &SER1RS232_MODE, baudrate);
tcsetattr(RS232_fd, TCSADRAIN, &SER1RS232_MODE);
tcflush(RS232_fd, TCIOFLUSH);
return RS232_fd;
}
int readPrelimFixSize ( int fd, char *buf, char pelim, int fixsize)
{
int status;
do
{
status = read(fd, buf, 1);
if (status < 0 ) return status;
if (status < 1 ) perror( " error in reading " );
} while ( *buf != pelim );
status = readFixSize (fd, buf+1, fixsize-1);
if ( status == (fixsize -1))
return ( status + 1);
else
{
perror ("error in read ");
return ( status + 1 );
}
}
int readFixSize( int fd, char *buf, int fixsize)
{
char *ptr = buf;
int status=0, n;
if ( fixsize < 0 ) return (-1);
while ( status != fixsize )
{
n=read(fd, ptr+status, fixsize-status);
if (n <0) return n;
if (n == 0) return status;
status +=n;
delay (10);
}
return (status);
}
int main (int argc, char **argv)
{
struct termios RS232_mode;
pid_t RS232_proxy, RS232_fd;
int state, size, i;
static int counter=0;
char sonarBuffer[STRING_LENGTH];
char rs232Buffer[STRING_LENGTH];
short int s[14];
char flag=0x00;
msgstr msg;
msgstr *msg_ptr=&msg;
int pipe_fd = atoi(argv[1]);
printf(" argc =%d, argv = %d \n", argc, pipe_fd);
RS232_proxy = qnx_proxy_attach (0, 0, 0, -1);
RS232_fd = sioOpen( "/dev/ser3", RS232_SONAR_SPEED);
dev_state(RS232_fd, 0, _DEV_EVENT_INPUT);
dev_arm(RS232_fd, RS232_proxy, _DEV_EVENT_INPUT);
while (1)
{
Receive( RS232_proxy, 0, 0);
//delay(1000);
state = dev_state(RS232_fd, 0, _DEV_EVENT_INPUT);
if ( state & _DEV_EVENT_INPUT)
{
size = readPrelimFixSize ( RS232_fd, msg_ptr->msgcontent, '$', (sizeof( rs232Buffer)-2));
printf(" size =%d \n", size);
for (i = 0; i< size; i++)
{
sonarBuffer[counter] = rs232Buffer[i];
if ( rs232Buffer[i] == '$' )
{
sonarBuffer[0]='$';
flag++;
if (flag == 0x02)
{
memmove ( msg_ptr->msgcontent, sonarBuffer, sizeof(sonarBuffer));
printf("writing to pipe_fd\n");
flag = 0x00;
size = write (pipe_fd, msg_ptr, sizeof(msgstr));
if (size != sizeof (msgstr))
perror("write to pipe_fd failed");
}
counter = 0;
}
counter++;
}
}
dev_arm (RS232_fd, RS232_proxy, _DEV_EVENT_INPUT);
}
return (EXIT_SUCCESS);
}