当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 3 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 菜鸟求助:linux串口通信问题
帖子发表于 : 2010-10-28 21:15 

注册: 2009-03-30 17:05
帖子: 4
送出感谢: 0 次
接收感谢: 0 次
我照书上写了一个简单的linux串口通信问题,可是结果总是很奇怪。我用一个串口连续的向PC发送“hello,wlp ”的字符串(最后有个空格)。 在终端运行我的程序的时候,结果如下:
1、先是显示
fcntl=0
isatty success!
fd-open=3
set done!
2、然后等几秒后才显示(select函数怎么会等待这么长时间?)

llo,wlp hello,wlp p llo,wlp hello,wlp p llo,wlp hello,wlp llo,wlp p llo,wlp hello,wlp p llo,wlp hello,wlp p llo,wlp hello,wlp p llo,wlp hehello,wp lp llo,wp hello,wlp p llo,wlp hello,wlp p llo,wlp hello,wlp p llo,wlp hlp hello,wlp p llo,wlp hello,wlp p llo,wlp hello,wlp hello,wlp p
3、我想要的结果是
hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp hello,wlp

这是在windows下测试的结果,发送肯定没有问题 。我想知道这是为什么?
linux的串口的缓冲有多大?它是怎么工作的?为什么有时候会出现he被p 替代的情况?


我的代码如下:

代码:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <stdlib.h>
//设置串口
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int 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;
break;
case 8:
newtio.c_cflag |= CS8;
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;
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;
}





/*打开串口函数*/
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't Open Serial Port");
return(-1);
}
}
else if(comport==2)//串口2
{ fd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd){
perror("Can't Open Serial Port");
return(-1);
}
}
else if (comport==3)//串口3
{
fd = open( "/dev/ttyS2", O_RDWR|O_NOCTTY|O_NDELAY);
if (-1 == fd){
perror("Can't Open Serial Port");
return(-1);
}
}
/*恢复串口为阻塞状态*/
if(fcntl(fd, F_SETFL, 0)<0)
printf("fcntl failed!\n");
else
printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
/*测试是否为终端设备*/
if(isatty(STDIN_FILENO)==0)
printf("standard input is not a terminal device\n");
else
printf("isatty success!\n");
printf("fd-open=%d\n",fd);
return fd;
}

//主函数
int main(void)
{

int fd;
int nread,nwrite,i;
char buff[12];
fd_set rd;

if((fd=open_port(fd,1))<0){
perror("open_port error");
return;
}

if((i=set_opt(fd,115200,8,'N',1))<0){
perror("set_opt error");
return;
}

FD_ZERO(&rd);
FD_SET(fd,&rd);

while(1){

if(select(fd+1,&rd,NULL,NULL,NULL)<0)
perror("select");
else{
while(  (nread = read(fd,buff,12)) >0)
{buff[12]='\0';
printf("%s",buff);

}

}
}

return 0;

}


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 菜鸟求助:linux串口通信问题
帖子发表于 : 2010-10-29 9:54 
头像

注册: 2009-07-07 19:52
帖子: 240
送出感谢: 0 次
接收感谢: 0 次
貌似数据同步的问题。

不做串口开发已经很多年了。


_________________
阿呆 : 天下第一呆!


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 菜鸟求助:linux串口通信问题
帖子发表于 : 2010-10-29 19:11 

注册: 2009-03-30 17:05
帖子: 4
送出感谢: 0 次
接收感谢: 0 次
收到的数据有时候怎么不对啊?求高手解答一下


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 3 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译