嵌入式课程设计实践(二)——串口
2014-06-30 11:27
295 查看
嵌入式课程设计实践(二)——串口
这章比较水,就是根据S3C6410实验箱的指导书对串口代码的展示。
我所做的课程设计是要求从串口读取数据,然后再进行处理,所以对串口有所了解就是开展课设前必要的工作了。
定义,我无耻的借用了百度百科里的说法了:
UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。
它是用于控制计算机与串行设备的芯片。作为接口的一部分,UART还提供以下功能:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部并行数据的器件使用。在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。
以我的理解能力,我只能理解这么多,所以就贴了这一点,还觉得不够的自行前往百度百科了解(http://baike.baidu.com/view/245027.htm?fr=aladdin)。
在本实验中,我们就是借用串口进行PC与S3C6410实验箱进行连接控制,同时使用串口接收传感器通过zigbee传输到本机中zigbee模块中的数据。
下面就将贴出相关代码。
1.头文件
#include<stdio.h> /*标准输入输出定义*/
#include<stdlib.h> /*标准函数库定义*/
#include<unistd.h> /*linux
标准函数定义*/
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h> /*文件控制定义*/
#include<termios.h> /*PPSIX
终端控制定义*/
#include<errno.h> /*错误号定义*/
2.打开串口
直接贴函数:
int OpenDev(char *Dev)
{
int fd= open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY
if(-1 == fd)
{
perror("Can'tOpen Serial Port");
return-1;
}
else
return fd;
}
3.设置波特率
这个函数也是直接贴出来,因为我不需要对串口做什么特殊的设置,所以也没有深究,短期內只要复制粘贴即可=。=
void set_speed(int fd, int speed)
{
int i;
int status;
struct termios Opt;
tcgetattr(fd,&Opt);
for( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
{
if (speed == name_arr[i])
{
tcflush(fd, TCIOFLUSH);
cfsetispeed(&Opt,speed_arr[i]);
cfsetospeed(&Opt,speed_arr[i]);
status= tcsetattr(fd, TCSANOW, &Opt);
if (status != 0)
perror("tcsetattrfd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
4.设置校验位/停止位等
说明同上:
intset_Parity(int fd,int databits,int stopbits,int parity)
{
structtermios options;
if ( tcgetattr( fd,&options) != 0)
{
perror("SetupSerial1");
return(FALSE);
}
options.c_cflag&= ~CSIZE;
switch(databits)
{
case7:
options.c_cflag|= CS7;
break;
case8:
options.c_cflag|= CS8;
break;
default:
fprintf(stderr,"Unsupporteddata size\n");
return(FALSE);
}
switch(parity)
{
case'n':
case'N':
options.c_cflag&= ~PARENB; /* Clear parity enable */
options.c_iflag&= ~INPCK; /* Enable parity checking */
break;
case'o':
case'O':
options.c_cflag|= (PARODD | PARENB);
options.c_iflag|= INPCK; /* Disnable parity checking */
break;
case'e':
case'E':
options.c_cflag|= PARENB; /* Enable parity */
options.c_cflag&= ~PARODD;
options.c_iflag|= INPCK; /* Disnable parity checking */
break;
case'S':
case's': /*as no parity*/
options.c_cflag&= ~PARENB;
options.c_cflag&= ~CSTOPB;
break;
default:
fprintf(stderr,"Unsupportedparity\n");
return(FALSE);
}
/*设置停止位*/
switch(stopbits)
{
case1:
options.c_cflag&= ~CSTOPB;
break;
case2:
options.c_cflag|= CSTOPB;
break;
default:
fprintf(stderr,"Unsupportedstop bits\n");
return(FALSE);
}
/*Set input parity option */
if(parity != 'n')
options.c_iflag|= INPCK;
options.c_cc[VTIME]= 150; // 15 seconds
options.c_cc[VMIN]= 0;
tcflush(fd,TCIFLUSH);/* Update the options and do it NOW */
if(tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial3");
return(FALSE);
}
return(TRUE);
}
5.正式启用串口并执行操作
intmain(int argc, char **argv)
{
//预定义变量
intnwrite;
intlen;
charbuff[512];
//串口的定义与初始化
intfd;
char*dev ="/dev/s3c2410_serial0";
/*串口的名称不同的机器汇有所不同,本机就是s3c2410_serial0,我第一次弄的时候就遇到了一个串口名为ttySAC0的,幸好对linux有所了解才很快解决了,所以请自己注意查看设备下的名称(ls/dev/)。*/
fd= OpenDev(dev);
/*linux下一切设备都是以文件形式进行操作的,故该函数也是打开文件然后操作*/
set_speed(fd,115200);
if(set_Parity(fd,8,1,'N')== FALSE)
{
printf("SetParity Error\n");
exit(1);
}
/**************华丽丽的分割线,下面是对于串口简单的使用*************/
while(1)//超级终端输入字符串,处理并通过串口输出。
{
printf("Pleaseinput your string :");
scanf("%s",&buff);
len=strlen(buff);
printf("\nlen=%d\n",len);
nwrite=write(fd,buff,len);
printf("\nnwrite=%d\n",nwrite);
}
return 0;
}
呐,这个比较简单啦,如果只是需要对串口进行基本初始化并使用,直接拷贝1~4的代码,在5中直接调用相关函数初始化即可。如果嫌太多了,可以直接把相关设置直接写进main函数中。(=。=)
本文大家看看即可,若是能有什么帮助最好不过了,有什么问题请直接批评,我咬不了大家。
这章比较水,就是根据S3C6410实验箱的指导书对串口代码的展示。
我所做的课程设计是要求从串口读取数据,然后再进行处理,所以对串口有所了解就是开展课设前必要的工作了。
定义,我无耻的借用了百度百科里的说法了:
UART是一种通用串行数据总线,用于异步通信。该总线双向通信,可以实现全双工传输和接收。在嵌入式设计中,UART用来主机与辅助设备通信,如汽车音响与外接AP之间的通信,与PC机通信包括与监控调试器和其它器件,如EEPROM通信。
它是用于控制计算机与串行设备的芯片。作为接口的一部分,UART还提供以下功能:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部并行数据的器件使用。在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。
以我的理解能力,我只能理解这么多,所以就贴了这一点,还觉得不够的自行前往百度百科了解(http://baike.baidu.com/view/245027.htm?fr=aladdin)。
在本实验中,我们就是借用串口进行PC与S3C6410实验箱进行连接控制,同时使用串口接收传感器通过zigbee传输到本机中zigbee模块中的数据。
下面就将贴出相关代码。
1.头文件
#include<stdio.h> /*标准输入输出定义*/
#include<stdlib.h> /*标准函数库定义*/
#include<unistd.h> /*linux
标准函数定义*/
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h> /*文件控制定义*/
#include<termios.h> /*PPSIX
终端控制定义*/
#include<errno.h> /*错误号定义*/
2.打开串口
直接贴函数:
int OpenDev(char *Dev)
{
int fd= open( Dev, O_RDWR ); //| O_NOCTTY | O_NDELAY
if(-1 == fd)
{
perror("Can'tOpen Serial Port");
return-1;
}
else
return fd;
}
3.设置波特率
这个函数也是直接贴出来,因为我不需要对串口做什么特殊的设置,所以也没有深究,短期內只要复制粘贴即可=。=
void set_speed(int fd, int speed)
{
int i;
int status;
struct termios Opt;
tcgetattr(fd,&Opt);
for( i= 0; i < sizeof(speed_arr) / sizeof(int); i++)
{
if (speed == name_arr[i])
{
tcflush(fd, TCIOFLUSH);
cfsetispeed(&Opt,speed_arr[i]);
cfsetospeed(&Opt,speed_arr[i]);
status= tcsetattr(fd, TCSANOW, &Opt);
if (status != 0)
perror("tcsetattrfd1");
return;
}
tcflush(fd,TCIOFLUSH);
}
}
4.设置校验位/停止位等
说明同上:
intset_Parity(int fd,int databits,int stopbits,int parity)
{
structtermios options;
if ( tcgetattr( fd,&options) != 0)
{
perror("SetupSerial1");
return(FALSE);
}
options.c_cflag&= ~CSIZE;
switch(databits)
{
case7:
options.c_cflag|= CS7;
break;
case8:
options.c_cflag|= CS8;
break;
default:
fprintf(stderr,"Unsupporteddata size\n");
return(FALSE);
}
switch(parity)
{
case'n':
case'N':
options.c_cflag&= ~PARENB; /* Clear parity enable */
options.c_iflag&= ~INPCK; /* Enable parity checking */
break;
case'o':
case'O':
options.c_cflag|= (PARODD | PARENB);
options.c_iflag|= INPCK; /* Disnable parity checking */
break;
case'e':
case'E':
options.c_cflag|= PARENB; /* Enable parity */
options.c_cflag&= ~PARODD;
options.c_iflag|= INPCK; /* Disnable parity checking */
break;
case'S':
case's': /*as no parity*/
options.c_cflag&= ~PARENB;
options.c_cflag&= ~CSTOPB;
break;
default:
fprintf(stderr,"Unsupportedparity\n");
return(FALSE);
}
/*设置停止位*/
switch(stopbits)
{
case1:
options.c_cflag&= ~CSTOPB;
break;
case2:
options.c_cflag|= CSTOPB;
break;
default:
fprintf(stderr,"Unsupportedstop bits\n");
return(FALSE);
}
/*Set input parity option */
if(parity != 'n')
options.c_iflag|= INPCK;
options.c_cc[VTIME]= 150; // 15 seconds
options.c_cc[VMIN]= 0;
tcflush(fd,TCIFLUSH);/* Update the options and do it NOW */
if(tcsetattr(fd,TCSANOW,&options) != 0)
{
perror("SetupSerial3");
return(FALSE);
}
return(TRUE);
}
5.正式启用串口并执行操作
intmain(int argc, char **argv)
{
//预定义变量
intnwrite;
intlen;
charbuff[512];
//串口的定义与初始化
intfd;
char*dev ="/dev/s3c2410_serial0";
/*串口的名称不同的机器汇有所不同,本机就是s3c2410_serial0,我第一次弄的时候就遇到了一个串口名为ttySAC0的,幸好对linux有所了解才很快解决了,所以请自己注意查看设备下的名称(ls/dev/)。*/
fd= OpenDev(dev);
/*linux下一切设备都是以文件形式进行操作的,故该函数也是打开文件然后操作*/
set_speed(fd,115200);
if(set_Parity(fd,8,1,'N')== FALSE)
{
printf("SetParity Error\n");
exit(1);
}
/**************华丽丽的分割线,下面是对于串口简单的使用*************/
while(1)//超级终端输入字符串,处理并通过串口输出。
{
printf("Pleaseinput your string :");
scanf("%s",&buff);
len=strlen(buff);
printf("\nlen=%d\n",len);
nwrite=write(fd,buff,len);
printf("\nnwrite=%d\n",nwrite);
}
return 0;
}
呐,这个比较简单啦,如果只是需要对串口进行基本初始化并使用,直接拷贝1~4的代码,在5中直接调用相关函数初始化即可。如果嫌太多了,可以直接把相关设置直接写进main函数中。(=。=)
本文大家看看即可,若是能有什么帮助最好不过了,有什么问题请直接批评,我咬不了大家。
相关文章推荐
- 嵌入式课程设计实践(四)——socket
- 嵌入式课程设计实践(三)——SQLite
- 嵌入式课程设计实践(五)——pthread
- 嵌入式课程设计实践(一)——环境搭建
- 嵌入式课程设计——温控器
- 嵌入式ZigBee串口模块的设计
- 数据结构实践课程设计【通讯录管理系统】
- (转载)uCOS-II的嵌入式串口通信模块设计
- 课程设计——聚类分析的初步实践
- 微机原理 之串口通信控制步进电机直流电动机电磁继电器开关灯课程设计 lab8000
- 嵌入式软件开发培训笔记——基于S5PC100的课程设计
- 基于S3C2440和嵌入式Linux的扩展串口设计
- 嵌入式 课程设计指导书
- 信息安全系统设计基础课程实践:简单TUI游戏设计
- 嵌入式软件:通过串口进行调试的一些思考和实践
- 哈工大嵌入式设计与实践实验七 驱动程序开发
- 广工嵌入式系统课程设计——单片机售票机
- stm8s 实践课程之IAP设计编码(bootloader实现)
- Sundy嵌入式底层开发课程笔记 --Vi的设计思想及使用
- uCOS-II的嵌入式串口通信模块设计