查看: 1701|回复: 0

[原创] 应用程序之串口编程

[复制链接]
  • TA的每日心情
    开心
    2018-12-13 08:40
  • 签到天数: 138 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2017-5-8 09:35:00 | 显示全部楼层 |阅读模式
    分享到:
    1、首先在虚拟机中把USB转串口设备挂载上,如图所示,把串口的发送和接收短接:
    1.jpg

    2、编写串口设置程序:usart_config.c
    #include <termios.h>
    #include <stdio.h>
    #include <string.h>

    int set_opt(int fd,int nSpeed,int nBits,char nEvent,int nStop)
    {
            struct termios newtio,oldtio;
            if(tcgetattr(fd,&oldtio)!=0)
            {
                    perror("setup serial error\r");
                    return -1;
            }
            bzero(&newtio,sizeof(newtio));
            newtio.c_cflag |= CLOCAL|CREAD;                        //CLOCAL:忽略任何调制解调器状态 CREAD:启动接收器
            switch(nBits)
            {
                    case 7:
                            newtio.c_cflag &= ~CSIZE;
                            newtio.c_cflag |= CS7;
                            break;
                    case 8:
                            newtio.c_cflag &= ~CSIZE;
                            newtio.c_cflag |= CS8;
                            break;               
            }
            switch(nEvent)
            {
                    case 'O':
                            newtio.c_cflag |= PARENB;                        //启用奇偶校验
                            newtio.c_cflag |= PARODD;                        //奇校验
                            newtio.c_iflag |=(INPCK|ISTRIP);        // INPCK:收到的字符进行奇偶校验 ISTRIP: 除去奇偶校验位
                            break;
                    case 'E':
                            newtio.c_cflag |= PARENB;                        //启用奇偶校验
                            newtio.c_cflag &=~PARODD;
                            newtio.c_iflag |=(INPCK|ISTRIP);        // INPCK:收到的字符进行奇偶校验 ISTRIP: 除去奇偶校验位
                            break;
                    case 'N':
                            newtio.c_cflag &=~ PARENB;                        //不使用奇偶校验       
                            break;
            }
            switch(nSpeed)
            {
                    case 2400:
                            cfsetispeed(&newtio,B2400);
                            cfsetospeed(&newtio,B2400);
                            break;
                    case 4800:
                            cfsetispeed(&newtio,B4800);
                            cfsetospeed(&newtio,B4800);
                            break;
                    case 9600:
                            cfsetispeed(&newtio,B9600);
                            cfsetospeed(&newtio,B9600);
                            break;
                    case 38400:
                            cfsetispeed(&newtio,B38400);
                            cfsetospeed(&newtio,B38400);
                            break;
                    case 460800:
                            cfsetispeed(&newtio,B460800);
                            cfsetospeed(&newtio,B460800);
                            break;
                    default:
                            cfsetispeed(&newtio,B9600);
                            cfsetospeed(&newtio,B9600);
                            break;
                           
            }
            if(nStop == 1)                                                                        //设置停止位
            {
                    newtio.c_cflag &= ~CSTOPB;
            }
            else if(nStop == 2)
            {
                    newtio.c_cflag |= CSTOPB;
            }
            newtio.c_cc[VTIME]=0;
            newtio.c_cc[VMIN]=0;

            tcflush(fd,TCIFLUSH);
            //激活新配置
            if((tcsetattr(fd,TCSANOW,&newtio))!=0)
                    {
                    perror("com set error");
                    return -1;
            }
            printf("set done!\n");
            return 0;
    }


    3:编写发送程序 send.c

    #include <stdio.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <termios.h>

    #define MODEMDVICE "/dev/ttyUSB0"
    #define STOP '#'

    int main()
    {
            int fd,pa,c=0,res;
            struct termios oldtio,newtio;
            char ch,s1[2];
            printf("start....\n");

            fd=open(MODEMDVICE,O_RDWR|O_NOCTTY);
            if(fd<0)
            {
                    perror(MODEMDVICE);
                    exit(1);
            }
            printf("open.....\n");
            int pz = set_opt(fd,38400,8,'N',1);
            if(pz == 0)
            {
                    printf("writing!!\n");
                    while(1)
                    {
                            while((ch=getchar())!= STOP)
                            {
                                    s1[0]=ch;
                                    res=write(fd,s1,1);
                            }
                            s1[0]=ch;
                            s1[1]='\n';
                            res=write(fd,s1,2);
                            break;
                    }
                    printf("close ....\n");
                    close(fd);
                    tcsetattr(fd,TCSANOW,&oldtio);
                    return 0;
            }
            else
            {
                    close(fd);
                    perror("串口设置失败");
                    exit(1);
                    return -1;

            }
    }


    4、编写makefile 文件,这里主要是练习makefile文件的使用

    OBJS = send.c usart_config.c

    CC = gcc

    CFLAGS = -Wall -g

    send.o : $(OBJS)

            $(CC) $^ -o $@

    5、执行 make命令
    6、./send.o 如图所示
    1.jpg

    7、在当前窗口1,输入任意字符,并回车
    8、重新打开另外一个终端,找到usb转串口设备,/dev/ttyUSB0,cat ttyUSB0,就会发现发送窗口发送什么,接收窗口就能接收什么字符,如图所示
    2.jpg
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条



    手机版|小黑屋|与非网

    GMT+8, 2025-1-12 12:07 , Processed in 0.134625 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.