79

阿木币

0

精华

36 小时

在线时间

老司机

Rank: 2

发表于 2019-5-30 11:22:39 8423 浏览 3 回复

linux下读取串口数据

2阿木币
我根据网上教程,编写test.c代码,然后gcc -o test test.c编译,然后./test运行,可是这样好像并不能直接读取串口数据,我还得另外再用cutecom(linux下的串口调试助手)打开该串口,这边终端才不断有数据读出,可是这样一来数据就变得有些乱了,但是cutecom里显示的数据又是正常的,这让我疑惑很久,不知道是哪里出现问题,接下来放下代码和运行效果图:
#include<stdio.h>  
    #include<stdlib.h>  
    #include<unistd.h>  
    #include<sys/types.h>  
    #include<sys/stat.h>  
    #include<fcntl.h>  
    #include<termios.h>  
    #include<errno.h>  
    #include<math.h>
    #include<string.h>

    #define FALSE -1  
    #define TRUE 0





    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) {      
          tcflush(fd, TCIOFLUSH);      
          cfsetispeed(&Opt, speed_arr);   
          cfsetospeed(&Opt, speed_arr);     
          status = tcsetattr(fd, TCSANOW, &Opt);   
          if  (status != 0) {         
            perror("tcsetattr fd1");   
            return;      
          }      
          tcflush(fd,TCIOFLUSH);     
        }   
      }  
    }  

    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;   
        tcflush(fd,TCIFLUSH);  
        options.c_cc[VTIME] = 150;   
        options.c_cc[VMIN] = 0; /* Update the options and do it NOW */  
        if (tcsetattr(fd,TCSANOW,&options) != 0)     
        {   
            perror("SetupSerial 3");     
            return (FALSE);   
        }   
        return (TRUE);   
    }  

    int main()  
    {  
        printf("This program updates last time at %s   %s\n",__TIME__,__DATE__);  
        printf("STDIO COM1\n");  
        int fd;  
        fd = open("/dev/ttyUSB0",O_RDWR);  
        if(fd == -1)  
        {  
            perror("serialport error\n");  
        }  
        else  
        {  
            printf("open ");  
            printf("%s",ttyname(fd));  
            printf(" succesfully\n");  
        }  

        set_speed(fd,115200);
        set_Parity(fd,8,1,'N');
        if (set_Parity(fd,8,1,'N') == FALSE)  {  
            printf("Set Parity Error\n");  
            exit (0);  
        }  else{
            printf("hahahahha!\n");
        }

        int buff[48];   
        int nread;
        //char data = '0';
        //int dread;   
        while(1)  
        {  
            printf("get in!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
            nread=read(fd,buff,48);
            //dread=read(fd,&data,1);
            //printf("Len: %d\n",dread);
            printf("Len: %d\n",nread);
            int i=0 ;  
            while(i<48){
                printf("%d ",buff);
                i++;
            }
            //printf("%c\n",data);
            //printf("%c\n",CharToHex(data));
            printf("\nget out~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
            usleep(100000);
        }  
        close(fd);  
        return 0;  
    }  



_-1255241512_qq_pic_merged_1559186462712_15591864.jpg

最佳答案

查看完整内容

1、nread=read(fd,buff,48),打印的消息里面Len:0,也就是没有读取到数据,建议确认一下你的数据是否写入对应的串口设备中。 2、你的打印中 buff对应的应该是首地址,你这样的循环打印,意义不大 3、验证的时候将双侧显示的数据格式保持一致,如果选用16进制双方都是用16进制显示,这样避免人工的转化,方便问题的定位 ...

扫一扫浏览分享
回复

使用道具 举报

13

阿木币

1

精华

23 小时

在线时间

技术大V

Rank: 4

发表于 2019-5-30 11:22:40
1、nread=read(fd,buff,48),打印的消息里面Len:0,也就是没有读取到数据,建议确认一下你的数据是否写入对应的串口设备中。
2、你的打印中
  1. int buff[48];
  2. .....
  3. while(i<48){
  4.     printf("%d ",buff);
  5.     i++;
  6. }
复制代码

buff对应的应该是首地址,你这样的循环打印,意义不大

3、验证的时候将双侧显示的数据格式保持一致,如果选用16进制双方都是用16进制显示,这样避免人工的转化,方便问题的定位
回复

使用道具 举报

139

阿木币

0

精华

287 小时

在线时间

管理员

Rank: 9Rank: 9Rank: 9

发表于 2019-5-31 13:40:50
你这显示是以什么方式显示的,二进制显示的还是,16进制 还是字符串显示的
我不为己,谁人为我,但我只为己,那我又是谁?
回复

使用道具 举报

79

阿木币

0

精华

36 小时

在线时间

老司机

Rank: 2

 楼主| 发表于 2019-5-31 16:48:24
amov_msq 发表于 2019-5-31 13:40
你这显示是以什么方式显示的,二进制显示的还是,16进制 还是字符串显示的 ...

16进制显示的
回复

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表