linux串口通信

#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <time.h>
#include <ctype.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <pthread.h>
#include <strings.h>
#include <unistd.h>
#include <string.h>

pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
//int tty_fd[3] = {0};
int tty_fd1 = -1;
int tty_fd2 = -1;
int tty_fd3 = -1;

pthread_t tty_pid[6] = {0};

#define FALSE 0;
#define TRUE 1;
int a[2] = {0};

int ConBaurate(unsigned long int baudrate)
{
    switch (baudrate)
    {
        case 2400:
            return B2400;
        case 4800:
            return B4800;
        case 9600:
            return B9600;
        case 19200:
            return B19200;
        case 38400:
            return B38400;
        case 57600:
            return B57600;
        case 115200:
            return B115200;
        case 230400:
            return B230400;
        default:
            return B115200;
    }
}

int OpenTTY(char *dev, int baudrate)
{
    int fdcom = 0;
    struct termios termios_old, termios_new;
    int tmpbaudrate, tmp;
    char databit, stopbit, parity;
    bzero(&termios_old, sizeof(termios_old));
    bzero(&termios_new, sizeof(termios_new));
    fdcom = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK | O_NDELAY);
    if (fdcom < 0)
    {
        printf("open %s failed", dev);
        return fdcom;
    }

    cfmakeraw(&termios_new);
    tcgetattr(fdcom, &termios_old); // get the serial port

    // attributions

    // baudrates
    tmpbaudrate = ConBaurate(baudrate);
    cfsetispeed(&termios_new, tmpbaudrate);
    cfsetospeed(&termios_new, tmpbaudrate);
    termios_new.c_cflag |= (CLOCAL | CREAD);
    termios_new.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
    /*
     * fctl = pportinfo-> fctl; switch(fctl){ case '0':{
     * termios_new.c_cflag &= ~CRTSCTS; //no flow control }break; case
     * '1':{ termios_new.c_cflag |= CRTSCTS; //hardware flow control
     * }break; case '2':{ termios_new.c_iflag |= IXON | IXOFF |IXANY;
     * //software flow control }break; }
     */

    termios_new.c_cflag &= ~CSIZE;
    databit = 8;
    switch (databit)
    {
        case '5':
            termios_new.c_cflag |= CS5;
        case '6':
            termios_new.c_cflag |= CS6;
        case '7':
            termios_new.c_cflag |= CS7;
        default:
            termios_new.c_cflag |= CS8;
    }

    parity = 0;
    switch (parity)
    {
        case '0':
        {
            termios_new.c_cflag &= ~PARENB; // no parity check
        }
        break;
        case '1':
        {
            termios_new.c_cflag |= PARENB; // odd check
            termios_new.c_cflag |= PARODD;
        }
        break;
        case '2':
        {
            termios_new.c_cflag |= PARENB; // even check
            termios_new.c_cflag = ~PARODD;
        }
        break;
        case '3':
        {
            termios_new.c_cflag = ~PARENB; // space check
        }
    }

    stopbit = '1';
    if (stopbit == '2')
    {
        termios_new.c_cflag |= CSTOPB; // 2 stop bits
    }
    else
    {
        termios_new.c_cflag &= ~CSTOPB; // 1 stop bits
    }

    // other attributions default
    termios_new.c_oflag &= ~OPOST;
    termios_new.c_oflag &= ~(ONLCR | ICRNL);
    termios_new.c_iflag &= ~(ICRNL | INLCR);
    termios_new.c_iflag &= ~(IXON | IXOFF | IXANY);
    termios_new.c_cc[VMIN] = 0;
    termios_new.c_cc[VTIME] = 0;
    tcflush(fdcom, TCIFLUSH);
    tmp = tcsetattr(fdcom, TCSANOW, &termios_new);
    return fdcom;
}

//初始化串口
unsigned char UART_Init()
{
    tty_fd1 = OpenTTY("/dev/ttyS2", 115200); //可见光
    if (-1 == tty_fd1)
    {
        puts("init ttyS2 failed");
        return FALSE;
    }
    else
    {
        puts("init ttyS2 successed");
    }

    tty_fd2 = OpenTTY("/dev/ttyS4", 230400); //陀螺板
    if (-1 == tty_fd2)
    {
        puts("init ttyS4 failed");
        return FALSE;
    }
    else
    {
        puts("init ttyS4 successed");
    }

    tty_fd3 = OpenTTY("/dev/ttyS3", 230400); //飞机端

    if (-1 == tty_fd3)
    {
        puts("init ttyS3 failed");
        return FALSE;
    }
    else
    {
        puts("init ttyS3 successed");
    }

    return TRUE;
}

int SendUartBuffer(int serial_fd, unsigned char* pData, int len)
{
    return write(serial_fd, pData, len);
}


int RecvUartBuffer(int serial_fd, unsigned char* pData, int len)
{
    int ret = -1;
    ret = read(serial_fd, pData, len);
    return ret;
}


static void *thread_start_ttyS2(void *arg)
{
    printf("thread_start_ttyS2!\n");
    unsigned char pData[] = {0xFE,0x55,0x01,0x00,0x04,0x01,0x02,0x1C,0x00,0x02,0x73,0x02,0x01,0x00,0x49,0x2D};
    int len = sizeof(pData);
    int writeLen = 0;
    // printf("len = %d\n",len);
    while(1)
    {
        // writeLen = SendUartBuffer(tty_fd1, pData, len);
        //usleep(400);
        pthread_mutex_lock(&g_mutex);
        a[0] = 1;
        printf("-------a[0] = %d--------\n",a[0]);
        sleep(4);
        pthread_mutex_unlock(&g_mutex);

     }
}

// static void *thread_start_ttys2_read()
// {
//     unsigned char readData[255] = {0};
//     char buf[1024] = {0};
//     int readLen = 0;
//     while(1)
//     {
//         readLen = RecvUartBuffer(tty_fd1, readData, 255);
//         if(readLen > 0) {
//           printf("readLen = %d ",readLen);
//           for(int i =0; i < readLen; i++) {
//               printf("%02X ",readData[i]);
//           }
//           printf("\n");
//           bzero(readData,sizeof(readData));
//         }
//         usleep(400);
//        // sleep(1);
//     }
// }


// static void *thread_start_ttyS3(void *arg)
// {
//     unsigned char pData[] = {0xFE,0x55,0x01,0x00,0x04,0x01,0x02,0x1C,0x00,0x02,0x73,0x02,0x01,0x00,0x49,0x2D};
//     int len = sizeof(pData);
//     int writeLen = 0;
//     printf("len = %d\n",len);
//     while(1)
//     {
//         writeLen = SendUartBuffer(tty_fd3, pData, len);
//         //usleep(400);
//         usleep(100);
//      }

// }

// static void *thread_start_ttys3_read()
// {
//     unsigned char readData[255] = {0};
//     char buf[1024] = {0};
//     int readLen = 0;
//     while(1)
//     {
//         readLen = RecvUartBuffer(tty_fd3, readData, 255);
//         if(readLen > 0) {
//           printf("readLen = %d ",readLen);
//           for(int i =0; i < readLen; i++) {
//               printf("%02X ",readData[i]);
//           }
//           printf("\n");
//           bzero(readData,sizeof(readData));
//         }
//         usleep(400);
//        // sleep(1);
//     }
// }



static void *thread_start_ttyS4(void *arg)
{
    unsigned char pData[] = {0xFE,0x55,0x01,0x00,0x04,0x01,0x02,0x1C,0x00,0x02,0x73,0x02,0x01,0x00,0x49,0x2D};
    int len = sizeof(pData);
    int writeLen = 0;
    // printf("len = %d\n",len);
    while(1)
    {
        // pthread_mutex_lock(&g_mutex);
        // writeLen = SendUartBuffer(tty_fd2, pData, len);
        // pthread_mutex_unlock(&g_mutex);
        //usleep(400);
                sleep(1);

        a[1] = 4;
        printf("--------a[1] = %d---------\n",a[1]);
     }
}

// static void *thread_start_ttys4_read()
// {
//     unsigned char readData[255] = {0};
//     char buf[1024] = {0};
//     int readLen = 0;
//     while(1)
//     {
//         pthread_mutex_lock(&g_mutex);
//         readLen = RecvUartBuffer(tty_fd2, readData, 255);
//         pthread_mutex_unlock(&g_mutex);
//         if(readLen > 0) {
//           printf("readLen = %d ",readLen);
//           for(int i =0; i < readLen; i++) {
//               printf("%02X ",readData[i]);
//           }
//           printf("\n");
//           bzero(readData,sizeof(readData));
//         }
//         usleep(400);
//        // sleep(1);
//     }
// }

void CreateUartPhtread()
{
    int ret = -1;
    ret = pthread_create(&tty_pid[0], NULL, &thread_start_ttyS2, NULL);
    if(0 != ret) {
        printf("create thread_ttyS2 fail!\n");
        return ;
    }

    ret = pthread_create(&tty_pid[1], NULL, &thread_start_ttyS4, NULL);
    if(0 != ret) {
        printf("create thread_ttyS4 fail!\n");
        return ;
    }

    // ret = pthread_create(&tty_pid[2], NULL, &thread_start_ttyS3, NULL);
    // if(0 != ret) {
    //     printf("create thread_ttyS3 fail!\n");
    //     return ;
    // }

    // ret = pthread_create(&tty_pid[3], NULL, &thread_start_ttys4_read, NULL);
    // if(0 != ret) {
    //     printf("create thread_start_ttys4_read  fail!\n");
    //     return ;
    // }

    // ret = pthread_create(&tty_pid[4], NULL, &thread_start_ttys3_read, NULL);
    // if(0 != ret) {
    //     printf("create thread_start_ttys3_read  fail!\n");
    //     return ;
    // }

    // ret = pthread_create(&tty_pid[5], NULL, &thread_start_ttys2_read, NULL);
    // if(0 != ret) {
    //     printf("create thread_start_ttys2_read  fail!\n");
    //     return ;
    // }
}


int main()
{
    puts("--------1-----");
    if(!UART_Init())
    {
        printf("uart_Init fail!\n");
        return -1;
    }

    CreateUartPhtread();
    while(1);

    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Linux系统中,串口通信是通过串口驱动程序来实现的。下面是一个简单的Linux串口通信的步骤: 1. 打开串口设备文件 在Linux系统中,每个串口设备都对应一个设备文件,例如/dev/ttyS0、/dev/ttyS1等。要使用串口,首先需要打开串口设备文件。可以使用open()函数来打开串口设备文件,例如: ``` int fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NDELAY); ``` 其中,/dev/ttyS0是串口设备文件的路径,O_RDWR表示以读写方式打开文件,O_NOCTTY表示该串口不作为控制终端,O_NDELAY表示在读取串口时不会阻塞。 2. 配置串口参数 打开串口设备文件之后,需要设置串口的通信参数,例如波特率、数据位、停止位、校验位等。可以使用termios结构体来设置串口参数,例如: ``` struct termios options; // 获取当前串口参数 tcgetattr(fd, &options); // 设置波特率为9600 cfsetispeed(&options, B9600); cfsetospeed(&options, B9600); // 设置数据位为8 options.c_cflag &= ~CSIZE; options.c_cflag |= CS8; // 设置停止位为1 options.c_cflag &= ~CSTOPB; // 设置校验位为无校验 options.c_cflag &= ~(PARENB | PARODD); // 应用设置 tcsetattr(fd, TCSANOW, &options); ``` 3. 读写串口数据 设置完串口参数之后,就可以进行数据的读写操作了。可以使用read()函数从串口读取数据,例如: ``` char buf[1024]; int nbytes = read(fd, buf, sizeof(buf)); ``` 其中,fd是串口设备文件的文件描述符,buf是用于存储读取数据的缓冲区,sizeof(buf)表示最多读取的字节数,nbytes是实际读取的字节数。 可以使用write()函数向串口写入数据,例如: ``` char buf[] = "hello, world!"; write(fd, buf, strlen(buf)); ``` 其中,fd是串口设备文件的文件描述符,buf是要写入的数据,strlen(buf)表示要写入的字节数。 4. 关闭串口设备文件 使用完串口之后,需要关闭串口设备文件,可以使用close()函数来关闭串口设备文件,例如: ``` close(fd); ``` 以上就是一个简单的Linux串口通信的步骤,需要注意的是,对于串口的读写操作,还需要根据实际情况进行阻塞或非阻塞操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

屁小猪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值