你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 串口通信 发送字符串超过64个字符 出现故障

[复制链接]
奇迹的2011 提问时间:2015-12-9 23:12 /
不知道有没有哪位朋友遇到过从上位机发送超过64个字符的字符串到下位机,下位机将接受到的字符串存入缓存,然后原样输出,在缓存超过64个字符后出现有错误情况如以下帖子一样。
链接:https://www.stmcu.org.cn/module/ ... p;page=1#pid2143334

哪位能找到好的办法解决,能否指点一下我,希望大伙能顶起这个帖子,因为该试的我都试了,还是解决不了。

1.个人觉得STM32下位机接收到的字符串是不是不能超过64个;
2.是不是STM32的串口驱动程序有可以修改的限制发送与接收的字符长度,是我没有找到?
收藏 1 评论15 发布时间:2015-12-9 23:12

举报

15个回答
废鱼 回答时间:2015-12-10 09:19:33
用的是那个库?要注意发送的缓冲区。
disheng4688 回答时间:2015-12-10 09:42:28
帮顶。                                    
奇迹的2011 回答时间:2015-12-10 11:29:31
安 发表于 2015-12-10 09:19
用的是那个库?要注意发送的缓冲区。

3.5的。。。。。。。。。。。。。。。。。
奇迹的2011 回答时间:2015-12-10 11:29:57
安 发表于 2015-12-10 09:19
用的是那个库?要注意发送的缓冲区。

比如。。。。。。。。。。。。。。。。。。?
废鱼 回答时间:2015-12-10 14:07:54
接收中断里面看看,缓冲区的大小是多少。
埃斯提爱慕 回答时间:2015-12-10 19:20:30
提示: 作者被禁止或删除 内容自动屏蔽
奇迹的2011 回答时间:2015-12-10 21:56:47
安 发表于 2015-12-10 14:07
接收中断里面看看,缓冲区的大小是多少。

这是中断部分的。缓存我定义了200个
#define Buf1_Max 120                                           //串口1缓存长度
char Uart1_Buf[120];
void USART1_IRQHandler(void)                        
{
                        char Res1=0;            //(USART_GetFlagStatus)
                        
         if(USART_GetFlagStatus(USART1, USART_FLAG_ORE ) ==SET)//数据过载错误 。USART_IT_ORE          USART_GetFlagStatus
                {
                    USART_ClearFlag(USART1, USART_FLAG_ORE );
                        USART_ReceiveData(USART1);
                //        Res1 =USART_ReceiveData(USART1);
                //        Uart1_Buf[First_Int1] = Res1;            //将接收到的字符串存到缓存中               
                //        First_Int1++;
                }
         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中断产生
           {
                    USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志
                        Res1 =USART_ReceiveData(USART1);  
                        Uart1_Buf[First_Int1] = Res1;            //将接收到的字符串存到缓存中               
                        First_Int1++;                                        //缓存指针向后移动
                }
         if(First_Int1 > Buf1_Max )                       //如果缓存满,将缓存指针指向缓存的首地址
                {
                        First_Int1 = 0;
                }   
                 
}
zhangdaijin 回答时间:2015-12-11 08:54:11
废鱼 回答时间:2015-12-11 15:24:23
看代码没有问题,这样对比一下发送和接收的数据,还有查看一下是否发生过溢出。
奇迹的2011 回答时间:2015-12-13 22:08:07
安 发表于 2015-12-11 15:24
看代码没有问题,这样对比一下发送和接收的数据,还有查看一下是否发生过溢出。 ...

如何查看有无溢出情况?在KEILL里边看?给个指点
废鱼 回答时间:2015-12-14 10:43:27
在中断里面,有溢出标志位。你看一下。是不是发送的速度太快了?
钊钊 回答时间:2015-12-14 11:14:44
试试用DMA来玩,应该没问题吧
奇迹的2011 回答时间:2015-12-15 22:20:45
钊钊 发表于 2015-12-14 11:14
试试用DMA来玩,应该没问题吧

问题已经解决了。。。
犯了一个最低级的错误,就是在串口中断里边不应该再放入判断的语句,因为在你还没判断完成时下一个中断就到来了,使接收的数据出错。
奇迹的2011 回答时间:2015-12-15 22:21:35
安 发表于 2015-12-14 10:43
在中断里面,有溢出标志位。你看一下。是不是发送的速度太快了?

问题已经解决了。。。
犯了一个最低级的错误,就是在串口中断里边不应该再放入判断的语句,因为在你还没判断完成时下一个中断就到来了,使接收的数据出错。
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版