串口发送接收+mini2440 linux

53 篇文章 0 订阅

分类: LINUX

下面是mini2440的发送程序,
arm-linux-gcc -o send send.c

起初用串口线跟mini2440的232接口想连接,但是不理想,可能是
mini2440的232转换芯片不好使,反正怎么都调试不通过。看看原理
图,发现有个con1,就是对应着串口1的cpu的ttl引脚,连上就ok了。

send.c-------------------------------------
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>      
#include <termios.h>      
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BAUDRATE B115200     
#define DEV "/dev/tts/0"
#define _POSIX_SOURCE 1 /* POSIX compliant source */      

#define FALSE 0      
#define TRUE 1              

volatile int STOP=FALSE;            

main() {
    int fd,c, res;  
    struct termios oldtio,newtio;    
    char buf[255];

    fd = init_dev(&oldtio); 

    while (STOP==FALSE) {
        send_cmd(fd,"hello");putchar(0x0d);
        usleep(500000);
    }

    tcsetattr(fd,TCSANOW,&oldtio);

}

/* write the users command out the serial port */
int send_cmd(int ftty,char * str)
    {
     int result;
     result = write(ftty,str,strlen(str));/*argv[4], strlen(argv[4]));*/
     if (result < 0)
    {
        printf("Write command:%s to serial failed\n",str);
        close(ftty);
        exit(1);
    }
}

int init_dev(struct termios *oldtio)
{
    int fd,status;
    unsigned char cmd[17];
    struct termios newtio;

    //open carmo device
    fd = open(DEV, O_RDWR| O_NOCTTY|O_NDELAY);
    if (fd ==-1)
    {
        perror("open"DEV);
        return -1;
    }
    else //set to block;
        fcntl(fd, F_SETFL,0);
    printf("open serial ok\n");
    tcgetattr(fd,oldtio); //save current serial port settings
    bzero(&newtio, sizeof(newtio)); // clear struct for new port settings

    //configure the serial port;
    cfsetispeed(&newtio,B115200);
    cfsetospeed(&newtio,B115200);
    newtio.c_cflag |=CLOCAL|CREAD;
    /*8N1*/
    newtio.c_cflag &= ~CSIZE; /* Mask the character size bits */
    newtio.c_cflag |= CS8; /* Select 8 data bits */
    newtio.c_cflag &= ~PARENB;
    newtio.c_cflag &= ~CSTOPB;
    newtio.c_cflag &= ~CRTSCTS;//disable hardware flow control;
    newtio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);/*raw input*/
    newtio.c_oflag &= ~OPOST; /*raw output*/
    tcflush(fd,TCIFLUSH);//clear input buffer
    newtio.c_cc[VTIME] = 100; /* inter-character timer unused */
    newtio.c_cc[VMIN] = 0; /* blocking read until 0 character arrives */
    tcsetattr(fd,TCSANOW,&newtio);

    return fd;
}

接收串口代码,在pc上使用。
rsv.c-------------------------------
#include <sys/types.h>      
#include <sys/stat.h>      
#include <fcntl.h>      
#include <termios.h>      
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BAUDRATE B115200     
#define DEV "/dev/ttyS0"
#define _POSIX_SOURCE 1 /* POSIX compliant source */      

#define FALSE 0      
#define TRUE 1              

volatile int STOP=FALSE;            

main() {
    int fd,c, res;   
    char buf[255];

    fd = open(DEV, O_RDWR| O_NOCTTY|O_NDELAY);
    if (fd ==-1)
    {
        perror("open"DEV);
        return -1;
    }
    else //set to block;
        fcntl(fd, F_SETFL,0);
    printf("open serial ok\n");


    if(cfg_serial(fd,8,1,'N')== FALSE)
    {
        printf("cfg serial Error\n");
        exit(1);
    }

    printf("start recieve\n");
    while (STOP==FALSE) {       /* loop for input */
        static counter = 0;
        counter ++;
        res = read(fd,buf,200);   /* returns after 200 chars have been input */    
        buf[res]=0;               /* so we can printf... */  
        printf("%d(%d)\t%s\n",counter,res,buf);
        fflush(stdout);
        if(buf[0]=='z') STOP=TRUE;    
    }

}


/*
*@brief   设置串口数据位,停止位和效验位
*@param fd     类型 int 打开的串口文件句柄*
*@param databits 类型 int 数据位   取值 为 7 或者8*
*@param stopbits 类型 int 停止位   取值为 1 或者2*
*@param parity 类型 int 效验类型 取值为N,E,O,S
*/
int cfg_serial(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:
            options.c_cflag |= CS8;
            break;
        default:
            fprintf(stderr,"Unsupported data size\n");
            return (FALSE);
    }

    /*设置校验方式*/
    switch (parity)
    {
        case 'n':
        case 'N':
            options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
            options.c_oflag &= ~OPOST;   /*Output*/
            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')&&(parity != 'N'))
    options.c_iflag |= INPCK;

    options.c_cc[VTIME] = 5; // 0.5 seconds
    options.c_cc[VMIN] = 1;

    options.c_cflag &= ~HUPCL;
    options.c_iflag &= ~INPCK;
    options.c_iflag |= IGNBRK;
    options.c_iflag &= ~ICRNL;
    options.c_iflag &= ~IXON;
    options.c_lflag &= ~IEXTEN;
    options.c_lflag &= ~ECHOK;
    options.c_lflag &= ~ECHOCTL;
    options.c_lflag &= ~ECHOKE;
    options.c_oflag &= ~ONLCR;

    tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */
    if (tcsetattr(fd,TCSANOW,&options) != 0)
    {
        perror("SetupSerial");
        return (FALSE);
    }
    return (TRUE);
}

上面的函数都是从网上找来的,做个技术积累。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值