免费注册 查看新帖 |

Chinaunix

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

一个进程内打开一个文件, 和一个串口, 则串口能写, 但读不出数据? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-01 15:31 |只看该作者 |倒序浏览
一个进程内打开一个文件, 和一个串口, 则串口能写, 但读不出数据? 如果不打开文件或者关闭文件,则可以正常读写串口。
      int fd;
      int tty_fd;

      // 1.  打开一个文件
       fd =open("/tmp/pcm_file", O_CREAT|O_WRONLY|O_TRUNC);
        if (pcm_fd  < 0)
        {
                printf("open %s error\n", "/tmp/pcm_file");
                return -1;
        }


       //2 打开一个tty设备
       tty_fd= open(dev_name, O_RDWR|O_NOCTTY | O_TRUNC);
        if (0 > tty_fd)
        {
                        printf("open  %s error!\n", dev_name);
                        exit(1);
        }
               
        Set_Parity(tty_fd, 8, 1, 'N');
        set_baudrate(tty_fd, 9600);      

        WriteCommtty_fd, "AT\r", 3);
        ReadComm(tty_fd, buff, 320);  //如果不执行 1, 则可以成功的读出返回的 “OK”, 一旦执行1, 就读不到任何数据, 困惑了好久? 望各位解答?
        printf(buff);



WriteComm函数实现
int WriteComm(int fd, void* pData, int nLength)
{
        int ret = 0;
        if (-1 == fd)
                return -1;
      
        if (NULL == pData)
                return -1;
      
        ret = write(fd, pData, nLength);
        //printf("write bytes :%d data: %s\n", ret, pData);
        return ret;
}

ReadComm函数实现
int ReadComm(int fd, void* pData, int nLength)
{
        int ret = 0, rc = 0, sum = 0;
        char tmp[100];
        fd_set readfd;
        struct timeval tv;

        if (-1 == fd)
                return -1;
        if (NULL == pData)
                return -1;
               
        memset(pData, 0, nLength);
        memset(tmp, 0, 100);
      
        tv.tv_sec=1;     
        tv.tv_usec=0;  
      
        FD_ZERO(&readfd);
        FD_SET(fd,&readfd);
        while(select(5, &readfd, NULL, NULL, &tv ) > 0)
        {
                memset(tmp, 0, sizeof(tmp));
                tv.tv_sec = 1;
                tv.tv_usec=200*1000;   
                FD_ZERO(&readfd);
                FD_SET(fd, &readfd);
                       
                ret=read(fd, tmp, nLength-sum);
                //printf("select ...%d data %s\n", ret, tmp);
                //strcat(pData, tmp);
                memcpy(pData+sum, tmp, ret);
                sum += ret;
                nLength -= ret;
        }      
      
      
        return sum;
}

谢谢!

[ 本帖最后由 jifeng314 于 2009-7-2 11:49 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-07-01 23:18 |只看该作者
你这个程序都正常close设备了吗?
我也很想知道结果。挺有意思的

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
3 [报告]
发表于 2009-07-02 10:57 |只看该作者

回复 #1 jifeng314 的帖子

你确定读成功的时候,确实读到了数据?

论坛徽章:
0
4 [报告]
发表于 2009-07-02 11:29 |只看该作者

回复 #2 emmoblin 的帖子

程序退出时,才需要关闭设备。

论坛徽章:
0
5 [报告]
发表于 2009-07-02 11:30 |只看该作者

回复 #3 dreamice 的帖子

肯定,因为我可以打印出来。

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
6 [报告]
发表于 2009-07-02 11:56 |只看该作者
你这样测试一下:
先打开串口,读写数据;完了再打开这个文件进行操作,看这个文件能开打不。

论坛徽章:
0
7 [报告]
发表于 2009-07-02 12:24 |只看该作者
经过测试, 虽然Readcomm()函数读不出来, 但是 cat命令 cat dev_name 可以显示出来,  真搞不懂了。

论坛徽章:
0
8 [报告]
发表于 2009-07-02 16:16 |只看该作者

回复 #6 dreamice 的帖子

文件什么时间都可以打开

论坛徽章:
0
9 [报告]
发表于 2009-07-03 02:54 |只看该作者
难道你这个pcm_dev不是一个普通的文件?
是不是也是一个硬件设备阿?

论坛徽章:
0
10 [报告]
发表于 2009-07-03 09:37 |只看该作者
/tmp/pcm_file, 就是一个临时文件

那个tty设备,是一个modern,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP