OpenEdv-开源电子网

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

串口接收发送中断服务子程序

[复制链接]

4

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2013-6-7
在线时间
0 小时
发表于 2015-3-4 16:25:03 | 显示全部楼层 |阅读模式
5金钱
大家好,

    最近在做一个项目,用到两个串口,串口1和串口3,一开始想使用DMA的,但是最后领导让用中断实现。

    具体的是这样,从串口3接收到数据,到一个缓存区,然后把这个缓存区的数据进行加工后,通过串口1发送出来。当识别到串口1发送出来的数据是正确的话,串口1就会接收到一段数据,从串口3发送出去。

    但是我现在在拿串口1做测试的过程中一直有问题,串口死在中断中,好像是TXE在一直中断。请问是什么问题?

下面是我的代码:
[mw_shl_code=c,true]#define USART1_RX_LEN 256 //串口接收数据的最大缓冲区 #define USART1_TX_LEN 256 //串口发送数据的最大缓冲区,也就是串口3接收数据的最大缓冲区 extern uint16_t USART1_Rev_Buffer[USART1_RX_LEN];//定义缓冲区 extern uint16_t USART1_Send_Buffer[USART1_TX_LEN];//定义缓冲区 uint16_t USART1_Rev_Buffer[USART1_RX_LEN] = {0}; //初始化接收数据缓冲区 uint16_t USART1_RX_Num; //实际接收数据的长度 uint16_t USART1_TX_Num; //实际需要发送数据的长度 void SC_Reader_USARTInit(uint32_t workingbaudrate) { //省略串口的基本配置,金保留中断配置 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); USART_ITConfig(SCR_USART, USART_IT_RXNE, ENABLE);//开启接收中断 USART_ITConfig(USART1,USART_IT_TC,ENABLE);//开启发送中断 } //下面是中断服务处理函数 void USART1_IRQHandler(void) { //从串口1接收数据到接收缓冲区 if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { USART1_Rev_Buffer[USART1_RX_Num++] = USART_ReceiveData(USART1);//(USART1->DR); USART_ClearITPendingBit(USART1,USART_IT_RXNE); } //串口发送缓冲区中的数据 if(USART_GetITStatus(USART1, USART_IT_TC) != RESET) { USART_SendData(USART1, USART1_Send_Buffer[USART1_TX_Num++]); USART_ClearITPendingBit(USART1, USART_IT_TC); } }[/mw_shl_code]
还有第二个问题:如果我需要接收的数据大于我定义的缓冲区的最大值了,请问怎么处理?是不是直接关闭接收中断?

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-3-4 16:35:24 | 显示全部楼层
单独测试每个串口的收发,中断OK不?
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13135
金钱
13135
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-3-4 16:39:55 | 显示全部楼层
楼主 你的串口中断里,发送完成之后,立马发送buffer里的下一个数据,按照你的逻辑,会永无止境下去
所以才会一直发送中断
学无止境
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13135
金钱
13135
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-3-4 16:40:39 | 显示全部楼层
至于第二个问题,串口通信肯定会有一个协议的,看你程序怎么处理
按照你的通信协议来
学无止境
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-25 17:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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