OpenEdv-开源电子网

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

USART1串口接收发送问题

[复制链接]

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-6-25
在线时间
0 小时
发表于 2015-8-18 15:43:45 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#include "pbdata.h" void RCC_Configration(void); void GPIO_Configration(void); void NVIC_Configuration(void); void USART_Configuration(void); int main(void) { RCC_Configration(); GPIO_Configration(); USART_Configuration(); NVIC_Configuration(); while(1) { if((u8)(USART1->DR) == 0xFC) { USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//检测到标志位打开中断 } } } void RCC_Configration(void) { SystemInit(); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); } void GPIO_Configration(void) { GPIO_InitTypeDef GPIO_Initstructure; GPIO_Initstructure.GPIO_Pin = GPIO_Pin_9; GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Initstructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA,&GPIO_Initstructure); GPIO_Initstructure.GPIO_Pin = GPIO_Pin_10; GPIO_Initstructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_Initstructure); } void NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); } void USART_Configuration(void) { USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate=19200; USART_InitStructure.USART_WordLength=USART_WordLength_8b; USART_InitStructure.USART_StopBits=USART_StopBits_1; USART_InitStructure.USART_Parity=USART_Parity_No; USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx; USART_Init(USART1,&USART_InitStructure); USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);//先关闭中断,等收到 FC 标志时打开 USART_Cmd(USART1,ENABLE); USART_ClearFlag(USART1,USART_FLAG_TC); } 这是中断函数 void USART1_IRQHandler(void) { if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) { ReceiveData[i++] = USART_ReceiveData(USART1); } if(i >= 10) { i = 0; USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);//关中断 for(j=0; j<10; j++) { USART_SendData(USART1,ReceiveData[j]); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET); } } } [/mw_shl_code]
大神帮忙看下,要实现的功能是:STM32接收数据,但要检测接收标志位,外部一次要发送10个字节数据,当检测到数据FC时开中断,然后在中断中开始接收数据,存放到依次存放到ReceiveData[10]这个数组中,然后在中断中发数据,发回电脑。本程序接收数据不稳定,不知咋回事?   想用DMA去做,怎样实现?还有就是外部数据一直循环发送,不会停止!!   先谢谢大神了!


年轻就是最大的本钱,努力奋斗,创造奇迹。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6763

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13125
金钱
13125
注册时间
2012-11-26
在线时间
3814 小时
发表于 2015-8-18 15:50:44 | 显示全部楼层
楼主的想法,真是前无古人,后无来者
学无止境
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-8-18 16:31:05 | 显示全部楼层
念天地之悠悠,独怆然而涕下。
小小蜗牛
回复

使用道具 举报

8

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2015-8-1
在线时间
7 小时
发表于 2015-8-18 16:51:22 | 显示全部楼层
感觉这两个语句是不是前后掉下个

USART_SendData(USART1,ReceiveData[j]); 
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
有软件开发经验,从0硬件基础学习STM32开发。
回复

使用道具 举报

8

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2015-8-1
在线时间
7 小时
发表于 2015-8-18 16:54:56 | 显示全部楼层
另外 0xFC后面的数据,是不是要等会再发比较好?给芯片一个缓过神的机会?
有软件开发经验,从0硬件基础学习STM32开发。
回复

使用道具 举报

8

主题

124

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2015-8-1
在线时间
7 小时
发表于 2015-8-18 16:56:31 | 显示全部楼层
而且,你中断里也读数据,main里也读(即便开中断后,它还是一直循环读数据),两者会不会互相干扰?
有软件开发经验,从0硬件基础学习STM32开发。
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-9-30
在线时间
3 小时
发表于 2015-8-18 17:57:45 | 显示全部楼层
中断不开着 你怎么检测到FC数据....
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-6-25
在线时间
0 小时
 楼主| 发表于 2015-8-18 20:45:22 | 显示全部楼层
这和51中有点像,定时器和中断不是一回事,你可以打开定时器,启动定时器,但你可以不用打开定时器中断,只要检测IF这个位就行了,就知道他计数达到了,在主程序中就可以通过检测IF这位处理程序。串口也是,你打开串口,但不用打开串口中断,通过检测标志位就行
年轻就是最大的本钱,努力奋斗,创造奇迹。
回复

使用道具 举报

1

主题

12

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-9-30
在线时间
3 小时
发表于 2015-8-19 09:24:12 | 显示全部楼层
回复【8楼】YZ635438451:
---------------------------------
哦哦,的确是这样。会不会是你收到FC再打开串口中断,这条语句有执行时间,导致你接数会丢失?一直开着串口中断不行么?
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-6-25
在线时间
0 小时
 楼主| 发表于 2015-8-19 10:55:34 | 显示全部楼层
回复【9楼】hahaxine:
---------------------------------
这个函数功能就是检测到FC标志位才打开中断开始接收数据,要不外界一直发数据,会一直进入中断,那么会影响主函数执行,程序一直处于中断,这样肯定是不行的,至于收到FC再打开串口中断,这条语句有执行时间,导致接数会丢失,我可以一个字节一个字节慢慢发,然后收到数据返回也有问题了。
年轻就是最大的本钱,努力奋斗,创造奇迹。
回复

使用道具 举报

3

主题

7

帖子

0

精华

新手上路

积分
39
金钱
39
注册时间
2015-6-25
在线时间
0 小时
 楼主| 发表于 2015-8-19 23:54:33 | 显示全部楼层
回复【6楼】dragon7799:
---------------------------------
肯定会丢数据的,比如,现在发3组10位数据,当你发第1组数据时,这时我检测到第一组的0xFC标志位,正在处理第一组数据,第二组数据现在来了,我这时已经把中断关了,在发第一组数据,等处理完第一组数据.可能第三组数据来了,这不影响,我只是想接收一组完整的数据!
年轻就是最大的本钱,努力奋斗,创造奇迹。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 07:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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