操作系统是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/