Linux下串口编程总结

Linux下串口编程总结

转自:http://blog.csdn.net/wcl719236538/article/details/55251368

 

#include
#include
#include
#include
#include
#include
#include
#include
#include
 
#define FALSE -1
#define TRUE 0
 
/*******************************************
 *函数名  :UART0_Open
 *函数功能:打开串口并返回串口设备文件描述符
 *参数    :fd:文件描述符
            port:串口号(ttyS0,ttyS1,ttyS2)
 *返回值  :正确返回1,错误返回0
 ********************************************/
int UART0_Open(int fd,char* port)
{
    fd = open(port,O_RDWR|O_NOCTTY|O_NDELAY);
    if(FALSE == fd)
    {
        perror("Can't Open Serial Port");
        return (FALSE);
    }
    
    //恢复串口为阻塞状态
    if(fcntl(fd,F_SETFL,0) < 0)
    {
        printf("fcntl failed!\n");
        return (FALSE);
    }
    else
    {
        printf("fcntl=%d\n",fcntl(fd,F_SETFL,0));
    }
    
    //测试是否为终端设备
    if(0 == isatty(STDIN_FILENO))
    {
        printf("standard input is not a terminal device\n");
        return (FALSE);
    }
    else
    {
        printf("isatty success!\n");
    }
    printf("fd->open=%d\n",fd);
 
    return fd;
}
 
/**************************************************
 *函数名称:UART0_Close
 *函数功能:关闭串口并返回串口设备的文件描述
 *参数    :fd:文件描述符
            port:串口号(ttys0,ttys1,ttys2)
 *返回值  :void
 * ************************************************/
void UART0_Close(int fd)
{
    close(fd);
}
 
/**************************************************
 *函数名称:UART0_Set
 *函数功能:设置串口数据位,停止位和校验位
 *参数    :fd串口文件描述符
            speed串口速度
            flow_ctrl:数据流控制
            databits:数据位取值为7或者8
            stopbits:停止位取值为1或者2
            parity:效验类型取值为N,E,O,S
 *返回值  :正确返回1,错误返回0
 * ************************************************/
int UART0_Set(int fd,int speed,int flow_ctrl,int databits,int stopbits,int parity)
{
    int i;
    int status;
    int speed_arr[]={B115200,B19200,B9600,B4800,B2400,B1200,B300};
    int name_arr[]={115200,19200,9600,4800,2400,1200,300};
 
    struct termios options;
    
    /*tcgetattr(fd,&options)得到与fd指向对象的相关参数,并将它们保存于options,该函数还可以测试配置是否正确,该串口是否可用等。若调用成功,函数返回值为0,若调用失败,函数返回值为1.  
    */
    if(tcgetattr(fd,&options)!=0)
    {
        perror("SetupSerial 1");
        return (FALSE);
    }
    
    //设置串口输入波特率和输出波特率
    for(i=0;i 0)  
            printf("send data successful\n");
        else
            printf("send data failed or nothing to send!\n");
 
        len = UART0_Recv(fd, rcv_buf,sizeof(rcv_buf)-1);
        if(len > 0)
        {
            rcv_buf[len] = '\0';
            printf("receive data is %s\n",rcv_buf);
        }
        else
        {
            printf("cannot receive data or data is null.\n");
        }
	memset(rcv_buf,'\0',sizeof(rcv_buf));
    }
 
    UART0_Close(fd);
}	memset(rcv_buf,'\0',sizeof(rcv_buf));
    }
 
    UART0_Close(fd);
}

 

 

 

 

 

我作了部分修改,注意一点,如果在在外部串口终端上显示乱码的话一般是波特率的问题,要保证波特率一致,如果确认一致了的话还是乱码,那么有可能是你程序写的有问题,好好检查一下,其它问题的话暂时没有遇到过。

运行命令:(可执行程序为test,转载网址上的代码运行命令为“./test /dev/ttySn n”,ttySn是你的设备号,n的话是0或者其它。运行命令牵扯到main函数的参数int argc和char* argv[],不明白的可以去百度相关的知识。)

./test

 Linux下串口编程总结_第1张图片

后续还会加上tcp网络编程,最终实现远程服务器和终端设备的交互。

 

你可能感兴趣的:(嵌入式)