uart读写函数

seri_write.c 

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.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; 
    newtio.c_cflag &= ~CSIZE; 

    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);
            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;
        default:
            cfsetispeed(&newtio, B9600);
            cfsetospeed(&newtio, B9600);
            break;
    }
    if( nStop == 1 )
    {
        newtio.c_cflag &=  ~CSTOPB;
    }
    else if ( nStop == 2 )
    {
        newtio.c_cflag |=  CSTOPB;
    }
    newtio.c_cc[VTIME]  = 0;
    newtio.c_cc[VMIN] = 0;
    tcflush(fd,TCIFLUSH);
    if((tcsetattr(fd,TCSANOW,&newtio))!=0)
    {
        perror("com set error");
        return -1;
    }
    printf("set done!\n");
    return 0;
}

int open_port(int fd,int comport)
{
    char *dev[]={"/dev/ttymxc0","/dev/ttymxc1","/dev/ttymxc2","/dev/ttymxc3","/dev/ttymxc4","/dev/ttyUSB0","/dev/ttyUSB1"};
    long  vdisable;
    if (comport==1)
    {
//        fd = open( "/dev/ttymxc0", O_RDWR|O_NOCTTY|O_NDELAY);
        fd = open( "/dev/ttymxc0", O_RDWR|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
        else 
        {
            printf("open ttymxc0 .....\n");
        }
    }
    else if(comport==2)
    {
        fd = open( "/dev/ttymxc1", O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
        else 
        {
            printf("open ttymxc1 .....\n");
        }    
    }
    else if (comport==3)
    {
        fd = open( "/dev/ttymxc2", O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
        else 
        {
            printf("open ttymxc2 .....\n");
        }
    }
    else if (comport==4)
    {
        fd = open( "/dev/ttymxc3", O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
        else 
        {
            printf("open ttymxc3 .....\n");
        }
    }
    else if (comport==5)
    {
        fd = open( "/dev/ttymxc4", O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
        else 
        {
            printf("open ttymxc4 .....\n");
        }
    }
    else if (comport==6)
    {
        fd = open( "/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
        else 
        {
            printf("open ttyUSB0 .....\n");
        }
    }
    else if (comport==7)
    {
        fd = open( "/dev/ttyUSB1", O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
        else 
        {
            printf("open ttyUSB1 .....\n");
        }
    }

    if(fcntl(fd, F_SETFL, 0)<0)
    {
        printf("fcntl failed!\n");
    }
    else
    {
        printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
    }

    if(isatty(STDIN_FILENO)==0)
    {
        printf("standard input is not a terminal device\n");
    }
    else
    {
        printf("isatty success!\n");
    }

    printf("fd-open=%d\n",fd);
    return fd;
}

int main(void)
{
    int fd;
    int nread,i;
    char buff[]="Hello world! \r\n";

    int select;
    printf("select:     1          2          3          4          5         6         7      \n");
    printf("ttyXXX:     ttymxc0    ttymxc1    ttymxc2    ttymxc3    ttymxc4   ttyUSB0   ttyUSB1\n");
    printf("input a count : select >");
    scanf("%d", &select);

    if((fd=open_port(fd,select))<0)
    {
        perror("open_port error");
        return 0;
    }

    if((i=set_opt(fd,115200,8,'N',1))<0)
    {
        perror("set_opt error");
        return 0;
    }
    printf("fd=%d\n",fd);

    while(1)
    {
//        nread=read(fd,buff,8);
        nread=write(fd,buff,sizeof(buff));
        printf("nread=%d,%s\n",nread,buff);
        sleep(1);
    }

    close(fd);

    return 0;
}

 

seri_read.c

 

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.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; 
    newtio.c_cflag &= ~CSIZE; 

    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);
            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;
        default:
            cfsetispeed(&newtio, B9600);
            cfsetospeed(&newtio, B9600);
            break;
    }
    if( nStop == 1 )
    {
        newtio.c_cflag &=  ~CSTOPB;
    }
    else if ( nStop == 2 )
    {
        newtio.c_cflag |=  CSTOPB;
    }
    newtio.c_cc[VTIME]  = 0;
    newtio.c_cc[VMIN] = 0;
    tcflush(fd,TCIFLUSH);
    if((tcsetattr(fd,TCSANOW,&newtio))!=0)
    {
        perror("com set error");
        return -1;
    }
    printf("set done!\n");
    return 0;
}

int open_port(int fd,int comport)
{
    char *dev[]={"/dev/ttymxc0","/dev/ttymxc1","/dev/ttymxc2","/dev/ttymxc3","/dev/ttymxc4"};
    long  vdisable;
    if (comport==1)
    {
//        fd = open( "/dev/ttymxc0", O_RDWR|O_NOCTTY|O_NDELAY);
        fd = open( "/dev/ttymxc0", O_RDWR|O_NDELAY|O_NOCTTY);
        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
        else 
        {
            printf("open ttymxc0 .....\n");
        }
    }
    else if(comport==2)
    {
        fd = open( "/dev/ttymxc1", O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
        else 
        {
            printf("open ttymxc1 .....\n");
        }    
    }
    else if (comport==3)
    {
        fd = open( "/dev/ttymxc2", O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
        else 
        {
            printf("open ttymxc2 .....\n");
        }
    }
    else if (comport==4)
    {
        fd = open( "/dev/ttymxc3", O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
        else 
        {
            printf("open ttymxc3 .....\n");
        }
    }
    else if (comport==5)
    {
        fd = open( "/dev/ttymxc4", O_RDWR|O_NOCTTY|O_NDELAY);
        if (-1 == fd)
        {
            perror("Can't Open Serial Port");
            return(-1);
        }
        else 
        {
            printf("open ttymxc4 .....\n");
        }
    }

    if(fcntl(fd, F_SETFL, 0)<0)
    {
        printf("fcntl failed!\n");
    }
    else
    {
        printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
    }

    if(isatty(STDIN_FILENO)==0)
    {
        printf("standard input is not a terminal device\n");
    }
    else
    {
        printf("isatty success!\n");
    }

    printf("fd-open=%d\n",fd);
    return fd;
}

char buff[1024];
int main(void)
{
    int fd;
    int nread,i;

    int select;
    printf("select:     1          2          3          4          5               \n");
    printf("ttyXXX:     ttymxc0    ttymxc1    ttymxc2    ttymxc3    ttymxc4   \n");
    printf("input a count : select >");
    scanf("%d", &select);

    if((fd=open_port(fd,select))<0)
    {
        perror("open_port error");
        return 0;
    }

    if((i=set_opt(fd,115200,8,'N',1))<0)
    {
        perror("set_opt error");
        return 0;
    }
    printf("fd=%d\n",fd);

    char rc;
    while(1)
    {
        nread=read(fd,&rc,1);
        if (nread==1)
            printf("%c", rc);
    }

    close(fd);

    return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Android平台上,UART(Universal Asynchronous Receiver-Transmitter,通用异步收发器)通信通常用于连接外部硬件设备,如传感器、蓝牙模块或GPS接收器等。由于Android并不直接支持UART,你需要借助第三方库或者使用JNI(Java Native Interface)来实现这一功能。 **实现步骤**: 1. **添加依赖库**: - 如果使用Java,可以选择开源库如`android-serialport-api`或`android-serial`。 - 如果使用Kotlin,也可以考虑`kotlin-serial-port-api`。 2. **创建JNI接口**: - 在Android项目的JNI目录下创建JNI文件(例如:src/main/jni/SerialPort.cpp),并编写C/C++代码来处理底层的串口操作。 3. **注册JNI函数**: - 在AndroidManifest.xml中声明native方法,并在Java代码中调用这些函数来与JNI交互。 4. **打开串口**: - 使用JNI打开设备的串口,设置波特率、数据位、校验位和停止位等参数。 5. **数据传输**: - 发送和接收数据时,同样通过JNI调用相应的函数,将Java中的字符串转换为字节数组,然后发送到串口;从串口接收数据后,也需要解析成字符串。 6. **错误处理**: - 添加异常处理,比如检查串口是否打开成功,数据传输是否出错等。 **相关问题--:** 1. Android中如何通过JNI访问底层的UART驱动? 2. 如何在Android应用中处理串口数据的读写同步问题? 3. 是否可以在Android的主线程上直接操作UART?如果不能,应该如何避免阻塞UI线程?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值