visa串口字节数接收数据八个字节一组是什么原因

串口接收数据八个字节一组是什么原因_读书人
串口接收数据八个字节一组是什么原因
&来源:读书人网&【读书人网():综合教育门户网站】
串口接收数据8个字节一组是什么原因?发现个很奇怪的现象。串口收数据时,不管一次来了多少个字节,只要是超过
串口接收数据8个字节一组是什么原因?发现个很奇怪的现象。串口收数据时,不管一次来了多少个字节,只要是超过8个字节的就会给截成几段,按照8个字节一组的方式,比如接收15bytes,就是8+7,每次都这样,但是写入时,是多少个字节就一次性写入多少个字节。不知道什么原因?我用的不是控件,是ReadFile函数哈、有知道什么原因的吗? [解决办法]你ReadFile、超时设置、以及串口是如何打开的?检测过串口事件吗。这些不清楚&不好说原因[解决办法]把ReadFile函数的参数发一下[解决办法]你ReadFile的DWORD&nNumberOfBytesToRead是不是设置成8了[解决办法]楼主上代码,BOOL&WINAPI&ReadFile(&&_In_&&&&&&&&&HANDLE&hFile,&&_Out_&&&&&&&&LPVOID&lpBuffer,&&_In_&&&&&&&&&DWORD&nNumberOfBytesToRead,&&_Out_opt_&&&&LPDWORD&lpNumberOfBytesRead,&&_Inout_opt_&&LPOVERLAPPED&lpOverlapped);想看看你怎么填写的[解决办法]1.&如果不是你在ReadFile中指定收8字节的话,我猜测这应该与串口驱动有关,RS-232串口硬件模块16550中有16字节的接收FIFO缓冲。驱动程序可设置收几个字节后发硬件中断。通常设8个比较好。---没人能看到微软的源码。2.&发送是另外一回事,是被操作系统缓冲了。[解决办法]这个是可以直接设置的,楼主直接搜索下[解决办法]你的下位机是单片机,so&that&is&her&style&MSComm串口控件接收数据,为啥接收五六千字节后乱了?【vb吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:101,548贴子:
MSComm串口控件接收数据,为啥接收五六千字节后乱了?收藏
前面收的好好的,没问题。一收到五六千字节后,就开始乱了。这是怎么回事?
vb编程语言培训.南昌达内培训=O元试学+名师授课+小班精英教学+职业规划+全国就业!达内vb编程语言培训.7W合作名企,就业率99%,不就业免费重学
可能是接收字节计数的变量超过整数定义的最大值。可以定义为长整数解决。
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或09-1609-1608-2809-05
09-0202-1607-2804-08
◇本站云标签IDLE中断什么时候发生?
IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。
如何判断一帧数据结束,就是我们今天讨论的问题。因为很多项目中都要用到这个,因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。
看了前面IDLE中断的定义,你就会明白了,一帧数据结束后,就会产生IDLE中断。这个中断真是太TMD有用了。省去了好多判断的麻烦。
如何配置好IDLE中断?
下面我们就配置好串口IDLE中断吧。
这是串口CR1寄存器,其中,对bit4写1开启IDLE中断,对bit5写1开启接收数据中断。(注意:不同系列的STM32,对应的寄存器位可能不同)
(RXNE中断和IDLE中断的区别?
当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。)
这是状态寄存器,当串口接收到数据时,bit5就会自动变成1,当接收完一帧数据后,bit4就会变成1.
需要注意的是,在中断函数里面,需要把对应的位清0,否则会影响下一次数据的接收。比如RXNE接收数据中断,只要把接收到的一个字节读出来,就会 清除这个中断。IDLE中断,如何是F0系列的单片机,需要用ICR寄存器来清除,如果是F1系列的单片机,清除方法是&先读SR寄存器,再读DR寄存 器&。(我怎么知道?手册上写的)
下面以STM32F103为例给出源程序。
我们先来看程序中的主要部分。
如果你原来的串口初始化函数具有打开串口接收中断的话,实际上就是在初始化函数中多了一条打开空闲中断的语句。
串口中断函数
串口中断函数里面,最重要的两条语句,就是上图中圈出来的两条语句。第一条语句用来判断是否接收到1个字节,第二条语句用来判断是否接收到1帧数据。(是不是感觉超级方便?妈妈再也不用担心我如何判断是否接收完1帧数据了。)
阅读(...) 评论()查看: 10361|回复: 59
STM32串口接收不定长数据原理与源程序
今天说一下STM32单片机的接收不定长度字节数据的方法。由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。
IDLE中断什么时候发生?
IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据。
如何判断一帧数据结束,就是我们今天讨论的问题。因为很多项目中都要用到这个,因为只有接收到一帧数据以后,你才可以判断这次收了几个字节和每个字节的内容是否符合协议要求。
看了前面IDLE中断的定义,你就会明白了,一帧数据结束后,就会产生IDLE中断。这个中断真是太TMD有用了。省去了好多判断的麻烦。
如何配置好IDLE中断?
下面我们就配置好串口IDLE中断吧。
这是串口CR1寄存器,其中,对bit4写1开启IDLE中断,对bit5写1开启接收数据中断。(注意:不同系列的STM32,对应的寄存器位可能不同)
(RXNE中断和IDLE中断的区别?
当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就会产生IDLE中断。比如给单片机一次性发送了8个字节,就会产生8次RXNE中断,1次IDLE中断。)
这是状态寄存器,当串口接收到数据时,bit5就会自动变成1,当接收完一帧数据后,bit4就会变成1.
需要注意的是,在中断函数里面,需要把对应的位清0,否则会影响下一次数据的接收。比如RXNE接收数据中断,只要把接收到的一个字节读出来,就会清除这个中断。IDLE中断,如何是F0系列的单片机,需要用ICR寄存器来清除,如果是F1系列的单片机,清除方法是“先读SR寄存器,再读DR寄存器”。(我怎么知道?手册上写的)
下面以STM32F103为例给出源程序。
我们先来看程序中的主要部分。
串口初始化函数片段
如果你原来的串口初始化函数具有打开串口接收中断的话,实际上就是在初始化函数中多了一条打开空闲中断的语句。
串口中断函数
串口中断函数里面,最重要的两条语句,就是上图中圈出来的两条语句。第一条语句用来判断是否接收到1个字节,第二条语句用来判断是否接收到1帧数据。(是不是感觉超级方便?妈妈再也不用担心我如何判断是否接收完1帧数据了。)
我写的这个主函数,是用来验证接收的正确性的。RxCounter表示的是这一帧数据有几个字节,接收完一帧数据,会在中断函数里面把ReceiveState置1,然后,通过串口把接收到的数据发送回串口。这样,既验证了接收了多少字节的正确性,又验证了接收到的数据是否正确。
上图是结果验证。
点击下载源程序:
(2.25 MB, 下载次数: 280)
23:11 上传
点击文件名下载附件
& && && && && && && && && && && && && &
& && && && && && && && && && &&&我是瑞生,毫无保留的给大家透露电子设计经验,不定时分享实用的落地的电子设计技巧,希望能够帮助到大家。& &
/**
&&******************************************************************************
&&* @file& & 串口接收不定长字节数据
&&* @author&&瑞生
&&* @version V1.0
&&* @date& &
&&* @brief& &Main program body
&&******************************************************************************
&&******************************************************************************
&&*/&&
/* Includes ------------------------------------------------------------------*/
#include &stm32f10x.h&
#include &uart.h&
volatile uint8_t aRxBuffer[100]={0x00};
volatile uint8_t RxCounter=0;
volatile uint8_t ReceiveState=0;
/**
&&* @brief&&Main program.
&&* @param&&None
&&* @retval None
&&*/
int main(void)
{
& & & & uint8_t i=0;
& & & &
& & & & USART1_Init();
& & & &
&&while (1)
&&{
& & & & & & & & if(ReceiveState==1)//如果接收到1帧数据
& & & & & & & & {
& & & & & & & & & & & & ReceiveState=0;
& & & & & & & & & & & & i=0;
& & & & & & & & & & & & while(RxCounter--)// 把接收到数据发送回串口
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & USART_SendData(USART1, aRxBuffer[i++]);& & & &
& & & & & & & & & & & & & & & & while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
& & & & & & & & & & & & }
& & & & & & & & & & & & RxCounter=0;
& & & & & & & & }
&&}
}
 好详细的帖子,谢谢lz
 程序下来试了,IDLE进不了啊!
这两天正在琢磨STM32F103的串口中断处理程序,之前以为只能一个字节一个字节接收,多谢楼主提醒还有IDLE这个帧数据接收,大爱啊!
这两天正在琢磨STM32F103的串口中断处理程序,之前以为只能一个字节一个字节接收,多谢楼主提醒还有IDLE这个帧数据接收,大爱啊!
谢谢楼主的分享,太赞了,终于解决我这个不定长GPS信息的接收问题了,赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞赞
程序下来试了,IDLE进不了啊!
你进不了吗?我就是参考了 这个思想,很棒啊!你看看是不是板子的型号不对,他这是F1的,修改程序,和你的板子相称
感觉挺不错,之前还有个什么串口延时处理,要是这个能用的话都不用那么麻烦了
赞,解决了我的问题
太感谢楼主了
谢谢楼主分享,帮了大忙。。。。。。。
正在学这个,给点赞楼主
为什么最后串口发送的数据总是有个别数据丢失了呢?
楼主,为什么最好发送的数据总是有个别的数据丢失了呢?
楼主,波特率为9600的时候数据是正确的,当波特率设置为115200时,数据就不正确了,为什么呢?
真心是太TMD有用了
大家好,我是新来的,就像楼主说的方法我也试了,只不过是用的UART4,在发送的时候也是有数据丢失,是什么原因呢
zhichizhichi
非常谢谢。
好东西,谢谢!
好东西,学习了。
非常有用,modbus可以用上 前面说的9600可以有这个情况吗
谢谢楼主的分享,太赞了
很好,学习学习!
一直在找方法到底怎么做!!!!!!!!!!!!
真心的良心帖子
强!!!!为;楼主的态度点赞!!
谢谢楼主的分享,太赞了
不错,支持
继续顶,终于有黑币可以下载了
感谢楼主教诲
好贴&&推荐
正好需要串口传速大量的数据,不知道速度跟不跟得上
嗯,不错不错,我之前还是使用流控制界定帧的,移植性好一点,但是既然STM32自带这个功能那为何不用呢,
 兄弟,为什么我参考你的这个程序,串口助手发送11 22 33 44 55时,单片机接收出现FF 11 22 33 44 55
Powered by

我要回帖

更多关于 串口多字节接收 的文章

 

随机推荐