- 论坛徽章:
- 0
|
大家好,小弟刚开始学linux下c编程,今天写了个串口最简单的实验,就是两个终端一个发,一个收,单独运行接受端的时候没有事,运行了接收端在运行发送端,发送端就会出现问题,问题就好像一只按回车一样,接着鼠标点接收端的终端,接收端也会出现和发送端一样的问题。如果只运行发送端,也会出现这种问题(不运行接收端),别的终端(空闲)也会出现这样的问题,如果光运行接收端就没有问题。真是不知道怎么回事,郁闷死了。我用的是虚拟机下的rad hat enterprise linux 4
上面解释的是各种情况下出现的问题
总结下来就是一运行发送端,就会出现一个无限循环,循环内容是一只按回车键的效果,ctrl+c不能终止,即使在桌面上,点右键,鼠标放在选项上面会自动点击。
下来上代码 这是接收端
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <termios.h>
#define BAUDRATE B38400
#define MODEMDEVICE "/dev/tty1"
int main()
{
int fd,c=0,res;
struct termios oldtio, newtio;
char buf[256];
printf("start-----\n");
fd=open(MODEMDEVICE,O_RDWR|O_NOCTTY);
if(fd<0)
{
perror(MODEMDEVICE);
exit(1);
}
printf("open-----");
tcgetattr(fd,&oldtio);
bzero(&newtio,sizeof(newtio));
newtio.c_cflag=BAUDRATE|CS8|CLOCAL|CREAD;
newtio.c_iflag=IGNPAR;
newtio.c_oflag=0;
newtio.c_lflag=ICANON;
tcflush(fd,TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
printf("reading-----\n");
while(1)
{
res=read(fd,buf,255);
buf[res]=0;
printf("res=%d vuf=%s\n",res,buf);
if(buf[0]='q') break;
}
printf("close-----\n");
close(fd);
tcsetattr(fd,TCSANOW,&oldtio);
return 0;
}
这个是发送端
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#define BAUDRATE B38400
#define MODEMDEVICE "/dev/tty0"
#define STOP '@'
int main()
{
int fd,c=0,res;
struct termios oldtio,newtio;
char ch,s1[20];
printf("start------\n");
fd=open(MODEMDEVICE,O_RDWR|O_NOCTTY);
if(fd<0)
{
perror(MODEMDEVICE);
exit(1);
}
printf("open------\n");
tcgetattr(fd,&oldtio);
bzero(&newtio,sizeof(newtio));
newtio.c_cflag=BAUDRATE|CS8|CLOCAL|CREAD;
newtio.c_iflag=IGNPAR;
newtio.c_oflag=0;
newtio.c_lflag=ICANON;
tcflush(fd,TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
printf("writing------\n");
while(1)
{
while((ch=getchar())!='q')
{
s1[0]=ch;
res=write(fd,s1,1);
}
s1[0]=ch;
res=write(fd,s1,2);
break;
}
printf("close-----\n");
close(fd);
tcsetattr(fd,TCSANOW,&oldtio);
return 0;
}
小弟在此谢谢各位大哥 大姐了
[ 本帖最后由 lengbingyu1016 于 2008-11-3 00:46 编辑 ] |
|