LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2209|回复: 1

再次求救!T_T

[复制链接]
发表于 2002-5-9 17:29:54 | 显示全部楼层 |阅读模式
我在redhat 7.2下开发程序,想从com1口获取设备传输信息(设备是激光扫描平台),但我的程序执行到res = read(fd,buf,1);这一条时,却跳不出来了!请那位大哥帮帮忙,救命救命,老板再有两天就要我交货了!!苦啊,哭啊……

以下就是我写的代码:

#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <termios.h>
#define DEVICE "/dev/ttyS0"

#define BAUDRATE B9600            
/* 定义正确的序列埠 */
#define _POSIX_SOURCE 1 /* POSIX 系统相容 */

#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;  

main()
{
  int fd,c, res;
  struct termios oldtio,newtio;
  char buf[20];
/*  
  开启数据机装置以读取并写入而不以控制 tty 的模式
  因为不想程式在送出 CTRL-C 後就被杀掉.
*/
//printf("start1");

fd = open(DEVICE, O_RDWR | O_NOCTTY );  //
if (fd <0) {perror(DEVICE); exit(-1); }

tcflush(fd, TCIFLUSH);

tcgetattr(fd,&oldtio); /* 储存目前的序列埠设定 */
bzero(&newtio, sizeof(newtio)); /* 清除结构体以放入新的序列埠设定值 */

/*  
  BAUDRATE: 设定 bps 的速度. 你也可以用 cfsetispeed 及 cfsetospeed 来设定.
  CRTSCTS : 输出资料的硬体流量控制 (只能在具完整线路的缆线下工作
            参考 Serial-HOWTO 第七节)
  CS8     : 8n1 (8 位元, 不做同位元检查,1 个终止位元)
  CLOCAL  : 本地连线, 不具数据机控制功能
  CREAD   : 致能接收字元
*/
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
  
/*
  IGNPAR  : 忽略经同位元检查後, 错误的位元组
  ICRNL   : 比 CR 对应成 NL (否则当输入讯号有 CR 时不会终止输入)
            在不然把装置设定成 raw 模式(没有其它的输入处理)
*/
newtio.c_iflag = IGNPAR ;
  
/*
Raw 模式输出.
*/
newtio.c_oflag = 0;

//newtio.c_lflag = 0;
  

/*
  ICANON  : 致能标准输入, 使所有回应机能停用, 并不送出信号以叫用程式
*/
newtio.c_lflag = ICANON;
  
/*  
  初始化所有的控制特性
*/
newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */  
newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
newtio.c_cc[VERASE]   = 0;     /* del */
newtio.c_cc[VKILL]    = 0;     /* @ */
newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */
newtio.c_cc[VTIME]    = 0;     /* 不使用分割字元组的计时器 */
newtio.c_cc[VMIN]     = 1;     /* 在读取到 1 个字元前先停止 */
newtio.c_cc[VSWTC]    = 0;     /* '\0' */
newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */  
newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */
newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */
newtio.c_cc[VEOL]     = 0;     /* '\0' */
newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */
newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */
newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */
newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
newtio.c_cc[VEOL2]    = 0;     /* '\0' */

/*  
  现在清除数据机线并启动序列埠的设定
*/
// tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);

//printf("starts3");
//getchar();

/*
  终端机设定完成, 现在处理输入讯号
  在这个□例, 在一行的开始处输入 'z' 会退出此程式.
*/
while (STOP==FALSE)
{     /* 循环会在我们发出终止的讯号後跳出 */
/* 即使输入超过 255 个字元, 读取的程式段还是会一直等到行终结符出现才停止.
    如果读到的字元组低於正确存在的字元组, 则所剩的字元会在下一次读取时取得.
    res 用来存放真正读到的字元组个数 */
    //printf("start");
    //getchar();
    res = read(fd,buf,1);  
    printf("end");
    getchar();
    buf[res]=0;             /* 设定字串终止字元, 所以我们能用 printf */
    printf("\r\nres:%d  fd:%d",res,fd);
    getchar();
//    printf(":%s:%d\n", buf, res);
    if (buf[0]<=13) STOP=TRUE;
}

printf("start4");
getchar();
/* 回存旧的序列埠设定值 */
tcsetattr(fd,TCSANOW,&oldtio);
}
发表于 2002-5-11 11:16:55 | 显示全部楼层

苦竹兄弟,弟兄们真是对不住你。。。。

苦竹兄弟,弟兄们真的对不住你。这个问题我看了N次了,还是解决不了,因为我的水平没有达到兄弟你的那个级别。帮不上兄弟,我真觉得过意不去。
唉。。。。。哪个兄弟,能帮助苦竹兄弟解决这个问题?
多谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表