linux 串口应用程序接口

一、 linux 系统硬件串口测试应用demo之回环测试

#include <stdio.h>  
#include <stdlib.h>  
#include <string.h>  
#include <sys/types.h>  
#include <sys/stat.h>  
#include <fcntl.h>  
#include <unistd.h>  
#include <termios.h>  

int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)  
{  
    struct termios newtio,oldtio;  
    if  ( tcgetattr( fd,&oldtio)  !=  0) {  
        perror("SetupSerial 1");  
        return -1;  
    }  
    bzero( &newtio, sizeof( newtio ) );  
    newtio.c_cflag  |=  CLOCAL | CREAD; //CLOCAL:忽略modem控制线  CREAD:打开接受者  
    newtio.c_cflag &= ~CSIZE; //字符长度掩码。取值为:CS5,CS6,CS7或CS8  

    switch( nBits )  
    {  
    case 7:  
        newtio.c_cflag |= CS7;  
        break;  
    case 8:  
        newtio.c_cflag |= CS8;  
        break;  
    }  

    switch( nEvent )  
    {  
    case 'O':  
        newtio.c_cflag |= PARENB; //允许输出产生奇偶信息以及输入到奇偶校验  
        newtio.c_cflag |= PARODD;  //输入和输出是奇及校验  
        newtio.c_iflag |= (INPCK | ISTRIP); // INPACK:启用输入奇偶检测;ISTRIP:去掉第八位  
        break;  
    case 'E':  
        newtio.c_iflag |= (INPCK | ISTRIP);  
        newtio.c_cflag |= PARENB;  
        newtio.c_cflag &= ~PARODD;  
        break;  
    case 'N':   
        newtio.c_cflag &= ~PARENB;  
        break;  
    }  

    switch( nSpeed )  
    {  
    case 2400:  
        cfsetispeed(&newtio, B2400);  
        cfsetospeed(&newtio, B2400);  
        break;  
    case 4800:  
        cfsetispeed(&newtio, B4800);  
        cfsetospeed(&newtio, B4800);  
        break;  
    case 9600:  
        cfsetispeed(&newtio, B9600);  
        cfsetospeed(&newtio, B9600);  
        break;  
    case 115200:  
        cfsetispeed(&newtio, B115200);  
        cfsetospeed(&newtio, B115200);  
        break;  
    case 460800:  
        cfsetispeed(&newtio, B460800);  
        cfsetospeed(&newtio, B460800);  
        break;  
    default:  
        cfsetispeed(&newtio, B9600);  
        cfsetospeed(&newtio, B9600);  
        break;  
    }  

    if( nStop == 1 )  
        newtio.c_cflag &=  ~CSTOPB; //CSTOPB:设置两个停止位,而不是一个  
    else if ( nStop == 2 )  
        newtio.c_cflag |=  CSTOPB;  

    newtio.c_cc[VTIME]  = 0; //VTIME:非cannoical模式读时的延时,以十分之一秒位单位  
    newtio.c_cc[VMIN] = 0; //VMIN:非canonical模式读到最小字符数  
    tcflush(fd,TCIFLUSH); // 改变在所有写入 fd 引用的对象的输出都被传输后生效,所有已接受但未读入的输入都在改变发生前丢弃。  
    if((tcsetattr(fd,TCSANOW,&newtio))!=0) //TCSANOW:改变立即发生  
    {  
        perror("com set error");  
        return -1;  
    }  
    printf("set done!\n\r");  
    return 0;  
}  

int main(void)  
{  
    int fd1,nset,nread,ret;  
    char buf[100]={"test com data!...........\n"};  
    char buf1[100];  

    fd1 = open( "/dev/ttyS1", O_RDWR);  
    if (fd1 == -1)  
        exit(1);  
    printf("open  S1 success!!\n");  
    nset = set_opt(fd1, 115200, 8, 'N', 1);  
    if (nset == -1)  
        exit(1);  
    printf("SET  S1 success!!\n");  
    printf("enter the loop!!\n");  

    while (1)  
    {   
        memset(buf1, 0, sizeof(buf1));  
        ret = write(fd1, buf, 100);  
        if( ret > 0){  
            printf("write success!  wait data receive\n");  
        }  
        nread = read(fd1, buf1, 100);  
        if(nread > 0){  
            printf("redatad: nread = %s\n", buf1);
            printf("circle test success\n");
        }  
        sleep(1);  
    }  
    close(fd1);  
    return 0;  
}

二、 linux 串口应用之阻塞与非阻塞
1、概念
阻塞的定义:
read: 对于read,block指当串口输入缓冲区没有数据的时候,read函数将会阻塞在这里,移植到串口输入缓冲区中有数据可读取,read读到了需要的字节数之后,返回值为读到的字节数;
write: 对于write,block指当串口输出缓冲区满,或剩下的空间小于将要写入的字节数,则write将阻塞,一直到串口输出缓冲区中剩下的空间大于等于将要写入的字节数,执行写入操作,返回写入的字节数。

非阻塞的定义:
read: 对于read,no block指当串口输入缓冲区没有数据的时候,read函数立即返回,返回值为0。
write: 对于write,no block指当串口输出缓冲区满,或剩下的空间小于将要写入的字节数,则write将进行写操作,写入当前串口输出缓冲区剩下空间允许的字节数,然后返回写入的字节数。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值