免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4259 | 回复: 4
打印 上一主题 下一主题

求助linux下串口收数据 数据丢失问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-04 18:47 |只看该作者 |倒序浏览
麻烦大侠看看,给我提点建议 多谢了。

最近在搞一个指纹识别器的应用。

平台是s3c2440 linux2.6.29.1

过程是这样的:
通过串口向指纹识别器发命令,命令执行完后返回一ack,其中命令和ack都是按照其规定的协议来通信的。我首先在无操作系统下,编写了一个读寄存器状态的命令,命令执行正确,也正确收到了ack。

但是在Linux下,编写了同样的命令,收到的ack总要丢失字节(一个ack包是28字节),有时收到10bytes,有时收到18bytes, 有时收到25bytes,但从来没有正确接收过!分析收到的残缺ack包,我可以肯定命令是执行正确了的,但为什么每次收到的数据不完整,而且就出现10, 18, 25这三种情况之一呢?更奇怪的是,在同样的情况下,丢失的字节是相同的,例如5次都只收到了10bytes,那么就丢失了18bytes,并且这5次丢失的这18bytes是相同的。

我尝试过了select,异步IO, 但得到的结果还是一样的。。。下面是我的代码片段:
...
void set_serial_attr(int fd)
{
    tcgetattr(fd, &tio);
    tio.c_cflag |= (CLOCAL | CREAD);
    tio.c_cflag &= ~CSIZE;
    tio.c_cflag |= CS8;
    tio.c_cflag &= ~PARENB;
    tio.c_cflag &= ~CSTOPB;
    cfsetispeed(&tio, B57600);
    cfsetospeed(&tio, B57600);
   
    c_lflag = tio.c_lflag;
    tio.c_lflag &= ~(ICANON | ECHO);

    tcsetattr(fd,TCSANOW,&tio);
}


...
do{
    select(fd+1, &rfds, NULL, NULL, NULL);

    ret = read(fd, buffer_ack+count, 28);
    if(ret < 0){
        fprintf(stderr, "read ack  failed...\n");
        perror("read");
        exit(1);
    }else
        count += ret;
    DPRINTF("read count = %d\n", count); //printf the number of bytes received

}while(count != 28);
...



[ 本帖最后由 hellangel1984 于 2009-7-5 13:30 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-07-04 19:53 |只看该作者
select 最后的timeout 参数没设? 数据没全部到你的循环就退出了。

论坛徽章:
0
3 [报告]
发表于 2009-07-05 13:28 |只看该作者
原帖由 connet 于 2009-7-4 19:53 发表
select 最后的timeout 参数没设? 数据没全部到你的循环就退出了。


多谢回复!
我用了一个do...while..循环,如果count != 28的话 会不断的read。

论坛徽章:
0
4 [报告]
发表于 2009-07-05 19:36 |只看该作者
那 exit(1); 干什么去了

论坛徽章:
0
5 [报告]
发表于 2009-07-06 12:04 |只看该作者

re

do...while..之前,count有没有清零?
我觉的timeout也应该设置,数据隔时间太长不能连续接收,就应认为错误数据帧了
另外,残缺ack包的分析,是前段丢失还是尾部丢失?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP