如何写个串口发送接收不一致接收或发送后的超时判断

21ic官方微信-->
后使用快捷导航没有帐号?
查看: 5428|回复: 20
怎么尽可能保证串口数据全接收,长时间接收
&&已结帖(5)
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
想请教个问题。 今天做了个串口环形缓冲测试,PC用115200速度对STM32F103发数据,一次发20字节,板子接收以后在返回到PC,结果测试几分钟之后,出现了一次乱码,PC接收到的数据量显示比发送的少了一个字节。
怎么才能保证发送给STM32串口的数据100%被接收下来呢, 从软件 程序上考虑, 缓冲区怎么设计, 我用的是环形缓冲。没开DMA,&&个人感觉,开了DMA的话,原理跟没开DMA是一样的,只不过是减少了中断次数而已,但是在长时间接收时,也不一定能保证全部接收吧,尤其是还有其他任务要处理,比如数据写到sd卡?
满意回复+2
WriteBuffer()中有对WrBuf,ReBuf变量的操作,ReadBuffer()函数也操作了这2个变量。WriteBuffer()在中断中调用,ReadBuffer()在主循环调用。这肯定会出问题,你 ...
1ms内stm32处理的字符数0/8=14个字符,你1ms间隔循环发送20个字节太快了吧
115200这个波特率其实对STM32F103来说不快,不可能收不下来。
用环形缓冲也是个好办法。如果担心,可以把buffer开大点,个人觉得128个字节就足够了。不开DMA也没 ...
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
资深工程师, 积分 11272, 距离下一级还需 8728 积分
资深工程师, 积分 11272, 距离下一级还需 8728 积分
主题帖子积分
专家等级:结帖率:75%
主题帖子积分
资深工程师, 积分 11272, 距离下一级还需 8728 积分
资深工程师, 积分 11272, 距离下一级还需 8728 积分
115200这个波特率其实对STM32F103来说不快,不可能收不下来。
用环形缓冲也是个好办法。如果担心,可以把buffer开大点,个人觉得128个字节就足够了。不开DMA也没有问题,中断出来完全来得及,长时间接收也没问题的。
个人觉得即使1M的串口波特率,STM32F103也来得及处理,因为LZ只需要收到就发出
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
IJK 发表于
115200这个波特率其实对STM32F103来说不快,不可能收不下来。
用环形缓冲也是个好办法。如果担心,可以把bu ...
恩,我也听别人说过,是这个样子的。可是我今天这个测试还是失败了,估计是程序上的问题,求懂的帮我看看这个环形缓冲有没有问题。BUFFERSIZE 开始设置的5,后来设置的25, 测试时是1ms间隔循环发送20个字节。现在准备把buffer改成128试试
static u8 ReceiveBuffer[BUFFERSIZE];
static u8 WrBuf=0;
static u8 ReBuf=0;
void USART1_IRQHandler(void)
& & & & uint8_t ReceiveD& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //定义一个变量存放接收的数据
& & & & if(!(USART_GetITStatus(USART1,USART_IT_RXNE))); & & & & //读取接收中断标志位USART_IT_RXNE
& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & && & USART_ClearITPendingBit(USART1,USART_IT_RXNE);& & & & //清楚中断标志位
& && && &&&WriteBuffer();
& & & & }&&
void WriteBuffer( void)
& & if (WrBuf==ReBuf-1)
& & & & & & & &
& & & & ReceiveBuffer[WrBuf++]=USART_ReceiveData(USART1);
& & & & WrBuf=WrBuf%BUFFERSIZE;
u8 ReadBuffer(u8 *data)
& & & & if(ReBuf==WrBuf)
& & & & & & & & return 0;
& & & & *data=ReceiveBuffer[ReBuf];
& & & & ReBuf++;
& & & & ReBuf=ReBuf%BUFFERSIZE;
& & & & return 1;
int main(void)
& & & & u8 data=0;
& & & & SystemInit();& & & & & & & & & & & & & & & & & & & & //系统时钟配置
& & & & Init_NVIC();& & & & & & & & & & & & & & & & & & & & //中断向量表注册函数
& & & & Init_LED();& & & & & & & & & & & & & & & & & & & & & & & & //各个外设引脚配置
& & & & Init_Usart();& & & & & & & & & & & & & & & & & & & & //串口引脚配置
& & & & Usart_Configuration(115200);& & & & //串口配置 设置波特率为115200&&
& & & & while(1)& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & &
& & & & {&&
& & & & & & & & if (ReadBuffer(&data))
& & & & & & & & {
& & & & & & & & & & & & USART1_Send_Byte(data);
& & & & & & & & }
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 65, 距离下一级还需 35 积分
初级技术员, 积分 65, 距离下一级还需 35 积分
主题帖子积分
专家等级:结帖率:50%
主题帖子积分
初级技术员, 积分 65, 距离下一级还需 35 积分
初级技术员, 积分 65, 距离下一级还需 35 积分
WriteBuffer()中有对WrBuf,ReBuf变量的操作,ReadBuffer()函数也操作了这2个变量。WriteBuffer()在中断中调用,ReadBuffer()在主循环调用。这肯定会出问题,你应该在ReadBuffer()中关闭中断。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
资深技术员, 积分 376, 距离下一级还需 124 积分
资深技术员, 积分 376, 距离下一级还需 124 积分
主题帖子积分
专家等级:结帖率:88%
主题帖子积分
资深技术员, 积分 376, 距离下一级还需 124 积分
资深技术员, 积分 376, 距离下一级还需 124 积分
1ms内stm32处理的字符数0/8=14个字符,你1ms间隔循环发送20个字节太快了吧
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
buaaszb 发表于
WriteBuffer()中有对WrBuf,ReBuf变量的操作,ReadBuffer()函数也操作了这2个变量。WriteBuffer()在中断中 ...
循环缓冲区,
WriteBuffer()和ReadBuffer()函数虽然里面都有WrBuf,ReBuf两个变量,但是WrBuf变量只在WriteBuffer()函数中进行了操作,同理,另一个也是,没有同时操作,两个变量只是比较了一下而已。在ReadBuffer()中关闭中断,那主循环再执行Read的时候,数据不是无法接收下来了?&&我是这么想的,不知道对不对
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
yueliangruying 发表于
1ms内stm32处理的字符数0/8=14个字符,你1ms间隔循环发送20个字节太快了吧 ...
感觉说的很有道理。那应该是 在串口固定波特率发送的时候, 单位时间发送的字节数过多,就会超过这个波特率的本身速度,从而导致发送端 出问题,
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
缓冲区设置128字节,1ms间隔循环发送13个字符,测试一段时间后,又出现问题。从发送 和接收字节看 似乎数据没没有丢失现象,但是为什么会乱码呢
本帖子中包含更多资源
才可以下载或查看,没有帐号?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 65, 距离下一级还需 35 积分
初级技术员, 积分 65, 距离下一级还需 35 积分
主题帖子积分
专家等级:结帖率:50%
主题帖子积分
初级技术员, 积分 65, 距离下一级还需 35 积分
初级技术员, 积分 65, 距离下一级还需 35 积分
当程序执行ReadBuffer()时,发生中断,WrBuf,ReBuf在中断里会被修改,中断返回后,ReadBuffer()面对的是已经被修改的WrBuf,ReBuf,所以会发生错误。所以,你在ReadBuffer()里,先关中断,最末尾再打开中断。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
学习了,多谢。但是如果关中断这段时间,来了数据,就无法接收了啊?&&如果把WrBuf,ReBuf这两个变量定义为volatile类型,是不是也能解决这个问题?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
buaaszb 发表于
当程序执行ReadBuffer()时,发生中断,WrBuf,ReBuf在中断里会被修改,中断返回后,ReadBuffer()面对的是已 ...
学习了,多谢。但是如果关中断这段时间,来了数据,就无法接收了啊?&&如果把WrBuf,ReBuf这两个变量定义为volatile类型,是不是也能解决这个问题?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
buaaszb 发表于
当程序执行ReadBuffer()时,发生中断,WrBuf,ReBuf在中断里会被修改,中断返回后,ReadBuffer()面对的是已 ...
学习了,多谢。但是如果关中断这段时间,来了数据,就无法接收了啊?&&如果把WrBuf,ReBuf这两个变量定义为volatile类型,是不是也能解决这个问题?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 65, 距离下一级还需 35 积分
初级技术员, 积分 65, 距离下一级还需 35 积分
主题帖子积分
专家等级:结帖率:50%
主题帖子积分
初级技术员, 积分 65, 距离下一级还需 35 积分
初级技术员, 积分 65, 距离下一级还需 35 积分
ReadBuffer()执行时间很短,估计不超过50个指令周期,这点时间不会影响中断接收的
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
buaaszb 发表于
ReadBuffer()执行时间很短,估计不超过50个指令周期,这点时间不会影响中断接收的 ...
这下明白了,以后写中断程序这点必须注意。& & 不过我又读了遍程序,就我这个程序而言,ReadBuffer函数只对ReBuf变量操作,WriteBuffer函数只对WrBuf操作,唯一可能出错的是 主循环调用ReadBuffer时,关于WrBuf和ReBuf的比较时, 中断导致WrBuf的变化,也就是再中断里面的 WrBuf++。 我这里即使发生了这种情况 ,其本身并不影响逻辑判断的结果, 这样的话,是否还有必要加上开关中断这一过程。问的比较多了,麻烦知道的话讲一下,谢谢。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级工程师, 积分 2792, 距离下一级还需 208 积分
初级工程师, 积分 2792, 距离下一级还需 208 积分
主题帖子积分
专家等级:结帖率:16%
主题帖子积分
初级工程师, 积分 2792, 距离下一级还需 208 积分
初级工程师, 积分 2792, 距离下一级还需 208 积分
面朝大海,春暖花开!
主题帖子积分
资深技术员, 积分 381, 距离下一级还需 119 积分
资深技术员, 积分 381, 距离下一级还需 119 积分
主题帖子积分
专家等级:结帖率:64%
主题帖子积分
资深技术员, 积分 381, 距离下一级还需 119 积分
资深技术员, 积分 381, 距离下一级还需 119 积分
换其他串口助手试试呢&&
每天多努力一点点!
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
是板子出了问题,严格说是板子的串口模块出了问题,所以才会这样,因为这个程序测试时间长了,大约两个小时,关掉板子电源,向板子发送的数据&&竟然也返回到了电脑上,但是是乱码。&&正常断电情况下,串口不应该是断路才对吗, 怎么还能将电脑发回的数据返回去呢?
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
反正换了一块板子,测试了一晚上,都很正常,没有乱码,数据接收的跟发送的 一样多。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
主题帖子积分
资深工程师, 积分 16330, 距离下一级还需 3670 积分
资深工程师, 积分 16330, 距离下一级还需 3670 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
资深工程师, 积分 16330, 距离下一级还需 3670 积分
资深工程师, 积分 16330, 距离下一级还需 3670 积分
呵呵&&问题解决了就好& &呵呵& &&&多逛21ic& &没有搞不定的问题& &呵呵& &顶一个
微软CEO史蒂夫·鲍尔默:不要激情,要有韧性
电子设计的灵魂是知识,坚持做技术,共勉
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
主题帖子积分
专家等级:结帖率:100%
主题帖子积分
初级技术员, 积分 72, 距离下一级还需 28 积分
初级技术员, 积分 72, 距离下一级还需 28 积分
对21ic确实比较满意,个人感觉这里比其他论坛热情。
21ic公开课,21ic网友共同的学习圈子!学单片机、嵌入式、模拟、电源……就看这里
移步更多21ic独家微课:
技术新星奖章
人才类勋章
时间类勋章
时间类勋章
技术领袖奖章
人才类勋章
核心会员奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术高手奖章
人才类勋章
时间类勋章
涓涓之细流
发帖类勋章
技术奇才奖章
人才类勋章
湍急之河流
发帖类勋章
精华达人奖章
等级类勋章
时间类勋章查看: 547|回复: 6
串口超时接收的时间怎么计算?
串口超时接收的时间如何根据波特率来计算?
打包时间间隔为当前波特率下发送两个字节所需要的时间,计算方法为&&1000/波特率*串口数据bit数(起始位+数据位+停止位),单位ms,如9600波特率下发送一个字节所需时间为*(1+8+1)约等于1ms,同理115200时时间为0.086ms,注意:此计算得来的值与实际运行的值,有一定误差,波特率越小,误差越大。(参考:)
打包时间间隔为当前波特率下发送两个字节所需要的时间,计算方法为&&1000/波特率*串口数据bit数(起始位+数 ...
此时间就是串口超时接收的时间吗?例如9600波特率,当时间超过了2ms还没有接收到下一个数据是不是就意味着一帧数据已经发送完成?
一般标准是3.5字节
(ˇ_ˇ) 想~了解
此时间就是串口超时接收的时间吗?例如9600波特率,当时间超过了2ms还没有接收到下一个数据是不是就意味 ...
在STM32串口中断中 IDLE(总线空闲中断)判断是超过一个字符的时间即产生总线空闲中断。
如果想要获取具体的时间,建议结合逻辑分析仪看下数据周期再处理。
我在CAN接收超时中断中用的时间是5ms。
在STM32串口中断中 IDLE(总线空闲中断)判断是超过一个字符的时间即产生总线空闲中断。
如果想要获取具体 ...
谢谢,好像都没有一个统一,都是凭经验!
阿莫电子论坛, 原"中国电子开发网"STM32串口超时判断方式接收未知长度数据
> STM32串口超时判断方式接收未知长度数据
STM32串口超时判断方式接收未知长度数据
usart.c串口中断处理函数:本文引用地址:void USART1_IRQHandler(void){
if(USART1->SR&(1<DR;
if(USART1_Recv_LenCNT=0;
//计数器清空if(Rec_Over_Flag==0)TIM3_Set(1);
//使能定时器4的中断 USART1_RX_BUF[USART1_Recv_Len++]=
//记录接收到的值
}else {Rec_Over_Flag=1;
//强制标记接收完成} }
} timer.c定时器中断函数//定时器3中断服务程序
void TIM3_IRQHandler(void){
if(TIM3->SR&0X0001)//溢出中断{ Rec_Over_Flag=1;TIM3->SR&=~(1<<0);
//清除中断标志位TIM3_Set(0);LED1=!LED1;
//RxTimeout等于0,变换LED1表明该次发送结束
}//设置TIM4的开关//sta:0,关闭;1,开启;void TIM3_Set(u8 sta){if(sta){TIM3->CNT=0;
//计数器清空TIM3->CR1|=1<CR1&=~(1<<0);//关闭定时器3
}main.c主函数int main(void){
u8u8 Password[7]="123456";u8 Tishi1[]="操作码长度不对";u8 Tishi2[]="操作码不正确";u8 Tishi3[]="指令成功执行!";u16 times=0;
Stm32_Clock_Init(9); //系统时钟设置delay_init(72);
//延时初始化 uart_init(72,57600);
//串口初始化为57600LED_Init();
//初始化与LED连接的硬件接口 Timerx_Init(99,7199);
//10kHz的技术频率,计数到100为10mswhile(1){ if(Rec_Over_Flag==1){
if(USART1_Recv_Len!=0x06)
//USART1_Recv_Len接收数据的长度不等于6{ Putstrings(Tishi1);}else
// USART1_Recv_Len接收数据的长度等于6{for(t=0;tDR=*ptr++;while((USART1->SR&0X40)==0);//等待发送结束}USART1->DR=\n;}
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一

我要回帖

更多关于 串口只能发送不能接收 的文章

 

随机推荐