免费注册 查看新帖 |

Chinaunix

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

[C] linux c 下串口实验问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-02 22:19 |只看该作者 |倒序浏览
大家好,小弟刚开始学linux下c编程,今天写了个串口最简单的实验,就是两个终端一个发,一个收,单独运行接受端的时候没有事,运行了接收端在运行发送端,发送端就会出现问题,问题就好像一只按回车一样,接着鼠标点接收端的终端,接收端也会出现和发送端一样的问题。如果只运行发送端,也会出现这种问题(不运行接收端),别的终端(空闲)也会出现这样的问题,如果光运行接收端就没有问题。真是不知道怎么回事,郁闷死了。我用的是虚拟机下的rad hat enterprise linux 4


上面解释的是各种情况下出现的问题
总结下来就是一运行发送端,就会出现一个无限循环,循环内容是一只按回车键的效果,ctrl+c不能终止,即使在桌面上,点右键,鼠标放在选项上面会自动点击。

下来上代码 这是接收端
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <termios.h>
#define BAUDRATE B38400
#define MODEMDEVICE "/dev/tty1"

int main()
{
        int fd,c=0,res;
        struct termios oldtio, newtio;
        char buf[256];
        printf("start-----\n");
        fd=open(MODEMDEVICE,O_RDWR|O_NOCTTY);
        if(fd<0)
        {
                perror(MODEMDEVICE);
                exit(1);
        }
        printf("open-----");
        tcgetattr(fd,&oldtio);
        bzero(&newtio,sizeof(newtio));
        newtio.c_cflag=BAUDRATE|CS8|CLOCAL|CREAD;
        newtio.c_iflag=IGNPAR;
        newtio.c_oflag=0;
        newtio.c_lflag=ICANON;
        tcflush(fd,TCIFLUSH);
        tcsetattr(fd,TCSANOW,&newtio);
        printf("reading-----\n");
        while(1)
        {
        res=read(fd,buf,255);
        buf[res]=0;
        printf("res=%d vuf=%s\n",res,buf);
        if(buf[0]='q') break;
        }
        printf("close-----\n");
        close(fd);
        tcsetattr(fd,TCSANOW,&oldtio);
        return 0;

       
}
这个是发送端
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#define BAUDRATE B38400
#define MODEMDEVICE "/dev/tty0"
#define STOP '@'

int main()
{
        int fd,c=0,res;
        struct termios oldtio,newtio;
        char ch,s1[20];
        printf("start------\n");
        fd=open(MODEMDEVICE,O_RDWR|O_NOCTTY);
        if(fd<0)
        {
                perror(MODEMDEVICE);
                exit(1);
        }
        printf("open------\n");
        tcgetattr(fd,&oldtio);
        bzero(&newtio,sizeof(newtio));
        newtio.c_cflag=BAUDRATE|CS8|CLOCAL|CREAD;
        newtio.c_iflag=IGNPAR;
        newtio.c_oflag=0;
        newtio.c_lflag=ICANON;
        tcflush(fd,TCIFLUSH);
        tcsetattr(fd,TCSANOW,&newtio);
        printf("writing------\n");
        while(1)
        {
                while((ch=getchar())!='q')
                {
                        s1[0]=ch;
                        res=write(fd,s1,1);
                }
                s1[0]=ch;
                res=write(fd,s1,2);
                break;
        }
        printf("close-----\n");
        close(fd);
        tcsetattr(fd,TCSANOW,&oldtio);
        return 0;
}

小弟在此谢谢各位大哥 大姐了

[ 本帖最后由 lengbingyu1016 于 2008-11-3 00:46 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-11-02 23:41 |只看该作者
半夜没人么 还是太简单了 不屑回答  期待中。。。。。

论坛徽章:
0
3 [报告]
发表于 2008-11-02 23:45 |只看该作者

回复 #1 lengbingyu1016 的帖子

说实话,没太懂你的问题。

你的代码一句输出都没有吗?程序运行到哪里出了问题?

论坛徽章:
0
4 [报告]
发表于 2008-11-03 08:47 |只看该作者
对串口设备的竞争,在同一时间只有一个进程可以打开串口

论坛徽章:
0
5 [报告]
发表于 2008-11-03 09:32 |只看该作者
while((ch=getchar())!='q')
                {
                        s1[0]=ch;
                        res=write(fd,s1,1);
                }

ch得到的应该是你运行时的回车键的键符。。而你不停的在写
所以现象就是总结下来就是一运行发送端,就会出现一个无限循环,循环内容是一只按回车键的效果,ctrl+c不能终止
并且,,,你木sleep一下,是个不间断的死循环,,,,,,,直到把资源耗尽,是不会停止的,,,

论坛徽章:
0
6 [报告]
发表于 2008-11-03 16:17 |只看该作者

回复 #5 embededboy 的帖子

谢谢了  我明白了  我在修改下程序。。。

论坛徽章:
0
7 [报告]
发表于 2010-03-11 10:57 |只看该作者
路过!!学习一下。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP