LINIX下串口通讯.docx
- 文档编号:10297375
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:7
- 大小:15.34KB
LINIX下串口通讯.docx
《LINIX下串口通讯.docx》由会员分享,可在线阅读,更多相关《LINIX下串口通讯.docx(7页珍藏版)》请在冰点文库上搜索。
LINIX下串口通讯
针口的叫“公头”,有孔的叫“母头”,如果没有两个母头的串口线的话,可以使用虚拟机,两个虚拟机之间采用"管道"的方式连接,可达到几乎和双机互联一样的效果。
另外还可以下载一个串口调试助手,用于观察或者发送数据。
#include
#include
#include
#include
#include
#include
#include
#include
#include
intset_opt(intfd,intnSpeed,intnBits,charnEvent,intnStop)
{
/*
设置串口属性:
fd:
文件描述符
nSpeed:
波特率
nBits:
数据位
nEvent:
奇偶校验
nStop:
停止位
*/
structtermiosnewtio,oldtio;
if(tcgetattr(fd,&oldtio)!
=0){
perror("SetupSerial1");
return-1;
}
bzero(&newtio,sizeof(newtio));
newtio.c_cflag|=CLOCAL|CREAD;
newtio.c_cflag&=~CSIZE;
switch(nBits)
{
case7:
newtio.c_cflag|=CS7;
break;
case8:
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)
{
case2400:
cfsetispeed(&newtio,B2400);
cfsetospeed(&newtio,B2400);
break;
case4800:
cfsetispeed(&newtio,B4800);
cfsetospeed(&newtio,B4800);
break;
case9600:
cfsetispeed(&newtio,B9600);
cfsetospeed(&newtio,B9600);
break;
case115200:
cfsetispeed(&newtio,B115200);
cfsetospeed(&newtio,B115200);
break;
default:
cfsetispeed(&newtio,B9600);
cfsetospeed(&newtio,B9600);
break;
}
if(nStop==1)
newtio.c_cflag&=~CSTOPB;
elseif(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("comseterror");
return-1;
}
printf("setdone!
\n");
return0;
}
intopen_port(intfd,intcomport)
{
//char*dev[]={"/dev/ttyS0","/dev/ttyS1","/dev/ttyS2"};
longvdisable;
if(comport==1)
{fd=open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY);
//{fd=open("/dev/ttyUSB0",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1==fd){
perror("Can'tOpenSerialPort");
return(-1);
}
else
printf("openttyS0.....\n");
}
elseif(comport==2)
{fd=open("/dev/ttyS1",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1==fd){
perror("Can'tOpenSerialPort");
return(-1);
}
else
printf("openttyS1.....\n");
}
elseif(comport==3)
{
fd=open("/dev/ttyS2",O_RDWR|O_NOCTTY|O_NDELAY);
if(-1==fd){
perror("Can'tOpenSerialPort");
return(-1);
}
else
printf("openttyS2.....\n");
}
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("standardinputisnotaterminaldevice\n");
else
printf("isattysuccess!
\n");
printf("fd-open=%d\n",fd);
returnfd;
}
intmain(void)
{
intfd;
intnread,i;
charbuff[]="Hello\n";
if((fd=open_port(fd,1))<0){
perror("open_porterror");
return;
}
if((i=set_opt(fd,115200,8,'N',1))<0){
perror("set_opterror");
return;
}
printf("fd=%d\n",fd);
nread=read(fd,buff,8);
printf("nread=%d,%s\n",nread,buff);
close(fd);
return;
}
linux下串口通讯大致就是先打开设备文件,获得文件描述符,然后设置通讯参数,(如波特率什么的),然后就可以像一般文件一样read,write了。
你可以根据上面的例子稍微改动一下做一个发送的程序,然后用串口线双机互联,观察一下效果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LINIX 串口 通讯