新手求助ARM进行串口通信的问题

2019-07-16 09:14发布

ARM平台也是Linux系统,由ARM发送“hello”,宿主机(Linux系统)接收
ARM上程序:
1.JPG

linux系统中程序:
2.JPG

3.JPG
4.JPG

其中open_port和set_port分别为:
set_port:
int set_opt(int fd,int nSpeed,int nBits,charnEvent,int nStop){  //fd:指定的串口,nSpeed:波特率,nBits:字符大小,nEvent:奇偶校验,nStop:停止位       struct termios newtio,oldtio;//保存测试现有串口参数设置,在这里如果串口号等出错,会有相关的出错信息       if(tcgetattr(fd,&oldtio)!=0){              perror(“setupserial 1”);              return -1;       }       bzero(&newtio,sizeof(newtio));//清零       //设置字符大小       newtio.c_cflag|=CLOCAL|CREAD;//本地连接和接收使能       newtio.c_cflag&=~CSIZE;//去除数据位位掩码       switch(nBits)       {       case 7:              newtio.c_cflag|=CS7;//7个数据位              break;       case 8:              newtio.c_cflag|=CS8;//8个数据位              break;       }       //设置奇偶校验位       switch(nEvent)       {       case ‘O’://奇数              newtio.c_cflag|=PARENB;//校验位使能              newtio.c_cflag|=PARODD;//使用奇校验              newtio.c_iflag|=(INPCK|ISTRIP);//奇偶校验使能以及除去奇偶校验位              break;       case ‘E’://偶数              newtio.c_iflag|=(INPCK|ISTRIP);              newtio.c_cflag|=PARENB;              newtio.c_cflag&=~PARODD;              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 115200:                            cfsetispeed(&newtio,B115200);                            cfsetospeed(&newtio,B115200);                            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;//CSTOPB不设置为2,设置1              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! ”);              return 0;}open_port:int open_port(int fd,int comport){              char *dev[]={“/dev/ttyS0”,”/dev/ttyS1”,”/dev/ttyS2”};              long vdisable;              if(comport==1)//串口1              {            fd=open(“/dev/ttyS0”,O_RDWR|O_NOCTTY|O_NDELAY);                            if(-1==fd){                                   perror(“Can’topen serial port”);                                   return -1;                            }              }              if(comport==2)//串口2              {            fd=open(“/dev/ttyS1”,O_RDWR|O_NOCTTY|O_NDELAY);                            if(-1==fd){                                   perror(“Can’topen serial port”);                                   return -1;                            }              }              if(comport==3)//串口3              {            fd=open(“/dev/ttyS2”,O_RDWR|O_NOCTTY|O_NDELAY);                            if(-1==fd){                                   perror(“Can’topen serial port”);                                   return -1;                            }              }//恢复串口为阻塞状态              if(fcntl(fd,F_SETFL,0)<0)                            printf(“fcntlfailed! ”);              else                            printf(“fcntl=%d ”,fcntl(fd,F_SETFL,0));//测试是否为终端设备              if(isatty(STDIN_FILENO)==0)                            printf(“standardinput is not a terminal device ”);              else                            printf(“isatty success ”);              printf(“fd-open=%d ”,fd);              return fd;}
问题是:Linux系统是用虚拟机装的,为ubuntu12.04,ARM板为micro2440,由ARM发送的“hello ”用串口助手可以接收到,但是Linux系统运行读串口程序时,提示set down(串口设置的最后一个printf语句)之后就没有下文了,也没有显示也没退出程序,请问这是什么原因造成的?应如何修改?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。