当前位置: 技术问答>linux和unix
linux 中断处理串口通讯
来源: 互联网 发布时间:2017-03-13
本文导语: 诸位大侠好,第一次发帖,多多帮助。 想用上位机串口连接S3C2440,上位机发送命令给S3C2440。 我想利用中断实现S3C2440的串口接受数据部分,不知道怎么实现。在linux下的编程。 我的想法是, S3C2440 处理其他...
诸位大侠好,第一次发帖,多多帮助。
想用上位机串口连接S3C2440,上位机发送命令给S3C2440。 我想利用中断实现S3C2440的串口接受数据部分,不知道怎么实现。在linux下的编程。
我的想法是, S3C2440 处理其他事情,当有数据传送过来的时候,再进行处理数据。不知道怎么实现? 请诸位帮忙,最好有代码给我模仿一下。谢谢。谢谢。
想用上位机串口连接S3C2440,上位机发送命令给S3C2440。 我想利用中断实现S3C2440的串口接受数据部分,不知道怎么实现。在linux下的编程。
我的想法是, S3C2440 处理其他事情,当有数据传送过来的时候,再进行处理数据。不知道怎么实现? 请诸位帮忙,最好有代码给我模仿一下。谢谢。谢谢。
|
呵呵,很简单啊,只要把select函数好好看看就行了,祝你成功,首先得心静下来
|
使用异步io
#include
#include
#include
#include
#include
#include
#include
#include
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("aaaan");
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("%dn",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);
}
#include
#include
#include
#include
#include
#include
#include
#include
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("aaaan");
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("%dn",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);
}