请教一下,读串口时的中断问题~

念茜 2010-11-24 07:04:22

// 在读串口时,根据接收到的不同数据而执行不同的function();
//这样写只能读取一次,随后再怎么写给串口数据,也读取不到了。
//怎么修改才可以实现:一旦有数据来,就中断当前的funtion(),重新读取并执行新的function呢。
// 串口本身不是IRQ操作么?我用的是cortex m0.


while (1)
{
data = ReceiveByte();
switch(data)
{
case 'a':
function1()...
break;

case 'b':
...
break;
case 'z':
...
break;
default:

break;
}

}

...全文
401 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
念茜 2010-11-29
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 zenny_chen 的回复:]
引用 18 楼 yiyaaixuexi 的回复:
中断方式
1、设置UART中断使能寄存器(U0IER),使U0IER[0] = 1
2、开放系统中断
如果接收FIFO中的数据达到U0LSR中设置的触发点时,便会触发中断——RDA。
若接收了数据,但接收个数小于触发点,过一段时间后即发生字符超时中断——CTI


中断方式不是写得很清楚了吗?呵呵。
1、首先,你要设置U0LSR,……
[/Quote]

谢谢你
zenny_chen 2010-11-28
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yiyaaixuexi 的回复:]
中断方式
1、设置UART中断使能寄存器(U0IER),使U0IER[0] = 1
2、开放系统中断
如果接收FIFO中的数据达到U0LSR中设置的触发点时,便会触发中断——RDA。
若接收了数据,但接收个数小于触发点,过一段时间后即发生字符超时中断——CTI
[/Quote]

中断方式不是写得很清楚了吗?呵呵。
1、首先,你要设置U0LSR,这个估计就是用于设置你接收了多少数据会产生一个中断,不过不能超出FIFO的最大容量。当你接收到的数据达到了U0LSR中指定的个数,那么UART控制器就会给你的系统发送中断信号。
2、这个是开启中断,一般通过设置某个配置寄存器就OK了。
你开启中断后,也要确保你的处理器核心是开中断的。然后,你设置系统中断向量。把自己的中断处理函数首地址设置到中断向量中关于UART中断处理的位置中去。
念茜 2010-11-28
  • 打赏
  • 举报
回复
UART接收数据时,可以使用查询方式接收,也可以使用中断方式接收

查询方式
通过查询寄存器U0LSR中的位U0LSR[0]实现。只要接收到数据,U0LSR[0]位就会置位

中断方式
1、设置UART中断使能寄存器(U0IER),使U0IER[0] = 1
2、开放系统中断
如果接收FIFO中的数据达到U0LSR中设置的触发点时,便会触发中断——RDA。
若接收了数据,但接收个数小于触发点,过一段时间后即发生字符超时中断——CTI


使用中断方式接收数据时,如果发生RDA中断,则循环从U0RBR中读取数据即可。

不太理解中断方式
念茜 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zenny_chen 的回复:]
引用 13 楼 yiyaaixuexi 的回复:

每次问问题都未果,求人不如求己。


呵呵,楼主啊。俺不知道该如何吐槽⋯⋯
你先看看你系统的Specification再说。
[/Quote]

看了 可是有疑问啊
zenny_chen 2010-11-27
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 yiyaaixuexi 的回复:]


看了 可是有疑问啊
[/Quote]

有哪些疑问?你一个个列出来。然后偶们会一个一个解决
念茜 2010-11-26
  • 打赏
  • 举报
回复
每次问问题都未果,求人不如求己。
念茜 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sunhui2010 的回复:]
串口数据读写时一个字一个字发的.当读到一个字时候就触发下中断!一般是中断触发读取的,你说的那个板子我没接触过!在单片机中有中断触发位,我会用while(1)循环检测中断标记位,如果只有一个字我就先读取!如果是一串字的话我会都读取完然后再处理!你的程序就读取了一个字节!就开始处理了,然后下一个字继续处理!我们一般串口通信规约中绝对不可能只发一个字节!一般都有开始位,还有校验位!你先把你们通信规约搞清……
[/Quote]

我用串口不是为了传输大量数据,仅仅希望起到一个简单的控制作用,发送不同字符作为信号,片选不同下位机。
zenny_chen 2010-11-26
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 yiyaaixuexi 的回复:]

每次问问题都未果,求人不如求己。
[/Quote]

呵呵,楼主啊。俺不知道该如何吐槽⋯⋯
你先看看你系统的Specification再说。
MakeEveryDayUp 2010-11-26
  • 打赏
  • 举报
回复
弱弱的问下你们串口通信时单工还是半双工或者是全双工的?如果是单工的可以的呀!找到后告诉我们下!
念茜 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 we_sky2008 的回复:]
C/C++ code

//需要定义一个串口接收缓冲区:
char buf[SIZE];
char *read = buf;
char *write = buf;
int cnt = 0;


//中断处理程序, :
void GetDataFromSerial(void)
{
if (cnt < SIZE)//事实上,应该是cnt < SIZE - num, 因……
[/Quote]


我的程序简单一些,接收的都是一字节数据,单字符。
你的意思是让我重新定义一个 接收函数 , 能否改写个一字节的,我没有理解中断处理函数 和 接收函数 之间的关系 。
念茜 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kangqi7000 的回复:]
Linux 下网络编程中的select 这个你看看有没有帮助
[/Quote]

cortex m0里没有跑系统
念茜 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 eydj2008 的回复:]
说明一下
1.用中断时不能用while (1)! 不然一直退出不了中断
你把while 去掉就可以了
[/Quote]

啊?? 那岂不是更加确定只读取一次了
hw19886200 2010-11-25
  • 打赏
  • 举报
回复
每日 一回帖
MakeEveryDayUp 2010-11-25
  • 打赏
  • 举报
回复
串口数据读写时一个字一个字发的.当读到一个字时候就触发下中断!一般是中断触发读取的,你说的那个板子我没接触过!在单片机中有中断触发位,我会用while(1)循环检测中断标记位,如果只有一个字我就先读取!如果是一串字的话我会都读取完然后再处理!你的程序就读取了一个字节!就开始处理了,然后下一个字继续处理!我们一般串口通信规约中绝对不可能只发一个字节!一般都有开始位,还有校验位!你先把你们通信规约搞清楚在写!如果你们只发一个字取控制的话我觉得你们做底层协议的有点不规范!
kangqi7000 2010-11-24
  • 打赏
  • 举报
回复
Linux 下网络编程中的select 这个你看看有没有帮助
we_sky2008 2010-11-24
  • 打赏
  • 举报
回复

//需要定义一个串口接收缓冲区:
char buf[SIZE];
char *read = buf;
char *write = buf;
int cnt = 0;


//中断处理程序, :
void GetDataFromSerial(void)
{
if (cnt < SIZE)//事实上,应该是cnt < SIZE - num, 因为响应速度问题,需要提前禁止,num根据实际情况自定义大小
{
if (write == buf + SIZE)
{
write = buf;//刚才不小心多按了一个=
}
//DI 禁止中断
*write++ = DATA;//假设DATA是从端口读的数据
cnt++;
//EI 恢复中断
}
else
{
//需要在这里禁止再接收数据
}
}

char GetDataFromSerialBuf()
{
char data;
if (cnt > 0)
{
if (read == buf + SIZE)
{
read = buf;
}
//DI 禁止中断
data = *read++;
cnt--;
//EI 恢复中断
}
else
{
while (cnt == 0);//等待数据
}
return data;//刚才忘记返回了,哈哈
}


//主控程序中这么写
while (1)
{
data = GetDataFromSerialBuf();
switch(data)
{
case 'a':
function1();
break;

case 'b':
...
break;
case 'z':
...
break;
default:

break;
}
}



we_sky2008 2010-11-24
  • 打赏
  • 举报
回复

//需要定义一个串口接收缓冲区:
char buf[SIZE];
char *read = buf;
char *write = buf;
int cnt = 0;


//中断处理程序, :
void GetDataFromSerial(void)
{
if (cnt < SIZE)//事实上,应该是cnt < SIZE - num, 因为响应速度问题,需要提前禁止,num根据实际情况自定义大小
{
if (write == buf + SIZE)
{
write = buf;//刚才不小心多按了一个=
}
//DI 禁止中断
*write++ = DATA;//假设DATA是从端口读的数据
cnt++;
//EI 恢复中断
}
else
{
//需要在这里禁止再接收数据
}
}

char GetDataFromSerialBuf()
{
char data;
if (cnt > 0)
{
if (read == buf + SIZE)
{
read = buf;
}
//DI 禁止中断
data = *read++;
cnt--;
//EI 恢复中断
}
else
{
while (cnt == 0);//等待数据
}
}


//主控程序中这么写
while (1)
{
data = GetDataFromSerialBuf();
switch(data)
{
case 'a':
function1();
break;

case 'b':
...
break;
case 'z':
...
break;
default:

break;
}
}



we_sky2008 2010-11-24
  • 打赏
  • 举报
回复

//需要定义一个串口接收缓冲区:
char buf[SIZE];
char *read = buf;
char *write = buf;
int cnt = 0;


//中断处理程序, :
void GetDataFromSerial(void)
{
if (cnt < SIZE)//事实上,应该是cnt < SIZE - num, 因为响应速度问题,需要提前禁止,num根据实际情况自定义大小
{
if (write == buf + SIZE)
{
write == buf;
}
//DI 禁止中断
*write++ = DATA;//假设DATA是从端口读的数据
cnt++;
//EI 恢复中断
}
else
{
//需要在这里禁止再接收数据
}
}

char GetDataFromSerialBuf()
{
char data;
if (cnt > 0)
{
if (read == buf + SIZE)
{
read = buf;
}
//DI 禁止中断
data = *read++;
cnt--;
//EI 恢复中断
}
else
{
while(cnt == 0);//等待数据
}
}


//主控程序中这么写
while (1)
{
data = GetDataFromSerialBuf();
switch(data)
{
case 'a':
function1();
break;

case 'b':
...
break;
case 'z':
...
break;
default:

break;
}
}



YONYON-R&D 2010-11-24
  • 打赏
  • 举报
回复
说明一下
1.用中断时不能用while (1)! 不然一直退出不了中断
你把while 去掉就可以了
念茜 2010-11-24
  • 打赏
  • 举报
回复
who can tell me

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧