CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  程序开发区

200分送了!!!急,小弟急求各位大侠

楼主h_bin16888(木之杉)2004-12-01 19:50:26 在 Linux/Unix社区 / 程序开发区 提问

具体的是这样,主程序是一个死循环(在计算数据),这个时候,需要响应串口传过来的数据进行计算  
  1。需中断响应,这个程序怎么写?  
  2。我用了termios这个结构,很奇怪的是,可以接收(用信号,听说这个类似DOS的INT),但是不能够发送,不知道哪里出错了,向串口发送数据是(write(fd,buff,100))这个函数吗?有其他的函数吗?我在DOS下面用的outportb这个,直接对地址发送(outportb(0x3f8,buff,1))Linux下面的outb这个函数是否一样?  
  3,因为在中断里面需要判断当前串口是发送还是接收,需要直接读取UART寄存器的值,我在DOS下面用如下代码『  
  adr1   =   0x3f8  
  cb=inportb(adr1+2);      
            if(cb==6)  
            {  
            inportb(adr1+5);  
            continue;  
            }  
            if(cb==4)//这个时候中断接收数据  
            {  
            readserial()  
            continue;  
            }  
            if(cb==2)//这个时候中断发送数据  
            {  
            writeserial();  
            continue;  
            }  
            }   while((cb   &   1)==0);     //2  
            outportb(0x20,0x20);          
  』  
  上面这段程序在linux下面如何实现?用outb这个函数可以直接读取吗?关键问题就是如何判断串口寄存器的状态  
   
  下面这个是我写的Linux下面的第一个程序,请大家看看,错在哪里呀?只能够接收,不能够发送!!!  
  程序:  
  #include   <sys/ioctl.h>  
  #include   <sys/stat.h>  
  #include   <sys/types.h>  
  #include   <unistd.h>  
  #include   <asm/io.h>  
  #include   <errno.h>  
  #include   <sys/mman.h>  
  #include   <signal.h>  
  #include   <fcntl.h>  
  #include   <termios.h>  
   
                 
  #define   BAUDRATE   B38400              
  #define   MODEMDEVICE   "/dev/ttyS1"              
   
  void   readserial();  
  void   writeserial();  
  void   signal_handler_IO   (int   status);          
   
  main()       {                  
    int   fd,c,   res;        
    struct   termios   oldtio,newtio;      
    struct   sigaction   saio;                    
   
    char   buf[255];                  
   
          fd   =   open(MODEMDEVICE,   O_RDWR   |   O_NOCTTY   |   O_NONBLOCK);          
          if   (fd   <0)   {perror(MODEMDEVICE);   exit(-1);   }                  
     
          saio.sa_handler   =   signal_handler_IO;            
          saio.sa_mask   =   0;      
          saio.sa_flags   =   0;            
          saio.sa_restorer   =   NULL;          
          sigaction(SIGIO,&saio,NULL);        
          fcntl(fd,   F_SETOWN,   getpid());          
          fcntl(fd,   F_SETFL,   FASYNC);                  
          tcgetattr(fd,&oldtio);    
           
   
          newtio.c_cflag   =   BAUDRATE   |   CRTSCTS   |   CS8   |   CLOCAL   |   CREAD;              
          newtio.c_iflag   =   IGNPAR   |   ICRNL;            
          newtio.c_oflag   =   0;             //这个发送我不知道怎么设置,老是发送不对  
          newtio.c_lflag   =   ICANON;      
          newtio.c_cc[VMIN]=1;          
          newtio.c_cc[VTIME]=0;          
          tcflush(fd,   TCIFLUSH);            
          tcsetattr(fd,TCSANOW,&newtio);            
     
  while   (1)   {                
            //   计算  
          需要串口实时传送过来的数据,必须中断发送和接收  
      }                
    tcsetattr(fd,TCSANOW,&oldtio);      
  }                          
   
  void   readserial();  
  {  
        read(fd,readbuf,1)   //  
          /*   这个readbuf的值需要返回mian的while中进行计算    
  }//read   程序已经调通  
   
  void   writeserial()  
  {  
            write(fd,writebuf,1)    
          //这个writebuf是while计算以后的值,发送出去  
  }//不知道这错在哪里?????老实发送不了??  
   
   
  void   signal_handler_IO   (int   status)        
  {  
  /*        
  这里就需要刚才上面那个程序说的如何判断   UART寄存器的状态值了  
  if(串口有数据传入)  
            readserial();  
  if(有数据输出)  
            writeserial();  
  }//这个问题现在是一点都没有搞明白  
   
  小弟,在次谢过完整看了问题的各位大哥,如果你能帮忙,请回帖,如果不能,大家一起交流!  
  问题点数:20、回复次数:16Top

1 楼batfree(没有计算机的程序员)回复于 2004-12-01 20:45:23 得分 0

帮你顶,Top

2 楼h_bin16888(木之杉)回复于 2004-12-01 21:01:29 得分 0

谢谢,自己在顶一下Top

3 楼hellopower(飞鸟)回复于 2004-12-06 10:25:25 得分 0

200分?Top

4 楼h_bin16888(木之杉)回复于 2004-12-19 02:26:13 得分 0

没有人知道吗?Top

5 楼blder(波拉登)回复于 2004-12-19 08:30:33 得分 0

知也不说  
  太没道德Top

6 楼h_bin16888(木之杉)回复于 2004-12-19 15:06:18 得分 0

楼上这位兄弟,怎么了?Top

7 楼romantickiller(RK)回复于 2004-12-19 21:16:04 得分 0

看了半天,觉得少了一个0   ,好象Top

8 楼NC(比尔.盖饭)回复于 2004-12-19 21:43:44 得分 0

你可以在死循环中用select函数监控串口Top

9 楼h_bin16888(木之杉)回复于 2005-02-17 13:21:14 得分 0

如果分不够,我可以在加,好像是我错少打了一个0!  
   
  用死循环是不行的,因为还有其他很多事情要做,时间来不急!能有那种类似DOS下面的直接读串口地址的方法??mmap可以,读内存映射。我想知道一个命令,可以看见所以硬件的地址?Top

10 楼h_bin16888(木之杉)回复于 2005-02-19 19:31:28 得分 0

upTop

11 楼core(猪母狼马)回复于 2005-02-20 10:39:41 得分 20

有必要那么复杂吗?我是READ,WRITE,就这么个死循环  
  如果就这么点动作,SELECT都不用了  
  WRITE不了,不会看看返回值吗?  
  我的初始化过程  
          int   fd,   rc;  
          struct   termios   tio;  
   
          if   ((fd   =   open(file,   O_RDWR   |   O_NOCTTY   |   O_NDELAY))   <   0)  
          {  
                  perror(file);  
                  return   -1;  
          }  
   
          tio.c_cflag   =   B19200   |   CRTSCTS   |   CS8   |   CLOCAL   |   CREAD;  
          tio.c_iflag   =   IGNPAR;  
          tio.c_oflag   =   0;  
          tio.c_lflag   =   0;  
          tio.c_cc[VTIME]   =   1;  
          tio.c_cc[VMIN]   =   0;  
          tcsetattr(fd,   TCSANOW,   &tio);  
  Top

12 楼h_bin16888(木之杉)回复于 2005-02-20 19:55:40 得分 0

楼上的兄弟,你的意思???我需要很强的实时性。5ms内的时间是很多事情的Top

13 楼h_bin16888(木之杉)回复于 2005-02-23 18:56:06 得分 0

顶Top

14 楼h_bin16888(木之杉)回复于 2005-02-26 11:08:12 得分 0

大家有做过实时嵌入式的吗???做过就会知道我的意思了Top

15 楼getit911(Windows转Linux中)回复于 2005-02-26 17:55:45 得分 0

开2个线程,一个读,一个写Top

16 楼gdhyj(gdhyj)回复于 2005-02-26 18:13:18 得分 0

另外开一个线程,不断地读串口,读到数据后就发数据给主线程,主线程的循环里加个判断,如果发现有数据过来就先处理过来的数据,没有的话就接着死循环计算Top

相关问题

  • 急,有分送
  • 急!!急.....,送分,送分!!请各位大虾帮帮忙
  • 急,,请各位兄弟解决,80分送
  • 急~~~!!!(高分送上)
  • 急,100分送了
  • 急!急!急!高分送出!
  • 急!急!急!50分送上。
  • 关闭窗体的问题.各位进来看看.80分送上,急!!!!!
  • 超级急,各位大侠,快点来帮我啊,送分送分!
  • 在线急等,高分送!

关键词

  • 函数
  • 中断
  • 数据
  • 串口
  • 接收
  • outportb
  • adr
  • cb
  • 程序
  • 发送

得分解答快速导航

  • 帖主:h_bin16888
  • core

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo