嵌入式Linux串口通信

嵌入式板子就和普通用的单片机比如stm32开发板,51开发板差不多,他们的串口都很类似,都是直接连上然后在PC机器上用串口软件打开就好了。
我使用的嵌入式开发板上面有8个rs485串口,2个rs232串口以及一个网口,刚开始开发板连接成功后,使用命令

ls /dev/ttyUSB*

在这里插入图片描述

显示出所有的串口,这些串口能够使用的前提是你必须连接好硬件,我刚开分配了一个RS232串口用作调试,用SecureCRT上连接了网口和RS232的串口用作终端连接开发板,以为这样就可以实现开发板给XCOM串口软件发送消息,我还试着以为用在PC端口使用vspd虚拟两个端口,一个com1,一个com2,然后理所当然认为com2映射到了ttyUSB2,但是这样是错误的,因为你硬件连接的都不对,这一点困扰了我很久,正确的是那8个RS485串口对应了ttyUSB1-8,通过usb转RS485连接开发板和电脑,编写然后用XCOM打开串口就直接可以通信了。
代码如下:

#include <sys/time.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h> //标准函数库定义
#include <unistd.h> //unix标准函数定义
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //文件控制定义
#include <termios.h> //POSIX终端控制定义

#define BUF   "hello world!"
int main(int argc, char **argv)
{
        int fd = -1;
        int rv = -1;


        struct termios options;//该结构体包含串口的选项
        /*struct termios
         {
            tcflag_t  c_iflag;  //输入选项
            tcflag_t  c_oflag;  //输出选项
            tcflag_t  c_cflag;  //控制选项
            tcflag_t  c_lflag;  //行选项
            cc_t      c_cc[NCCS]; //控制字符
         }*/



        fd = open("/dev/ttyUSB3",O_RDWR|O_NOCTTY|O_NDELAY);//打开串口设备
        if(fd < 0)
        {
                printf("open uart failure:%s\n",strerror(errno));
                close(fd);
                return -1;
        }

        printf("open uart successfuly\n");

        memset(&options, 0, sizeof(options));

        rv = tcgetattr(fd, &options);//获取原有的串口属性的配置

        if(rv != 0 )
        {
                printf("tcgetattr failure:%s\n", strerror(errno));
                return -2;
        }
        options.c_cflag|=(CLOCAL|CREAD);//CREAD开启串行数据接收,CLOCAL并打开本地连接模式
        //options.c_cflag &= ~(ECHO |ICANON |ECHOE); 
        options.c_cflag &= ~CSIZE;//先使用CSIZE做位屏蔽
        options.c_cflag |= CS8;//设置8位数据位
        options.c_cflag &= ~PARENB;//无校验位

        /*设置115200波特率*/
        cfsetispeed(&options,B115200);//设置输入波特率
        cfsetospeed(&options,B115200);//设置输出波特率

        options.c_cflag &= ~CSTOPB;//设置一位停止位

        options.c_cc[VTIME] = 0;//非规范模式读取时的超时时间
         options.c_cc[VMIN] = 0;//非规范模式读取时的最小字符数

        tcflush(fd, TCIFLUSH);

        rv=tcsetattr(fd, TCSANOW, &options);//设置终端的属性
        if(rv != 0)
        {
                printf("tcsetattr failure:%s\n",strerror(errno));
                close(fd);
                return -3;
        }

        while(1)
        {

                rv = write(fd, BUF,strlen(BUF)) ;
                if(rv < 0)
                {
                        printf("write error:%s\n",strerror(errno));
                        close(fd);
                }
                printf("%s\n", BUF);

                sleep(3);
        }

       close(fd);
        return 0;
}

现象:
在这里插入图片描述

另外的是PC上的XCOM给开发板发消息,开发板处于一直空等状态只有当收到消息后然后打印出这条信息

#include <sys/time.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h> //标准函数库定义
#include <unistd.h> //unix标准函数定义
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //文件控制定义
#include <termios.h> //POSIX终端控制定义

#define BUF_SIZE 1024

int main(int argc, char **argv)
{
    int fd = -1;
    int rv = -1;
    char buf[BUF_SIZE];

    struct termios options;

    fd = open("/dev/ttyUSB3", O_RDWR | O_NOCTTY);
    if (fd < 0)
    {
        printf("open uart failure:%s\n", strerror(errno));
        close(fd);
        return -1;
    }

    printf("open uart successfuly\n");

    memset(&options, 0, sizeof(options));

    rv = tcgetattr(fd, &options);
    if (rv != 0)
    {
        printf("tcgetattr failure:%s\n", strerror(errno));
        return -2;
    }
    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag &= ~CSIZE;
    options.c_cflag |= CS8;
    options.c_cflag &= ~PARENB;
    cfsetispeed(&options, B115200);
    cfsetospeed(&options, B115200);
    options.c_cflag &= ~CSTOPB;
    options.c_cc[VTIME] = 0; // 设置超时为0,表示无限等待
    options.c_cc[VMIN] = 1;  // 至少读取一个字符

    tcflush(fd, TCIFLUSH);

    rv = tcsetattr(fd, TCSANOW, &options);
    if (rv != 0)
    {
        printf("tcsetattr failure:%s\n", strerror(errno));
        close(fd);
        return -3;
    }

    while (1)
    {
        rv = read(fd, buf, BUF_SIZE);
        if (rv < 0)
        {
            printf("read error:%s\n", strerror(errno));
            close(fd);
            return -4;
        }
        else if (rv == 0)
        {
            printf("No data received\n");
        }
        else
        {
            buf[rv] = '\0'; // 添加字符串结束符
            printf("Received message: %s\n", buf);
        }
    }

    close(fd);
    return 0;
}


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值