android下运行serial

先source build/envsetup.sh
lunch 19
 cd development/ndk/...gpio/ 有andrloid.mk的目录

 mmm ./


myandroid_google_20131220\development\ndk\\serial\andrloid.mk:

LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)


LOCAL_MODULE    := serialtest
LOCAL_SRC_FILES := serial.c
include $(BUILD_EXECUTABLE)
#include $(BUILD_SHARED_LIBRARY)




#LOCAL_PATH := $(call my-dir)


#include $(CLEAR_VARS)




#LOCAL_MODULE := serial


#LOCAL_SRC_FILES := serial.c


#ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
#    LOCAL_CFLAGS := -DHAVE_NEON=1
#    LOCAL_SRC_FILES += helloneon-intrinsics.c.neon
#endif


#LOCAL_STATIC_LIBRARIES := cpufeatures
#BUILD_EXECUTABLE := serial
#LOCAL_LDLIBS := -llog


#include $(BUILD_SHARED_LIBRARY)


#$(call import-module,cpufeatures)


myandroid_google_20131220\development\ndk\\serial\serial.c

/* 串口操作需要的头文件 */
#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


/**
*@brief 设置串口通信速率
*@param fd     类型 int 打开串口的文件句柄
*@param speed  类型 int 串口速度
*@return void
*/


int speed_arr[] = { B115200,B38400, B19200, B9600, B4800, B2400, B1200, B300,
     B38400, B19200, B9600, B4800, B2400, B1200, B300, };
int name_arr[] = {115200,38400, 19200, 9600, 4800, 2400, 1200, 300,
     38400, 19200, 9600, 4800, 2400, 1200, 300, };
void set_speed(int fd, int speed)
{
int   i;
int   status;
struct termios   Opt;








tcgetattr(fd, &Opt);
Opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
{
   if (speed == name_arr[i])
   {
     tcflush(fd, TCIOFLUSH);
     cfsetispeed(&Opt, speed_arr[i]);
     cfsetospeed(&Opt, speed_arr[i]);
     status = tcsetattr(fd, TCSANOW, &Opt);
     if (status != 0)
       perror("tcsetattr fd1");
       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;
    options.c_cflag |= CRTSCTS; //CNEW_RTSCTS;  //设置cts rts 流控
    switch (databits) /*设置数据位数*/
    {
        case 7:
           options.c_cflag |= CS7;
           break;
        case 8:
           options.c_cflag |= CS8;
           break;
        default:
           fprintf(stderr,"Unsupported data size\n");
           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 parity\n");
           return (FALSE);
    }
    /* 设置停止位 */
    switch (stopbits)
    {
        case 1:
           options.c_cflag &= ~CSTOPB;
           break;
        case 2:
           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;
    //options.c_cc[VTIME] = 150; // 15 seconds
    //options.c_cc[VMIN] = 0;


    tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
    if (tcsetattr(fd,TCSANOW,&options) != 0)
    {
       perror("SetupSerial 3");
       return (FALSE);
    }
    return (TRUE);
}
/**
*@breif \u6253\u5f00\u4e32\u53e3
*/
int OpenDev(char *Dev)
{
    int fd = open( Dev, O_RDWR|O_NONBLOCK);         //以读写方式打开串口(或O_NOCTTY、 O_NDELAY  //O_NONBLOCK
    if (-1 == fd)
    {
        perror("Can't Open Serial Port");/*等于-1则表示不能打开串口一,报错信息*/
        return -1;
    }
    else
    return fd;/*能打开则返回句柄值*/
}
/**
*@breif main()
*/
int main(int argc, char **argv) //
{
    int fd; //定义返回句柄变量
    int nread; //定义读字节个数
    int nwrite; //定义写字节个数
    char buff_r[512]; //读到的字节储存数组
    char buff_w[512]; //写字节的存储数组
    int i = 0;
int w=0;
char *dev;
if(argc ==2)
{
dev = argv[1];
}
else
{
    dev ="/dev/ttyUSB1"; //设备路径指针变量,指向设备文件
}
    printf("1\n");
    fd = OpenDev(dev); //打开此指针变量所指向的设备,并返回句柄值
    if (fd>0) //如果句柄为正,表示正确打开
    set_speed(fd,9600); //设置波特率
    else
    {
        printf("Can't Open Serial Port!\n"); //句柄为负表示打开串口失败,打印错误信息
        exit(0); //
    }
    printf("2\n");
    if (set_Parity(fd,8,1,'E')== FALSE) //设置效验函数,并判断返回值的布尔类型  注意这里有校验 
    {
        printf("Set Parity Error\n"); //为FALSE则表示设置错误
        exit(1); //
    }
    printf("3\n");
int n=2;
    while(1) //主函数大循环
    {
       // printf("write abcdefg\n"); 
        if(n>=0)
{
w=write(fd,"start",5); 
printf("w=%d\n",w);
n--;

sleep(1);
        if((nread = read(fd,buff_r,512))>0) //读字节的个数为正
        {
            buff_r[nread]='\0'; //将读到的字节下一个单元写入空字符NULL
            printf("read:%d\n",nread);
            sleep(1);
//打印读到的字符数组元素
            for(i=0;i<nread;i++)
            {
              printf("%02x \n",buff_r[i]);
            }
            printf("\n");
//            printf("\nLen %d\n",nread); //
sleep(1);
            w=write(fd,buff_r,(nread)); //将读到的字符原样输出
printf("w1=%d\n",w);
        }
        printf("recieved...len=%d\n",nread);
        if(1)
        {
         // usleep(10);
        }
    }
    close(fd); //
    exit(0); //
    return 0; //
}



先source build/envsetup.sh

lunch sabresd_6dq-user


./mmm serial


[2014/9/2 14:22:58] shilin wang: LOCAL_PATH := $(call my-dir)


include $(CLEAR_VARS)


LOCAL_MODULE    := serialtest
LOCAL_SRC_FILES := serial.c
include $(BUILD_EXECUTABLE)
#include $(BUILD_SHARED_LIBRARY)
[2014/9/2 14:23:13] shilin wang: 就这几句就行了

你可能感兴趣的:(android下运行serial)