OpenEdv-开源电子网

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

串口接收 严重丢失数据 研究良久无果 原子哥和各位大侠请帮忙看看

[复制链接]

233

主题

958

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1796
金钱
1796
注册时间
2011-10-9
在线时间
223 小时
发表于 2012-6-12 15:25:36 | 显示全部楼层 |阅读模式
现象很奇怪 ,当采用1200速率 用sscom 一次发送 30k数据  。然后stm32接收终端做了个很简单的计算 收到1个数+1 结果只收到640个数 
如果采用115200 那么可以接收到12k左右的数据 。 波特率越高 能一次接收的数据就越多。 
当我用1200波特率 然后 一次发1k数据 暂停1秒 再发1k 这样  我每发1k stm32会多接收640个数 

贴上我的代码   串口代码是从 原子哥的寄存器串口实验抄的 。系统时钟 72M  波特率 1200  

1.串口初始化代码 

void uart_init(u32 pclk2,u32 bound)
{    
float temp;
u16 mantissa;
u16 fraction;   
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分  
    mantissa<<=4;
mantissa+=fraction; 
RCC->APB2ENR|=1<<2;   //使能PORTA口时钟  
RCC->APB2ENR|=1<<14;  //使能串口时钟 
GPIOA->CRH&=0XFFFFF00F; 
GPIOA->CRH|=0X000008B0;//IO状态设置
 
RCC->APB2RSTR|=1<<14;   //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位     
//波特率设置
  USART1->BRR=mantissa; // 波特率设置  
USART1->CR1|=0X200C;  //1位停止,无校验位.
#ifdef EN_USART1_RX  //如果使能了接收
//使能接收中断
USART1->CR1|=1<<8;    //PE中断使能
USART1->CR1|=1<<5;    //接收缓冲区非空中断使能
   
MY_NVIC_Init(1,3,USART1_IRQChannel,2);//组2,最低优先级 
#endif
}

2 串口接收终端代码
si的定义  u32 si=0;


void USART1_IRQHandler(void)
{
  //测试接收
u8 res;
  
if(USART1->SR&(1<<5))//接收到数据 读走后为0 
{  
res=USART1->DR; 
si++;

    }
}

求帮助 !! 

补充 : 
   发现 就是 不管你一次发送多少个数据  但是 只进入了640次串口中断  。然后只要你隔一阵(1秒?) 就可以再进入640次中断 



























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

使用道具 举报

233

主题

958

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1796
金钱
1796
注册时间
2011-10-9
在线时间
223 小时
 楼主| 发表于 2012-6-12 15:29:10 | 显示全部楼层
回复 支持 反对

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2012-5-31
在线时间
0 小时
发表于 2012-6-12 15:33:54 | 显示全部楼层
你的系统只接数干其他的不?波特率1200一秒钟什么都不干只能接数据,还有你是接一个数据处理一次,很有可能问题在这,你试着全部接收完了之后存在一个数组里面,在对他计数!或者留够处理的时间!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-12 15:36:00 | 显示全部楼层
看你这个代码无问题啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

233

主题

958

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1796
金钱
1796
注册时间
2011-10-9
在线时间
223 小时
 楼主| 发表于 2012-6-12 15:40:28 | 显示全部楼层
回复【3楼】波舟:
你的系统只接数干其他的不?波特率1200一秒钟什么都不干只能接数据,还有你是接一个数据处理一次,很有可能问题在这,你试着全部接收完了之后存在一个数组里面,在对他计数!或者留够处理的时间!
---------------------------------
我就测试长数据接收  除了这个 什么都没干
回复 支持 反对

使用道具 举报

233

主题

958

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1796
金钱
1796
注册时间
2011-10-9
在线时间
223 小时
 楼主| 发表于 2012-6-12 15:40:56 | 显示全部楼层
回复【4楼】正点原子:
看你这个代码无问题啊
---------------------------------
是啊 我就奇怪 难道芯片挂了? 
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-12 15:51:48 | 显示全部楼层
是不是你波特率设置有误?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

233

主题

958

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1796
金钱
1796
注册时间
2011-10-9
在线时间
223 小时
 楼主| 发表于 2012-6-12 15:54:15 | 显示全部楼层
回复【7楼】正点原子:
是不是你波特率设置有误?
---------------------------------


没有错哦   如果把接收的数据放到数组 等发送完再发回来的话  开头100个基本都是对的 后面的没有仔细比较了 我把si的值发出去  也正常的
但是我刷程序也是通过串口刷的 如果芯片串口挂了 应该也刷不进去啊 我刷一个20k的程序进去也没问题的
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-12 16:05:19 | 显示全部楼层
回复【8楼】simms01:
---------------------------------
不知道你的main函数怎么处理的
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

233

主题

958

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1796
金钱
1796
注册时间
2011-10-9
在线时间
223 小时
 楼主| 发表于 2012-6-12 16:27:13 | 显示全部楼层
主要用处是  我按下按键 然后把 si的数值  发送到串口

int main(void)
{
u8 key_buf;
STM32_init();
KEY_Init();
while(1)
{
key_buf=KEY_Scan();  //扫描键值
key_run(key_buf);     //处理键值 主要是发送si的值到串口
}


}


其中  STM32_init(); 函数:
void STM32_init(void)
{

Stm32_Clock_Init(sys_clock);   //9倍频 运行在 72M   sys_clock=9
delay_init(sys_clock*8); //初始化延迟函数 72为运行频率
uart_init(sys_clock*8,bote);   //初始化串口 函数 usart_init(x1,x2) x=运行频率 x=波特率   bote=1200
JTAG_Set(JTAG_SWD_DISABLE); //停止JTAG 


}

其中 key_run     

就是                                          send_232(0xaa);    
send_232(0x55);
send_232(si>>16);
      send_232(si>>8);
      send_232(si);


send_232(函数)
void send_232(u8 date)
{

printf("%c",date);





}







回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-12 16:42:38 | 显示全部楼层
你的si没看到清零的地方...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

233

主题

958

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1796
金钱
1796
注册时间
2011-10-9
在线时间
223 小时
 楼主| 发表于 2012-6-12 16:45:08 | 显示全部楼层
回复【11楼】正点原子:
你的si没看到清零的地方...
---------------------------------
忘记标了 一开始  定义的时候  u32 si=0;      
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-12 17:11:30 | 显示全部楼层
回复【12楼】simms01:
---------------------------------
定义的时候是0,但是你每次要统计啊.你不会是一直累加吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

233

主题

958

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1796
金钱
1796
注册时间
2011-10-9
在线时间
223 小时
 楼主| 发表于 2012-6-12 17:28:04 | 显示全部楼层
回复【13楼】正点原子:
回复【12楼】simms01:
---------------------------------
定义的时候是0,但是你每次要统计啊.你不会是一直累加吧?
---------------------------------
正常是应该累加

例如我用sscom   发送 500字节  si应该=500 然后我再发送500字节 si应该=1000
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-12 19:57:49 | 显示全部楼层
嗯.
回复 支持 反对

使用道具 举报

233

主题

958

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1796
金钱
1796
注册时间
2011-10-9
在线时间
223 小时
 楼主| 发表于 2012-6-14 17:31:56 | 显示全部楼层
找到原因了 
我用的是从cp2102 usb转串口的芯片  输出的是3.3v ttl  后来我该用FT232 选择5v ttl输出 就正常了
回复 支持 反对

使用道具 举报

2

主题

1436

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2209
金钱
2209
注册时间
2010-12-16
在线时间
190 小时
发表于 2012-6-15 01:22:00 | 显示全部楼层
可能这里LZ会有误解,是3.3V和5V的问题.其实是CP2102的问题.
USB转串口如果想可靠,还是要FT232,特别是大批量数据传输.
PL2303适合要求不高,数据量和可靠性不大的场合.
CP2102适合简单传输,没有数据量和可靠性要求的场合.
当然,谈到最喜欢说的价格,就不用讨论了.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

233

主题

958

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1796
金钱
1796
注册时间
2011-10-9
在线时间
223 小时
 楼主| 发表于 2012-6-15 14:27:57 | 显示全部楼层
今天刚测试了 采用FT232RL 一次传输100k数据 无一出错。 

但是有个疑惑请楼上指教:  我采用FT232RL 选择3.3v ttl输出  STM32居然一个数没收到。   但是看资料 应该是3.3ttl 和5v 都应该能支持才对啊 

回复 支持 反对

使用道具 举报

2

主题

1436

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2209
金钱
2209
注册时间
2010-12-16
在线时间
190 小时
发表于 2012-6-15 16:20:41 | 显示全部楼层
你的"选择5VTTL"和"选择3.3VTTL"是指修改VCCIO的电压,还是用配置软件设置?我从来只用3.3V,从来没有问题.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

233

主题

958

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1796
金钱
1796
注册时间
2011-10-9
在线时间
223 小时
 楼主| 发表于 2012-6-16 23:12:16 | 显示全部楼层
采用ft232rl调试过程如下

用的是网上买回来的 ft232rl模块 30块钱的那种测试的

首先  vccio 接3.3    stm32发数据 pc能收到 pc发数据 stm32一个都收不到
然后 vccio 接5v     stm32发数据正常 pc发数据 数据量大 也出错
然后 我将模块的vcc 接到我板子上的3,3v  vccio接5v  测试100k 无错漏了。   

我奇怪的是 理论上来说 3.3v的 vccio输出 应该更适合 stm32 。但是我却是一个字没收到。


调试过程中没有修改stm32f103vct6的程序。都用同一个程序测试的。

 看ft232rl的原理图 模块的那个vcc 应该是ft232输出的3.3v 才对(FT232RL引脚名称 3.3out)  那个好像不需要输入vcc的。


电路来说  ft232rl 与 stm32的 rx tx  各串了一个220欧电阻 













回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-6-17 09:44:45 | 显示全部楼层
5V应该是无问题的.
STM32的串口直接接5V设备的串口,照样工作的.
你这个可以用示波器看看波形.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

2

主题

1436

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2209
金钱
2209
注册时间
2010-12-16
在线时间
190 小时
发表于 2012-6-18 00:49:08 | 显示全部楼层
麻烦检查地线是否连接正确.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

233

主题

958

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1796
金钱
1796
注册时间
2011-10-9
在线时间
223 小时
 楼主| 发表于 2012-6-18 13:38:27 | 显示全部楼层
地线链接正确的   
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 07:30

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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