串口设备一般在/dev/ttyS0-ttyS4。Linux下一切皆文件,把ttyS0结点当做文件操作,当然,获取描述符后先配置一下,open、read、write、close你肯定会吧,那,串口编程,你也肯定会了。
这代码我之前测试过,很ok,但发上来前,我可没测过哦,不过,看看,有思路也是不错的。
一:串口发送端程序
/*************************************************************************************************** #define COM '/dev/ttyS0' typedef enum /****** 设置串口***************************************************************************************/ memset(&curtio, 0, sizeof(curtio)); //取得串口已有的属性 //设置输入输出波特率 //设置为原始模式 //激活相应选项 //设置数据位 //设置停止位 //设置最少字符等待时间 //清空缓冲 //设置新串口属性 printf('set done!\n'); return 0; //打开串口 //关闭串口 二:串口接收端程序 /*************************************************************************************************** #define COM '/dev/ttyAMA0' /****** 读取串口信息 *********************************************************************************/ //打开串口 //由于串口设置已固化,故不需要设置。 default: 因为PC机上的串口设置已经固化,所以,没必要再配置了,串口的收发程序主要用于板子(新)上的,而上面的主要用于测试PC--板子间的。
**文件:w_uart.c
**编写者:huangminqiang
**编写日期:2012年10月15号
**简要描述:串口发送程序,在PC机上发送。
**修改者:
**修改日期:2012年11月12号
**注:
****************************************************************************************************/
#include
#include
#include
#include
#include
#include
{
NON, //无校验
ODD, //偶校验
EVEN,//奇校验
}cal_t;
static int set_com(int fd, int speed, int bits, cal_t cal, int stop )
{
struct termios curtio;
if (0 != tcgetattr(fd, &curtio))
{
perror('Failed to tcgetattr');
return -1;
}
cfsetispeed(&curtio, speed);
cfsetospeed(&curtio, speed);
curtio.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG | ECHOE | ECHOK | ECHONL);
curtio.c_iflag &= ~(BRKINT | IUCLC | ICRNL | INLCR | IGNCR);
curtio.c_cflag |= CLOCAL | CREAD;
curtio.c_cflag &= ~CSIZE;
curtio.c_cflag |= bits;
//设置校验位
if (ODD == cal)
{
curtio.c_iflag |= (INPCK | ISTRIP);
curtio.c_cflag |= PARENB;
curtio.c_cflag |= PARODD;
}
else if(EVEN == cal)
{
curtio.c_iflag |= (INPCK | ISTRIP);
curtio.c_cflag |= PARENB;
curtio.c_cflag &= ~PARODD;
}
else
{
curtio.c_cflag &= ~PARENB;
}
if (2 == stop)
{
curtio.c_cflag |= CSTOPB;
}
else
{
curtio.c_cflag &= ~CSTOPB;
}
curtio.c_cc[VTIME] = 0;
curtio.c_cc[VMIN] = 0;
tcflush(fd, TCIOFLUSH);
if (0 != tcsetattr(fd, TCSANOW, &curtio))
{
perror('Failed to tcgetattr');
return -1;
}
}
/****** 写入串口信息 **********************************************************************************/
int WriteUartInfo(void)
{
int fd;
int cnt = 0;
int w_cnt = 0;
unsigned char w_buf[128];
fd = open(COM, O_RDWR);
if(0 > fd)
{
perror('uart open err:');
return -1;
}
#if 0
//设置串口参数
if (0 != set_com(fd, B115200, CS8, NON, 1))
{
printf('set_com failed!\n');
goto _out;
}
#endif
//发送信息
while(1)
{
printf('plese input a buffer : ');
memset(w_buf, 0, sizeof(w_buf));
fgets(w_buf, sizeof(w_buf), stdin);
w_cnt = write(fd, w_buf, sizeof(w_buf));
if(0 > w_cnt)
{
perror('write error : ');
goto _out;
}
printf('sent out ! \n');
//结束判断
if( !strncmp(w_buf, 'quit', 4) )
{
break;
}
}
close(fd);
return 0;
_out:
close(fd);
return -1;
}
/****** 主函数 ****************************************************************************************/
int main(void)
{
if( WriteUartInfo() )
{
printf('write uart data failed!\n');
return -1;
}
return 0;
}
**文件:r_uart.c
**编写者:huangminqiang
**编写日期:2012年10月15号
**简要描述:串口接收程序,在板子上运行。
**修改者:
**修改日期:2012年11月12号
**注:
****************************************************************************************************/
#include
#include
#include
#include
#include
#include
int ReadUartInfo(void)
{
int fd;
int cnt = 0;
int r_cnt = 0;
struct termios attr;
fd_set r_fds;
struct timeval tv;
unsigned char r_buf[128] = {0};
fd = open(COM, O_RDWR);
if(0 > fd)
{
perror('open uart error : ');
return -1;
}
#if 0
//设置串口参数
if ( set_com(fd, B115200, CS8, NON, 1) )
{
printf('set_com failed!\n');
goto _out;
}
#endif
while(1)
{
//清除监测集合
FD_ZERO(&r_fds);
//将串口句柄加入到监测集合中
FD_SET(fd, &r_fds);
//设置超时为3秒
tv.tv_sec = 3;
tv.tv_usec = 0;
//监测串口是否有数据接收到,超时为3秒
cnt = select(fd + 1, &r_fds, NULL, NULL, &tv);
switch(cnt)
{
case 0://超时
//printf('time out !\n');
break;
case -1://错误
perror('select : ');
goto _out;
if( FD_ISSET(fd, &r_fds) ) //有数据可读
{
//接收数据
r_cnt = read(fd, r_buf, sizeof (r_buf));
if(0 > r_cnt)
{
perror('read error : ');
goto _out;
}
//printf('%s', r_buf);
//system(r_buf);
}
}
memset(r_buf, 0, sizeof(r_buf));
}
// 关闭串口
close(fd);
return 0;
_out:
close(fd);
return -1;
}
/****** 主函数 ***************************************************************************************/
int main(void)
{
if( ReadUartInfo() )
{
printf('read uart data failed!\n');
return -1;
}
return 0;
}
联系客服