linux 串口通訊

來源:互聯網
上載者:User
#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>      /*錯誤號碼定義*/
#include     <time.h>

#define BAUDRATE B9600
#define DEVICE "/dev/ttyS0"
#define _POSIX_SOURCE 1
#define FALSE 0
#define TRUE 1

/***@brief  設定串口通訊速率
 *@param  fd     類型 int  開啟串口的檔案控制代碼
 *@param  speed  類型 int  串口速度
 *@return  void*/

int speed_arr[] = {B38400, B19200, B9600, B4800, B2400, B1200, B300,
    B38400, B19200, B9600, B4800, B2400, B1200, B300,};
int name_arr[] = {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);
    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;
    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 開啟串口
 */
int OpenDev(char *Dev) {
    int fd = open(Dev, O_RDWR); //| O_NOCTTY | O_NDELAY
    if (-1 == fd) { /*設定資料位元數*/
        perror("Can't Open Serial Port");
        return -1;
    } else
        return fd;

}

/**
 *@breif 輸出位元組數組
 */
void printfCharArr(unsigned char buff[] ,int len) {
    int i;
    //int len = sizeof (buff) / sizeof (unsigned char);
    //printf("長度是%d",len);
    for (i = 0; i<len; i++) {
        printf("%X ", buff[i]);
    }
    printf("\n");
}

/**
 *@breif     main()
 */
int main(int argc, char **argv) {
    int fd; //定義通訊控制代碼
    int nread; //定義讀取位元組長度
    unsigned char buff[512]; //定義串口接收位元組數組
    char *dev = "/dev/ttyS0"; //串口選擇
    fd = OpenDev(dev); //開啟串口
    if (fd > 0) {
        printf("Open Serial Port!%d\n", fd);
        set_speed(fd, 4800); //開啟串口成功設定傳輸速率
    } else {
        printf("Can't Open Serial Port!\n");
        exit(0);
    }
    if (set_Parity(fd, 8, 1, 'E') == FALSE) { //設定校正位,校正類型
        printf("Set Parity Error\n");
        exit(1);
    }
    //設定發送位元組數組
    unsigned char cbuf[] = {0x68, 0x22, 0x44, 0x70, 0x00, 0x00
        , 0x00, 0x68, 0x01, 0x02, 0x52, 0xC3, 0xBE, 0x16};
    int res_w = write(fd, cbuf, 14); //向串口發送資料
    //如果發送成功則輸出發送位元組數組內容
    if (res_w > 0) {
        printfCharArr(cbuf,14);
    }
    sleep(1); //等待1秒
    //等待接收返回資訊
    if ((nread = read(fd, buff, 512)) > 0) {
        printfCharArr(buff,nread);
    }
    printf("********************************");
    close(fd);
    exit(0);
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.