Linux 下串口中断和查询两种方式读取串口的程序Demo写法

jackxiang 2010-3-13 22:32 | |
我个人觉得如果是单片机来说中断和查询的写法可能会让单片机在效率上有些不同,毕竟单片机的资源有限,但是对于上位机的PC监控来说呢,查询的消耗并没有消耗多少(这儿是相对于中断来说的),但是如果严谨些,是应该用中断来代替查询的,这儿分别列出中断和查询在linux上的不同写法,以区分出来,以下是示例代码:




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <termio.h>

int tty_mode(int how)
{
static struct termios original_mode;
if(how==0)
tcgetattr(0,&original_mode);
else return tcsetattr(0,TCSANOW,&original_mode);
}
void set_crmode()
{
struct termios ttystate;
tcgetattr(0,&ttystate);
ttystate.c_lflag &= ~ICANON;
ttystate.c_lflag &=~ECHO;
ttystate.c_cc[VMIN]=1;
tcsetattr(0,TCSANOW,&ttystate);
}

int signal_io(int sig)
{
static char buf[128],ch=0;
static int len=0;
//memset(buf,0,sizeof(buf));
//printf("aaaa\n");
if(read(0,&ch,1)==1)
{
if(ch!=127)
{
printf("%c",ch);
buf[len++]=ch;
}
else {
        if(len>0)
        buf[--len]=0;
        printf("\b \b");
        }
}
//perror(NULL);
//printf("%d\n",ch);
fflush(stdout);
}
int main()
{
int flag=0;
tty_mode(0);
set_crmode();
signal(SIGIO,signal_io);
fcntl(0,F_SETOWN,getpid());
flag=fcntl(0,F_GETFL);
fcntl(0,F_SETFL,flag|O_ASYNC);
while(1)
pause();
tty_mode(1);
}



下面贴出串口查询的代码:



/******************************************************
*file name:recerve.c
*Description:Recerve data from Serial_Port
*Date:
*******************************************************/
/********************头文件定义************************/
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include 'math.h'
#define max_buffer_size 100      /*定义缓冲区最大宽度*/
/******************************************************/

int fd,s;
int open_serial(int k)
/***********************************************
*open serial function.
*input k k=0open serial1,k=1,openserial2
*return -1 false, return 0 success
**********************************************/
{
  if (k=0)
  {
    int fd=open("/dev/ttys0",O_RDWR|O_NOCTTY);
    perror("open /dev/ttys0");
  }
  else
  {
    fd=open("/dev/ttys1",O_RDWR|O_NOCTTY);
    perror("open /dev/ttys1");
  }
  if(fd==-1)/*打开失败*/
    return -1;
  else
    return 0;

}

/**************************************************************/


int main()
{
char hd[max_buffer_size],*rbuf; /*定义接收缓冲区*/
int flag_close, retv,i,ncount=0;
struct termios opt;
int realdata=0;

/*******************************************************************/
open_serial(0); /*打开串口1*/
/*******************************************************************/

tcgetattr(fd,&opt);
cfmakeraw(&opt);

/*****************************************************************/
cfsetispeed(&opt,B9600); /*波特率设置为9600bps*/
cfsetospeed(&opt,B9600);
/*******************************************************************/

tcsetattr(fd,TCSANOW,&opt);
rbuf=hd; /*数据保存*/
printf("ready for receiving data...\n");
retv=read(fd,rbuf,1); /*接收数据*/
if(retv==-1)
{
  perror("read"); /*读状态标志判断*/
}
/*************************开始接收数据******************************/

while(*rbuf!='\n') /*判断数据是否接收完毕*/
    {
ncount+=1;
rbuf++;
retv=read(fd,rbuf,1);
if(retv==-1)
{
perror("read");
}
}
/*******************************************************************/
printf("The data received is:\n"); /*输出接收到的数据*/
for(i=0;i <ncount;i++)
{
printf("%c",hd[i]);
}
printf("\n");
flag_close =close(fd);
if(flag_close ==-1) /*判断是否成功关闭文件*/
printf("Close the Device failur!\n");
return 0;
}


作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/2810/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2010-3-13 22:33
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]