3930|2

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

linux下的串口接收程序 [复制链接]

我在linux下写了一个串口接收程序,不停地向串口发送“Network formed, waiting for RX“,但却接收不到,请大家帮忙看看什么问题

#include          /*标准输入输出定义*/
#include        /*标准函数库定义*/
#include        /*Unix 标准函数定义*/
#include   
#include   
#include          /*文件控制定义*/
#include        /*PPSIX 终端控制定义*/
#include          /*错误号定义*/

#define FALSE -1
#define TRUE  0

/*struct termio
{        unsigned short c_iflag;
          unsigned short c_oflag;      
          unsigned short c_cflag;         
          unsigned short c_lflag;                 
          unsigned char c_line;               
          unsigned char c_cc[NCC];
};
*/

struct termios Opt;

int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,
                                                  B57600, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 57600,

                                                  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) {   
                              tcflush(fd, TCIOFLUSH);   
                              cfsetispeed(&Opt, speed_arr);
                              cfsetospeed(&Opt, speed_arr);
                              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 sizen"); 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 parityn");
                    return (FALSE);
}
/* 设置停止位*/
switch (stopbits)
{
          case 1:
                    options.c_cflag &= ~CSTOPB;
                    break;
          case 2:
                    options.c_cflag |= CSTOPB;
              break;
          default:
                    fprintf(stderr,"Unsupported stop bitsn");
                    return (FALSE);
}
/* Set input parity option */
if (parity != 'n')
          options.c_iflag |= INPCK;
tcflush(fd,TCIFLUSH);
options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/
options.c_cc[VMIN] = 0; /* 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[30];
          char temp[]="Network formed, waiting for RX";
          char *dev = "/dev/ttyS0"; //串口1
          fd = OpenDev(dev);
          set_speed(fd,57600);
          if (set_Parity(fd,8,1,'N') == FALSE) {
                    printf("Set Parity Errorn");
                    exit (0);
          }
          nread=sizeof(temp);
         
while (1) //循环读取数据
{
          while(read(fd, buff, nread)==nread)
          {
                  
                    printf( "%s", buff);
          }
}
          //close(fd);
          // exit (0);
}

最新回复

应该没错吧! 检查一下设备好还有硬件有没有坏吧。  详情 回复 发表于 2009-7-2 13:20
点赞 关注

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
顶一下!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
应该没错吧! 检查一下设备好还有硬件有没有坏吧。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表