关于串口读写的问题

中文QNX 讨论: 欢迎大家灌水,讨论有关QNX 问题。
回复
hw_bjjd
Senior Member
帖子: 28
注册时间: 周一 1月 24, 2005 1:50 pm

关于串口读写的问题

帖子 hw_bjjd » 周一 3月 28, 2005 7:34 pm

各位高手,我写了一个从串口读数据,然后在从这个串口写回去的程序,遇到了问题,请各位指点一下。
假设每一条有用的信息以\r\n结尾,那么我把两个\r\n之间和后一个\r\n从数据中找出来,当做一条信息保存,然后发出去。
程序每次在收到前900多个字符时都是正确的,能区分出每一条信息,可是到了九百多个字符以后就会陷入死循环,收不到数据,但是会老是打印出read_data:
很急啊,求救了,谢谢!
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <aio.h>
#include <termios.h>
#include <unistd.h>
#include <pthread.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

int main()
{
int read_num;
int write_num;
int p_front=0; //保存字符串开头的下标
int p_end=0; //保存字符串末尾的下标
int p=0;
int i;
int j=0;
int fd_ser1;

div_t remain_p;
char read_buf[100]={0}; //存放从串口读的数据
char temp_read_buf[1024]={0}; //将从串口读到的数据放在这里,等待从中分离出一条条有用信息
char keep_read_buf[100]={0}; //保存一整条有用的信息
//打开串口
fd_ser1=open("/dev/ser1",O_RDWR);
if(-1==fd_ser1)
{
printf("the /dev/ser1 open failure!!!!\n");
return 0;
}
else
{
printf("the /dev/ser1 is open ^_^\n");
tcflush(fd_ser1,TCIOFLUSH);
}

while(1)
{
//读取数据
memset(read_buf,0x00,sizeof(read_buf));
read_num=read(fd_ser1,read_buf,sizeof(read_buf));

//将每次读的数据存放在temp_read_buf中
for(i=0;i<read_num;i++)
{
remain_p=div(p,1024);
p=remain_p.rem;
temp_read_buf[p]=read_buf;
p++;
}

while(p_end!=p)
{
if(temp_read_buf[p_end]!='\n')
{
p_end++;
remain_p=div(p_end,1024);
p_end=remain_p.rem;
}
else //find '\n'
{
if(0==p_end)
{
p_end=1024;
}
if(temp_read_buf[p_end-1]=='\r') //find '\r' and '\n'
{
j=0;
if(p_front<p_end)
{
for(i=p_front;i<p_end;i++)
{
keep_read_buf[j]=temp_read_buf;
j++;
}
}
if(p_front>p_end)
{
for(i=p_front;i<1024;i++)
{
keep_read_buf[j]=temp_read_buf;
j++;
}
for(i=0;i<p_end;i++)
{
keep_read_buf[j]=temp_read_buf;
j++;
}
}

keep_read_buf[j]='\n';
keep_read_buf[j+1]='\0';
printf("read_data:%s\n",keep_read_buf);
write_num=write(fd_ser1,keep_read_buf,strlen(keep_read_buf));
tcdrain(fd_ser1);
memset(keep_read_buf,0x00,sizeof(keep_read_buf));
p_end++;
remain_p=div(p_end,1024);
p_end=remain_p.rem;
p_front=p_end;

}
else //find '\n' but the front char is not '\r'
{
p_end++;
remain_p=div(p_end,1024);
p_end=remain_p.rem;
}
}
}
}

return EXIT_SUCCESS;
}

回复