OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5717|回复: 8

用串口中断发送数据

[复制链接]

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-4-28
在线时间
0 小时
发表于 2014-10-1 17:47:57 | 显示全部楼层 |阅读模式
5金钱
疑问:我在主函数中调用发送函数,同时在中断中也调用发送函数,但是只接收到一次数据(oxab),同时,led灯也会闪烁,说明确实进入中断了,但是为什么调用两次,只有一个数据,怎么判断两个函数,到底是哪个在起作用????
如果,不中断中调用发送函数(我注释了),发现现象和调用了是同样的现象(只接收到一次数据(oxab),同时,led灯也会闪烁)。这又是为什么呢????
代码:
int main()
{
p=&t;
t=0xab;
usart_init();
delay_init();
GPIO_SetBits(GPIOB,GPIO_Pin_5);
while(1)
{
if(( r & (uint16_t)0x01FF)==0xaa)
{
USART_SendData(USART1,*p);
r=0;
}
}
}
void USART1_IRQHandler()                 //串口1中断服务程序
{
if(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==SET)//发送中断  
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
delay_ms(100);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
delay_ms(100);
USART_SendData(USART1,*p);
USART_ClearFlag(USART1,USART_FLAG_TXE);
}
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)//接收中断
{
r=USART_ReceiveData(USART1);
}
}

最佳答案

查看完整内容[请看2#楼]

USART_ClearFlag(USART1,USART_FLAG_TXE); 这句话之前,再加个delay_ms(100)之类的。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-1 17:47:58 | 显示全部楼层
USART_ClearFlag(USART1,USART_FLAG_TXE);
这句话之前,再加个delay_ms(100)之类的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

14

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-6-19
在线时间
0 小时
发表于 2014-10-1 17:47:58 | 显示全部楼层
发送一字节数据以后再开发送中断,不要在初始化的时候开。
发包结束后关闭发送中断。
去掉delay

以上,可以试一下。
www.eshome.me 我们的嵌入式之家。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-4-28
在线时间
0 小时
 楼主| 发表于 2014-10-4 09:52:37 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
很感谢你的回复,加了延时100ms后,每次接收都有两个数据。但是这不是我要的效果啊。。。
我想利用中断方式发送一组数据,但不是用循环发送,是在中断里面发送数据(利用第一次中断发送触发中断,再利用中断中的发送再次触发中断):
uint16_t a[]={0,1,2,3,4,5,6,7,8,9};

int main()
{
p=a;
num=10;
usart_init();
delay_init();
GPIO_SetBits(GPIOB,GPIO_Pin_5);
while(1)
{
if(( r & (uint16_t)0x01FF)==0xaa)
{
USART_SendData(USART1,*p);
delay_ms(100);
r=0;
}
}
}
void USART1_IRQHandler()                 //串口1中断服务程序
{
if(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==SET)//发送中断   
{
if(num>0) USART_SendData(USART1,*p);
num--;
p++;
delay_ms(100);
USART_ClearFlag(USART1,USART_FLAG_TXE);
}
if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET)//接收中断
{
r=USART_ReceiveData(USART1);
}
}

我以前用51写过这种中断循环发数据的方式,效率很高(利用一个if即可发送8个数据,if完了就走,中断会自动发送8个数据):
        if(sf==1)       //发送8个数据
{
p=≀
num=8;
SBUF=*p;
sf=0;
}

void uart() interrupt 4  //uart
{
static uchar i;
if(RI)
{
RI=0;
}
else 
{
TI=0;
num--;
p++;
if(num>0) SBUF=*p;
}
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-10-4 23:06:28 | 显示全部楼层
回复【3楼】某学生:
---------------------------------
发送数据要等待发送完成,你的问题就是只管发送,不管人家受不受得了....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-4-28
在线时间
0 小时
 楼主| 发表于 2014-10-4 23:58:45 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
所以我就加了100ms延时,但是效果还是不对
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-4-28
在线时间
0 小时
 楼主| 发表于 2014-10-5 19:35:33 | 显示全部楼层
回复【6楼】waitig:
---------------------------------
非常感谢,你说的太对了!我发现我没打开发送中断。。。。。。。按照你说的只有发送的时候打开发送中断,我就可以发送一包数据了~~~~
不过,我还发现一个问题,像下面这样同时打开发送和接收中断,stm32就无法接收数据了。。。不知道为什么
USART_ITConfig(USART1,USART_IT_RXNE|USART_IT_TXE,ENABLE);

所以我就先在初始化的时候打开接收中断USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);,,,,在发送的时候才打开发送中断USART_ITConfig(USART1,USART_IT_TXE,ENABLE);,,,,,,发送完了以后才关闭发送中断,这样才可以多次接收和发送
回复

使用道具 举报

1

主题

14

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2014-6-19
在线时间
0 小时
发表于 2014-10-8 21:22:15 | 显示全部楼层
回复【7楼】某学生:
---------------------------------
“USART_ITConfig(USART1,USART_IT_RXNE|USART_IT_TXE,ENABLE);”
这个写法不对,USART_ITConfig这个函数每次只能控制一个中断,不能用“|”,这个你可以去看一下库中这个函数的具体实现。

接收中断可以一直打开,发送中断在发送完毕之后要关闭,因为串口发送缓冲区为空就会触发这个中断。
www.eshome.me 我们的嵌入式之家。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
32
金钱
32
注册时间
2013-4-28
在线时间
0 小时
 楼主| 发表于 2014-10-9 22:17:16 | 显示全部楼层
回复【8楼】waitig:
---------------------------------
原来如此!!!!又学习了~谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-30 15:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表