LinuxSir.cn,穿越时空的Linuxsir!

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

关于串口编程问题请教

[复制链接]
发表于 2007-1-9 14:41:41 | 显示全部楼层 |阅读模式
liunx新手,从网上找了段串口编程代码,用gcc编译(无错误提示)后运行无反应 ,请高手看看。用的fc6

#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>             /*错误号定义*/

#define FALSE  -1
#define TRUE   0

#define buff_len_w    20
#define buff_len_r    1  
int OpenDev(char *Dev)  
{  
    int fd = open(Dev,O_RDWR);            //|   O_NOCTTY   |   O_NDELAY
    if (-1 == fd)
    {
        perror("Can't Open Serial Port");
        return(FALSE);  
    }
    else
        return(fd);  
}

/**
*@brief     设置串口通信速率
*@param     fd        类型   int     打开串口的文件句柄  
*@param     speed     类型   int     串口速度
*@return    void
*/
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,};
                //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)
        {
            printf("baud is %d\n",name_arr);
            tcflush(fd,TCIOFLUSH);
            if (cfsetispeed(&Opt,speed_arr)==0)
            {
                printf("baud set is ok.\n");
            }
            /* if(cfsetospeed(&Opt,speed_arr) == 0)
            {
                printf("baud set is ok.\n");  
            }*/
            status = tcsetattr(fd,TCSANOW,&Opt);
            if (status != 0)
            {
                perror("tcsetattr fd");
                return;
            }
            tcflush(fd,TCIOFLUSH);
        }
    }  
}

/**  
*@brief     设置串口数据位,停止位和效验位  
*@param     fd         类型     int   打开的串口文件句柄  
*@param     databits   类型     int   数据位     取值   7或者8  
*@param     stopbits   类型     int   停止位     取值为  1或者2  
*@param     parity     类型     int   效验类型   取值为N,E,O,,S  
*/
  
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:
            printf("data bit is 8.\n");
            options.c_cflag |= CS8;
        break;
        default:
            fprintf(stderr,"Unsupported data size\n");
        return (FALSE);
    }
    switch (parity)
    {
        case 'n':
        case 'N':
            printf("parity is 'N'.\n");
            options.c_cflag &= ~PARENB;       /*   Clear   parity   enable   */
            options.c_iflag &= ~INPCK;           /*   Enable   parity   checking   */
        break;
        case 'o':
        case 'O':
            printf("parity is 'O'.\n");
            options.c_cflag |= (PARODD | PARENB);   /*   设置为奇效验*/
            options.c_iflag |= INPCK;            /*   Disnable   parity   checking   */
        break;
        case 'e':
        case 'E':
            printf("parity is 'E'.\n");
            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:
            printf("stop bit is 1.\n");
            options.c_cflag &= ~CSTOPB;
        break;
        case 2:
            printf("stop bit is 2.\n");
            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;
    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 main(int argc,char **argv)
{
    int fd,n = 0;
    int nread = 0;
    char buff_r[512];
    char buff_w[512];
    char *dev = "/dev/ttyS0";
    fd = OpenDev(dev);
    if (fd > 0)
        set_speed(fd,9600);
    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);
    }
    sprintf(buff_w,"0d 0d 0d 09 00 00 00");
    while(1)
    {
        n = write(fd,buff_w,buff_len_w); //写缓冲区
        if(n == -1)
        {
            printf("Wirte buff_w error.\n");
        }
        while((nread = read(fd,buff_r,buff_len_r)) > 0)
        {
            printf("\nLen %d\n",nread);
            buff_r[nread + 1] = '\0';
            printf("\n%s",buff_r);

        }
        sleep(1);
    }
    //close(fd);
    //exit(0);
}
 楼主| 发表于 2007-1-11 08:27:07 | 显示全部楼层
没人遇到过么?
回复 支持 反对

使用道具 举报

发表于 2007-1-18 17:20:40 | 显示全部楼层
你是在那个用户下运行的?
回复 支持 反对

使用道具 举报

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

本版积分规则

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