串口通信读写数据问题,江湖救急!!!!!!!!!!!

发表于:2007-05-26来源:作者:点击数: 标签:
我现在write串口没问题,但是读串口的数据有问题,如下: 读代码while(1) { while((nread=read(fd,buff,512))0) { buff[nread]=0; } } 串口设备发数据时候,有时候第一次发送可以接收到,第二次发送接受不到(好像是空的)第三次可能收不到,就这样循环,不

我现在write串口没问题,但是读串口的数据有问题,如下:
读代码while(1)
   {
   while((nread = read(fd,buff,512))>0)
    {  
    buff[nread] =0 ;  
   
    }
               }
串口设备发数据时候,有时候第一次发送可以接收到,第二次发送接受不到(好像是空的)第三次可能收不到,就这样循环,不知为何

 CNL 回复于:2004-09-09 15:36:52
读串口一般情况是这样处理的:
char *ptr;
char buff[1024];
ptr=buff;
超时标志=0;
将串口读fd设为非阻塞:fd = open(ctty,O_RDONLY|O_NDELAY);
signal(SIGALRM, 超时处理函数);
alarm(MAXTIMOUT超时);
while (1) {
   while (read(fd,ptr,1)!=0)  ptr++;
   if (超时标志置位(由超时处理函数负责设置)) {
      return 超时;
   }
}
alarm(0);

建议你的串口处理应当遵循串口通用标准方式:
STX+2字节长度+报文+ETX+BCC校验位
这样你的程序很容易和别的串口程序进行通讯,兼容性

 蓝色的天空 回复于:2004-09-09 16:18:48
谢谢风云使者

 ssliao 回复于:2004-09-14 08:42:05
收不到数据

 CNL 回复于:2004-09-14 08:55:36
收不到数据一般情况是你没有设置好通讯速率、停止位等参数,如
   termio_new.c_iflag=INPCK;
    termio_new.c_oflag=0;
    termio_new.c_cflag = termio_new.c_cflag | B9600 | CS8;
    termio_new.c_lflag=0;
    termio_new.c_clearcase/" target="_blank" >cc[4] = 1;
    termio_new.c_cc[5] = 0;
你程序中设置了吗?

 ssliao 回复于:2004-09-14 10:48:34
我现在的工作是循环发送AT命令, 然后不停的接收cdma数据.我现在可以收到数据, 但收一段时间就停了.另外我是按你上面的代码设置串口的.我的代码如下,请大虾帮我看看,谢谢!

strcpy(buffer, "AT+CSI\r");
write(fd, buffer, strlen(buffer));
while(1)
{
if (write(fd, buffer, strlen(buffer)) < 7)
continue;
memset(buff, 0, sizeof(buff));
bufptr = buff;
usleep(1000);
while((len = read(fd, bufptr, buff + sizeof(buff) - bufptr - 1)) > 0)
    {
bufptr += len;
*bufptr = '\0';

if (bufptr[-1] == '\n' || bufptr[-1] == '\r')
{
printf("buff = %s\n", buff);
        break;
}
    }
// memset(recv, 0, sizeof(recv));
// mk_time(recv);
// strncat(buff, recv, strlen(recv));
// write(fh, buff, strlen(buff));
// printf("buff = %s\n", buff);
}

 CNL 回复于:2004-09-14 11:28:11
cdma你需要问一下cdma服务方,多长时间不发送数据就拆链,
如联通就是过一段时间没有发送数据就把链路拆了,
你需要在它拆之前发点东西。

 ssliao 回复于:2004-09-14 11:48:40
但是我是在不停的发送AT命令的呀.

 CNL 回复于:2004-09-14 11:54:40
同事讲仅发AT命令是不够的,还要有cdma认可的数据,呵呵,你是想省money吧

 ssliao 回复于:2004-09-14 12:00:10
不明白您的意思, 情大虾说明.

 CNL 回复于:2004-09-14 12:06:38
引用: “联通公司为了保证合法收益(注:cdma每次建链收一次费用)。。。”

 ssliao 回复于:2004-09-14 12:26:34
我们有SIM卡插在cdma模块上,而且我的另外一个程序可以不停地收到数据,只是速度慢而已,以收到OK为结束,大概每秒在20-25条左右数据,程序代码如下:

strncpy(buffer,"AT+CSI",6);
buffer[6]=13;
buffer[7]=10;
buffer[8]=0;
memset(S, 0, sizeof(S));
write(fd, buffer, strlen(buffer));
while(1)
{
memset(buff, 0, sizeof(buff));
len = read(fd, buff, sizeof(buff));
buff[len] = 0;
// printf("buff = %s\n", buff);
if(len > 0)
{
for(i = 0; i < len; i++)
{
if (buff[i] >= 32)
S[strlen(S)] = buff[i];
if (buff[i] == 'K')
{
memset(recv, 0, sizeof(recv));
mk_time(recv);
strcat(recv, "\n");
strncat(S, recv, strlen(recv));
write(fh, S, strlen(S));
// printf("S = %s\n", S);
memset(S, 0, sizeof(S));
write(fd, buffer, strlen(buffer));
}
}
}// else  write(fd, buffer, strlen(buffer));
// usleep(10000);
}

 ssliao 回复于:2004-09-14 12:29:01
我们要求达到30条/秒数据的速度才可以,而且不是在pc机上,而是在方舟的嵌入式板上.

原文转自:http://www.ltesting.net