OpenEdv-开源电子网

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

求助: 串口中断问题(当收到0X20才开始接收,内容字节数不定,当收到0X20才结束,请问要怎么改呢?)

[复制链接]

12

主题

31

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2011-5-30
在线时间
6 小时
发表于 2011-5-30 18:08:27 | 显示全部楼层 |阅读模式
求助: 串口中断问题(当收到0X20才开始接收,内容字节数不定,当收到0X20才结束,请问要怎么改呢?)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-5-30 19:45:53 | 显示全部楼层
回复【楼主位】jianxi258:
---------------------------------
这个不简单嘛。
第一次接受,检查是否0X20->是->接收数据->此数据是否为0X20?->是->结束接收->等待数据处理->处理结束?->是->开始再次监视0X20->循环
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

31

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2011-5-30
在线时间
6 小时
 楼主| 发表于 2011-5-31 23:29:00 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
当接收第一个字节判断是0x20后,如果是就总是进第一个判断里,怎么都不会进第二个判断结束,正点原子,请问你是怎么写这个代码的呢?谢谢!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-6-1 00:20:36 | 显示全部楼层
你需要一个标记寄存器(其实就是个全局变量),来记录是否接收到了0X20.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

12

主题

31

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2011-5-30
在线时间
6 小时
 楼主| 发表于 2011-6-1 23:48:26 | 显示全部楼层
谢谢,问题解决了,但怎么串口第一次发送数据时总是少第一个数据,请问这个怎么解决呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2011-6-2 02:20:55 | 显示全部楼层
回复【5楼】jianxi258:
---------------------------------
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
USART1->DR = (u8) ch;      
return ch;
}
用以上代码替换你的fputc就可以了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

10

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2014-11-3
在线时间
0 小时
发表于 2015-2-10 21:05:10 | 显示全部楼层
void USART1_IRQHandler(void)                
{

int static len=0;
int t=0;
int temp=0;

if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  
{
GPIO_SetBits(GPIOC,GPIO_Pin_7);

temp=USART_ReceiveData(USART1);

if((USART_RX_STA&0x80)==0)//?????
{
if(USART_RX_STA&0x40)//????0x0d
{
if(temp!=0x0a)USART_RX_STA=0;//????,????
else USART_RX_STA|=0x80; //????? 
}
else //????0X0D
{
if(temp==0x0d)USART_RX_STA|=0x40;
else
{
RX_BUff[USART_RX_STA&0X3F]=temp ;
USART_RX_STA++;
if(USART_RX_STA>63)USART_RX_STA=0;//??????,??????  
}  
}
}    
     } 

if(USART_RX_STA&0x80)
{

len=USART_RX_STA&0x3f;
for(t=0;t<len;t++)
{
USART_SendData(USART1,RX_BUff[len++]);
while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);

}
USART_RX_STA=0;
GPIO_ResetBits(GPIOC,GPIO_Pin_7);

}
uart_init(9600);


}    
串口如何接收字符串,我折腾好久都没搞定,直接复制MINI板的例程如上,仍是不行,我的片子是STM32F072RB,每次发送ABC,都只是收到A,折腾好久了,
,求原子哥详解!


回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-2-10 21:57:06 | 显示全部楼层
最后这句:uart_init(9600); 
莫名其妙。
串口初始化只需要初始化一次,你这是什么节奏?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-25 20:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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