• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

串口接收数据,运行一段时间后就接收不到了!

发布: 2007-6-08 22:43 | 作者: seanhe | 来源: | 查看: 24次 | 进入软件测试论坛讨论

领测软件测试网
操作系统是open server 5.05

打开串口后,将fd放入FD_SET集合。再用select探测。大体如下:
open(...)
while(1)
{
       select(...)
       read(...)
       处理交易...
       write(...)
}

运行一段时间后,客户端明明有请求,可是select再也探测不到信号。程序一直循环。
我把select设置成15秒,并累计时间,如果5分钟内没有交易,就将串口重新打开,但是日志显示重新打开了串口,但还是收不到交易。哪位大侠帮我分析下。
我打开串口如下:
int comm_open(char *comm_name)
{
    int comm_fd;
    struct termio comm_tty;

    if((comm_fd = open(comm_name, O_RDWR|O_NDELAY)) < 0)
        return(_ERROR_COMM_OPEN);

    if(ioctl(comm_fd, TCGETA, &comm_tty))
        return(_ERROR_COMM_GET);
    comm_tty.c_iflag = 1;
    comm_tty.c_oflag = 0;
    comm_tty.c_cflag = (B9600|CS8|CREAD|HUPCL|CLOCAL);
    comm_tty.c_lflag = 0;
    comm_tty.c_cc[VMIN] = 1;
    comm_tty.c_cc[VTIME]=0;
    if(ioctl(comm_fd, TCSETA, &comm_tty) == -1)
        return(_ERROR_COMM_SET);

    return comm_fd;
}

 CNL 回复于:2004-10-14 11:38:25
sco 的select目前只支持socket的检测,不支持串口和消息队列

 zengyh 回复于:2004-10-14 11:45:04
但是他也能运行一段时间呀,交易照常运行,只是过了段时间后(几天到十几天不等),才收不到数据。对于select而言,只是对文件描述字集进行检查。
我在hp-unix上用这种方法是没有问题的,是不是在sco上用这种方法会不稳定?

 CNL 回复于:2004-10-14 11:50:43
select不是unix标准调用,不同的UNIX OS支持力度不同。
SCO对select的支持最差,只有通讯socket可用select正确检测到
其他的基本不支持

 zengyh 回复于:2004-10-14 11:54:38
请问一下,是不是在sco下,对串口操作只能采用循环读取的方式来处理交易呢。我之前就是这样的方法,但同样也存在过几天就收不到数据的现象呀。后来不得已才改成用select的方式。

我的串口打开的参数有没有什么问题?

 CNL 回复于:2004-10-14 12:19:31
看起来没什么问题,不过我的做法是读写句柄分开:
对于读fd非阻塞只读方式打开,对于写fd按你的参数设置
循环检测读fd数组,读数据用读fd句柄,回数据用写fd句柄

 zengyh 回复于:2004-10-14 13:40:19
那就是open两次,得到两个fd,
while(1)
{
       read(fd_read...)
       .......
       write(fd_write...)
}
大致是这样吗?

 CNL 回复于:2004-10-14 17:29:27
我是这样做的,有个程序到现在已经跑了两年多了,还没有停过

 zengyh 回复于:2004-10-15 10:16:58
感觉那样做,超时比较难处理,能不能把你的通讯程序给我一份参考参考。
yh_zeng2000@sohu.com
万分感谢!

 CNL 回复于:2004-10-15 10:19:12
我们那个程序很大,涉及第3方版权问题,不好给你

 zengyh 回复于:2004-10-15 11:22:29
不过还是谢谢你

 CNL 回复于:2004-10-15 11:40:30
看了一下,我的写fd参数还有2点和你不同,
由于我们那个程序是处理高速网控接入,采用的是包传送方式,只设置了8位和速率:
comm_tty.c_iflag = INPCK; 
comm_tty.c_cflag = comm_tty.c_cflag | B19200 | CS8;

 locallocal 回复于:2004-10-19 11:30:31
你们这样轮询,不会占用大量的资源么?

 CNL 回复于:2004-10-19 11:41:06
如果循环中没有select毫秒级延时的话,会把CPU都占掉

 huairendaxiong 回复于:2004-11-16 09:33:02
unix抓串口通讯的数据,有哪些工具呢?
thank you

 ywwlyc 回复于:2004-12-09 12:04:07
我的串口也是,我在rh9.0下运行,另一端是一个在windows 2000 server下的串口调试助手,我的串口可以不停的发,另一端也能接收到,可是我的串口却接收不到调试助手发送的字符,那个助手还他妈自发自收,请问怎么控制我什么时候写?也就是怎么以阻塞的方式写?在open()时用open(devname,~O_NONBLOCK)似乎也不行啊。


 gissing 回复于:2004-12-09 16:43:09
郁闷阿,我也要搞串口编程,可是我都不太懂啊。
请问那位兄弟有这方面的教程、源码或者网址阿,谢谢!

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网