CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Linux/Unix社区 >  程序开发区

一段串口通讯的代码,求高手指点!

楼主jjdzyj(jjdzyj)2005-03-28 16:41:00 在 Linux/Unix社区 / 程序开发区 提问

以下代码在Linux虚拟环境下运行通过,在调试的过程中发现read(fd,   buff,   512)时死掉了,没有读到串口数据。请问程序有问题吗?初学Linux,请高手教教!  
  我在win2k里通过串口调试器向Com1发送数据,并把Com2和Com1用串口线对接,通过以下程序接收Com2的数据时出现上述情况。用串口调试器已经验证Com2肯定有数据。  
   
  在OpenDev后,fd   =   5,对吗?  
   
  #include           <stdio.h>             /*标准输入输出定义*/  
  #include           <stdlib.h>           /*标准函数库定义*/  
  #include           <unistd.h>           /*Unix标准函数定义*/  
  #include           <sys/types.h>     /**/  
  #include           <sys/stat.h>       /**/  
  #include           <fcntl.h>             /*文件控制定义*/  
  #include           <termios.h>         /*PPSIX终端控制定义*/  
  #include           <errno.h>             /*错误号定义*/  
   
  int   speed_arr[]   =   {   B38400,   B19200,   B9600,   B4800,   B2400,   B1200,   B300,  
          B38400,   B19200,   B9600,   B4800,   B2400,   B1200,   B300,   };  
  int   name_arr[]   =   {38400,     19200,     9600,     4800,     2400,     1200,     300,  
          38400,     19200,     9600,   4800,   2400,   1200,     300,   };  
   
  void   set_speed(int   fd,   int   speed)  
  {  
  int       i;  
  int       status;  
  struct   termios       Opt;  
  tcgetattr(fd,   &Opt);  
  for   (   i=   0;     i   <   sizeof(speed_arr)   /   sizeof(int);     i++)  
  {  
  if     (speed   ==   name_arr[i])  
  {  
  tcflush(fd,   TCIOFLUSH);  
  cfsetispeed(&Opt,   speed_arr[i]);  
  cfsetospeed(&Opt,   speed_arr[i]);  
  status   =   tcsetattr(fd,   TCSANOW,   &Opt);  
  if     (status   !=   0)  
  perror("tcsetattr   fd1");  
  return;  
  }  
  tcflush(fd,TCIOFLUSH);  
  }  
  }  
   
  int   set_Parity(int   fd,int   databits,int   stopbits,int   parity)  
  {  
  struct   termios   options;  
  if     (   tcgetattr(   fd,&options)     !=     0)  
  {  
  perror("SetupSerial   1");  
  return(FALSE);  
  }  
   
  options.c_cflag   &=   ~CSIZE;  
  switch   (databits)   /*设置数据位数*/  
  {  
  case   7:  
  options.c_cflag   |=   CS7;  
  break;  
  case   8:  
  options.c_cflag   |=   CS8;  
  break;  
  default:  
  fprintf(stderr,"Unsupported   data   size\n");  
  return   (FALSE);  
  }  
   
  switch   (parity)  
  {  
  case   'n':  
  case   'N':  
  options.c_cflag   &=   ~PARENB;       /*   Clear   parity   enable   */  
  options.c_iflag   &=   ~INPCK;           /*   Enable   parity   checking   */  
  break;  
  case   'o':  
  case   'O':  
  options.c_cflag   |=   (PARODD   |   PARENB);     /*   设置为奇效验*/    
  options.c_iflag   |=   INPCK;                           /*   Disnable   parity   checking   */  
  break;  
  case   'e':  
  case   'E':  
  options.c_cflag   |=   PARENB;           /*   Enable   parity   */  
  options.c_cflag   &=   ~PARODD;       /*   转换为偶效验*/      
  options.c_iflag   |=   INPCK;               /*   Disnable   parity   checking   */  
  break;  
  case   'S':  
  case   's':     /*as   no   parity*/  
  options.c_cflag   &=   ~PARENB;  
  options.c_cflag   &=   ~CSTOPB;  
  break;  
  default:  
  fprintf(stderr,"Unsupported   parity\n");  
  return   (FALSE);  
  }  
   
  /*   设置停止位*/        
  switch   (stopbits)  
  {  
  case   1:  
  options.c_cflag   &=   ~CSTOPB;  
  break;  
  case   2:  
  options.c_cflag   |=   CSTOPB;  
  break;  
  default:  
  fprintf(stderr,"Unsupported   stop   bits\n");  
  return   (FALSE);  
  }  
  /*   Set   input   parity   option   */  
  if   (parity   !=   'n')  
  options.c_iflag   |=   INPCK;  
          options.c_cc[VTIME]   =   150;   //   15   seconds  
          options.c_cc[VMIN]   =   0;  
   
  tcflush(fd,TCIFLUSH);   /*   Update   the   options   and   do   it   NOW   */  
  if   (tcsetattr(fd,TCSANOW,&options)   !=   0)  
  {  
  perror("SetupSerial   3");  
  return   (FALSE);  
  }  
  return   (TRUE);  
  }  
   
  int   OpenDev(char   *Dev)  
  {  
  int fd   =   open(   Dev,   O_RDWR   );                   //|   O_NOCTTY   |   O_NDELAY  
  if   (-1   ==   fd)  
  {   /*设置数据位数*/  
  perror("Can't   Open   Serial   Port");  
  return   -1;  
  }  
  else  
  return   fd;  
  }  
   
  int   main(int   argc,   char   **argv)  
  {  
  int   fd;  
  int   nread;  
  char   buff[512];  
  char   *dev   ="/dev/ttyS1";  
  fd   =   OpenDev(dev);  
  if   (fd>0)  
  set_speed(fd,19200);  
  else  
  {  
  printf("Can't   Open   Serial   Port!\n");  
  exit(0);  
  }  
  if   (set_Parity(fd,8,1,'N')==   FALSE)  
  {  
  printf("Set   Parity   Error\n");  
  exit(1);  
  }  
   
  while(1)  
  {  
  while((nread   =   read(fd,buff,512))>0)  
  {  
  printf("\nLen   %d\n",nread);  
  buff[nread+1]='\0';  
  printf("\n%s",buff);  
  }  
  }  
          //close(fd);  
          //exit(0);  
  }  
  问题点数:100、回复次数:4Top

1 楼ruyedian(710℃ 高烧)回复于 2005-03-28 17:18:03 得分 40

程序没有错,  
  可你确定你的串口里面有数据?  
  Top

2 楼jjdzyj(jjdzyj)回复于 2005-03-28 17:20:39 得分 0

串口有数据,通过串口调试器可以接收到Top

3 楼tengulre(debian core developer)回复于 2005-03-28 18:22:22 得分 60

fd只要是大于0表示设备已经打开成功!  
  不知道你的线是怎么连接看看数据位是否正确.Top

4 楼jjdzyj(jjdzyj)回复于 2005-03-29 08:49:51 得分 0

我只是知道com1和com2对联成功(用普通的串口连接线连接com1和com2),在win2k下用串口调试器能互相收发数据Top

相关问题

  • 在虚拟Linux系统下能进行串口通讯吗?最好给个串口通讯的代码!谢谢!
  • 求用vc实现异步串口通讯的原代码
  • 串口通讯协议的分析问题,希望高手指点迷津)
  • 关于动态库中串口通讯问题,请高手指点
  • 有没谁有不用socket的串口通讯的源代码,散分!
  • 小菜一碟——串口通讯控制器V1.24源代码发布!
  • 串口通讯
  • 串口通讯!!!
  • 串口通讯
  • 串口通讯

关键词

  • win2k
  • 数据
  • 串口
  • 调试器
  • 定义
  • fd
  • nread
  • buff
  • speed
  • 程序

得分解答快速导航

  • 帖主:jjdzyj
  • ruyedian
  • tengulre

相关链接

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

广告也精彩

反馈

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