微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > ARM技术讨论 > 新手求助ARM进行串口通信的问题

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

时间:10-02 整理:3721RD 点击:
ARM平台也是Linux系统,由ARM发送“hello”,宿主机(Linux系统)接收
ARM上程序:


linux系统中程序:





其中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!\n”);

              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!\n”);

              else

                            printf(“fcntl=%d\n”,fcntl(fd,F_SETFL,0));

//测试是否为终端设备

              if(isatty(STDIN_FILENO)==0)

                            printf(“standardinput is not a terminal device\n”);

              else

                            printf(“isatty success\n”);

              printf(“fd-open=%d\n”,fd);

              return fd;

}


问题是:Linux系统是用虚拟机装的,为ubuntu12.04,ARM板为micro2440,由ARM发送的“hello\n”用串口助手可以接收到,但是Linux系统运行读串口程序时,提示set down(串口设置的最后一个printf语句)之后就没有下文了,也没有显示也没退出程序,请问这是什么原因造成的?应如何修改?


大家可以随意发言,任何想法都可以,多谢

额,学习下,不知道啥意思呢

问题已解决,主要是因为虚拟机的问题

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top