发 帖  
原厂入驻New
[问答]

串口接收严重丢失数据的原因是什么?

195 串口
分享
现象很奇怪 ,当采用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);//得到USARTDIVmantissa=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;   //复位串口1RCC->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次中断
0
2020-8-2 22:48:29   评论 分享淘帖 邀请回答
15个回答
你的系统只接数干其他的不?波特率1200一秒钟什么都不干只能接数据,还有你是接一个数据处理一次,很有可能问题在这,你试着全部接收完了之后存在一个数组里面,在对他计数!或者留够处理的时间!
2020-8-3 05:38:53 评论

举报

我就测试长数据接收  除了这个 什么都没干
2020-8-3 06:12:46 评论

举报

是啊 我就奇怪 难道芯片挂了? 
2020-8-3 06:20:06 评论

举报

不知道你的main函数怎么处理的
2020-8-3 07:01:31 评论

举报

主要用处是  我按下按键 然后把 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=9delay_init(sys_clock*8); //初始化延迟函数 72为运行频率uart_init(sys_clock*8,bote);   //初始化串口 函数 usart_init(x1,x2) x=运行频率 x=波特率   bote=1200JTAG_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);
}
2020-8-3 07:17:39 评论

举报

你的si没看到清零的地方...
2020-8-3 07:35:02 评论

举报

忘记标了 一开始  定义的时候  u32 si=0;      
2020-8-3 07:50:40 评论

举报

定义的时候是0,但是你每次要统计啊.你不会是一直累加吧?
---------------------------------
正常是应该累加
例如我用sscom   发送 500字节  si应该=500 然后我再发送500字节 si应该=1000
2020-8-3 08:20:23 评论

举报

今天刚测试了 采用FT232RL 一次传输100k数据 无一出错。 
但是有个疑惑请楼上指教:  我采用FT232RL 选择3.3v ttl输出  STM32居然一个数没收到。   但是看资料 应该是3.3ttl 和5v 都应该能支持才对啊 
2020-8-3 09:13:28 评论

举报

你的"选择5VTTL"和"选择3.3VTTL"是指修改VCCIO的电压,还是用配置软件设置?我从来只用3.3V,从来没有问题.
2020-8-3 09:24:36 评论

举报

采用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欧电阻 
2020-8-3 09:36:54 评论

举报

5V应该是无问题的.
STM32的串口直接接5V设备的串口,照样工作的.
你这个可以用示波器看看波形.
2020-8-3 09:51:26 评论

举报

麻烦检查地线是否连接正确.
2020-8-3 10:02:37 评论

举报

2020-8-3 10:17:30 评论

举报

只有小组成员才能发言,加入小组>>

86个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

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