新手求助ARM进行串口通信的问题
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语句)之后就没有下文了,也没有显示也没退出程序,请问这是什么原因造成的?应如何修改?
大家可以随意发言,任何想法都可以,多谢
额,学习下,不知道啥意思呢
问题已解决,主要是因为虚拟机的问题