51单片机,单片机串口接收数组后,再发出一个数据,这样对么??麻烦大神指点一下,帮忙指点指点。

单片机串口在接收发送一帧数据时,在接收不等长的数据帧时是怎么处理的?_百度知道
单片机串口在接收发送一帧数据时,在接收不等长的数据帧时是怎么处理的?
我有更好的答案
必须用中断的方式接收,每接收一个字节中断一次,然后统计接收字节数,达到要求的数量后再进行处理。对于不等长的数据帧,可根据第一个字节(这种通信方式都有一个字节的特征字)或特征字来区分,然后确定接收的字节数。
主从通信时,其中一个字节为数据内容的长度,那样怎么处理?有没有具体的例子
那就更好办了,以这个长度为计数值,对接收的数据减法计数,减为0时,接收结束。
传一段这样的代码看看
不同的通协议有不同的程序,可根据议来写好了。
采纳率:92%
如果不确定长度的,可以用超时的方式来接收串口信息
那种数据帧中带一个数据长度的该怎么处理?请给一段串口处理的例子看看,谢谢
如果带有长度那就更简单了,在一个报文中肯定是有数据头,然后再有数据长度,你读到长度以后开始计数,得到相应长度以后再校验
传一段这样的代码看看
关注这个问题
为您推荐:
其他类似问题
数据帧的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。查看: 1244|回复: 10
3.3v稳压值有问题,请大神指点
主题帖子精华
新手上路, 积分 30, 距离下一级还需 20 积分
在线时间6 小时
自己手动画了一块单面板,单片机是5v系统,用稳压芯片输出3.3给某模块供电的,单片机接入之前测试模块电压是3.3v没问题,一旦单片机接入(开关闭合),模块电压就有问题了,在4.5v这样子,不大明白单片机负载对之前的3.3芯片供电有什么影响么
bfd09defb1_251.jpg (0 Bytes, 下载次数: 0)
22:54 上传
主题帖子精华
在线时间425 小时
LZ的意思是接入模块之后,5V电源变成4.5V?
技术交流,Sell 中颖单片机,欢迎私信骚扰
主题帖子精华
新手上路, 积分 30, 距离下一级还需 20 积分
在线时间6 小时
回复【2楼】黑夜之狼:
---------------------------------
是1117稳压芯片,原来应该是3.3v输出,但是变成了4.5v输出
奇怪的是,没插单片机之前,稳压没有问题,插上单片机之后,才这样的
主题帖子精华
在线时间425 小时
回复【3楼】我要上自习:
---------------------------------
接上单片机之后,原先3.3V稳压变成4.5V,有可能稳压管已经坏了
技术交流,Sell 中颖单片机,欢迎私信骚扰
主题帖子精华
新手上路, 积分 30, 距离下一级还需 20 积分
在线时间6 小时
回复【4楼】黑夜之狼:
---------------------------------
可是把单片机拿下去之后,稳压还是能回到3.3v
我看其他人说要将电源分离,不大会弄了现在。。。
主题帖子精华
金钱127449
在线时间1111 小时
回复【5楼】我要上自习:
---------------------------------
你的51单片机IO口电压,将模块的电压拉高了...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
金钱127449
在线时间1111 小时
可以串电阻试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺:
主题帖子精华
在线时间425 小时
回复【5楼】我要上自习:
---------------------------------
没试过这情况,看看手册是怎么说的,可以像原子哥所说的那样,串联电阻上去试试
技术交流,Sell 中颖单片机,欢迎私信骚扰
主题帖子精华
中级会员, 积分 336, 距离下一级还需 164 积分
在线时间0 小时
回复【6楼】正点原子:
---------------------------------
为什么里面可以拉高&不都是基于VDD之类的吗&&难道是因为IO口里面有电荷泵?
不用谢了……
主题帖子精华
初级会员, 积分 122, 距离下一级还需 78 积分
在线时间4 小时
io口隔离吧
主题帖子精华
高级会员, 积分 572, 距离下一级还需 428 积分
在线时间82 小时
回复【9楼】eling13:
---------------------------------
5V单片机的IO高电平是5V,这个5V通过3V模块的IO倒灌到3V电源上了
Powered by说出来你可能不信,王二正在被信息怪追杀,没错,就是那……
OLED在显示行业的热度还没达到顶峰,Micro LED就出来&ld……
要说最近半导体行业的巨人战争,当属博通费尽心机收购高……
在高性能的应用,如智能汽车、小型的医疗设备这个领域,……
&在我开始讲之前,我希望大家记住Power by
演讲人:郝晓贝时间: 10:00:00
演讲人:王海莉时间: 10:00:00
演讲人:卢柱强时间: 10:00:00
预算:¥30000预算:¥610000
广东省广东省
基于51单片机的低成本心电监护系统设计
[导读] 1 引言虚拟医学仪器充分利用计算机丰富的软硬件资源,仅增设少量专用软、硬件模块,便可实现传统仪器的全部功能及一些传统仪器无法实现的功能,同时缩短了研发周期。本系统由两部分组成:以C单片机为核心的
&1 引言本文引用地址:
虚拟医学仪器充分利用计算机丰富的软硬件资源,仅增设少量专用软、硬件模块,便可实现传统仪器的全部功能及一些传统仪器无法实现的功能,同时缩短了研发周期。本系统由两部分组成:以C单片机为核心的数据采集装置和以PC机为平台的分析处理系统。设计中充分考虑数据采集装置体积小、功耗低、操作快捷的要求,因此全部采用SMT封装的元器件。PC监护终端通过USB接口接收数据,传输速率高;采用图形编程语言LabVIEW编写显示、存储、分析处理等功能程序。该系统可实时监护并提供心动周期,心率等参数,也可进行数据的存储回放,为心血管疾病的诊断提供依据。系统的软件开发和硬件与上位机软件的集成测试表明,系统运行稳定可靠,取得了预期效果。
2 系统硬件设计
该系统由C数据采集模块和PC机两部分组成,如图1所示。
数据采集模块主要由心电采集电路和基于C单片机的DAQ接口卡构成,如图2所示。
图2 数据采集模块
该模块通过C片上A/D转换器采集经预处理的心电信号,再将其由USB总线传输至PC机显示。PC机部分主要是软件设计,包括通过C单片机片上USB主机API函数和LabVIEW软件编写数据采集图形用户界面;实现接收、显示和处理由数据采集模块通过USB接口发送采集数据的程序。LabVIEW应用程序和C应用程序均采用Silicon
Laboratories公司的USB Xpress开发套件的API和驱动程序实现对底层USB器件的读写操作。
心电信号属于微弱信号,体表心电信号的幅值范围为1~10
mV。在测量心电信号时存在很强的干扰,包括测量电极与人体之间构成的化学半电池所产生的直流极化电压,以共模电压形式存在的50
Hz工频干扰.人体的运动、呼吸引起的基线漂移,肌肉收缩引起的肌电干扰等。采用遥测HOLTER三导联线和一次性心电电极与人体接触,能很好地减小运动和呼吸引起的肌电干扰。前端放大器采用具有极高共模抑制比(CMRR)的仪用AD620放大器,放大倍数约为50倍;并采用0.05~100
Hz的带通滤波器和50
Hz的陷波电路,抑制信号的基线漂移、高频噪声及工频干扰。为了充分利用A/D转换的精度,在转换前先将信号放大到A/D转换电路参考电压的70%左右,考虑到信号中会附加直流成分,需在A/D转换电路前增加电平调节电路。个体心电幅度的差异要求电路中设计程控放大电路,又为了便于心电信号的标定和考虑到实际器件放大倍数与理论值的偏差,在程控放大电路前设置一个手动可调的放大电路(1~10倍)。
综上分析,心电采集与程控放大部分应包括:AD620前端放大、0.05~100 Hz的带通滤波、50
Hz陷波、手动放大、程控放大和电平提升等电路。其中程控放大功能利用CD4051电子开关的数字选通实现,具有1~50倍的调节范围。
为减少系统功耗,应采用低功耗、集成度高的器件。该系统选用C单片机作为数据采集卡的核心部件。该器件是完全集成的混合信号系统级器件,具有与8051兼容的高速CIP-51内核,与MCS-51指令集完全兼容,片内集成了数据采集和控制系统常用的模拟、数字外设及USB接口等其他功能部件。外部电路简单,易于实现,如图3所示。
图3 外部电路
心电电极将得到的信号经滤波和可变增益放大器放大后送至C单片机,单片机将得到的模拟心电信号实时转换为数字信号,采集到的数据通过USB接口传给PC机,进一步分析处理信号数据。
3 系统软件设计
3.1 C单片机程序设计
C单片机程序包括:(1)A/D转换程序和程控放大控制程序;(2)基于USB器件的通信程序,接收从USB主机发送的用户指令并将采集的数据发送给USB主机。
3.1.1 A/D转换程序
衡量A/D转换性能主要有两个指标:采样分辨率(A/D转换器位数)和A/D转换速度。设置A/D转换器的采样率为2 000
Hz,并采用定时器TIME2溢出中断触发转换,每次转换结束后1O位结果数据字被锁存到A/D转换器的数据寄存器中,供USB通讯子程序数据调用,图4为A/D转换流程。A/D转换程序较简单,可通过设置C片上定时器确定A/D转换器的采样周期,由定时器的溢出周期性启动A/D转换器来采样被测数据。USB设置为块状传输模式与PC机进行数据通信。将每64个数据打成一个数据包。以充分利用硬件资源并提高数据传输效率。
图4 A/D转换流程
3.1.2 基于USB器件的通信程序
整个程序流程以USB通信为主线,如图5所示。图中所涉及的USB_Clock_Start()、USB_Int()等函数均是Silicon
Lab公司专为C单片机USB功能开发的USB端API函数。通过在C上层应用程序中直接调用这些函数可方便快捷地访问USB底层硬件。
图5 基于USB器件的通信程序流程
3.2 PC机LabVIEW程序设计
PC机LabVIEW程序设计主要完成用户图形界面和基于USB主机通信程序两大功能,从而实现人机交互,将用户输入的指令和采集模块采集的数据通过USB总线在PC机和C之间传递。
3.2.1 LabVIEW程序面板设计
开发USB设备驱动程序的工具使用USB Xpress Devel-opment
Kit,主要有:SI_Open()函数;SI_Close()函数;SI_Read函数;SI_Write()函数;SI_GetNumDevices()函数;SI_CheckRX
Queue()函数。用户从设备读取数据将调用一个应用程序接口API。SI_GetNumDevices()、SI_GetProductString()等函数均是Silicon
Lab公司专为C单片机USB功能开发的USB主机端API函数。LabVIEW提供调用链接库函数Call Librarv
Function,本设计利用Silicon Lab公司的SiUSBXp.dll动态链接库来实现对USB底层硬件的访问。
通过调用SLGetNumDevices()甬数完成设备的通信初始化,生成函数返回驱动的设备号;该设备号用来在调用SI
GetProductString()函数时生成设备描述字符串。要读取一个设备,首先必须通过调用SI_GetNumDevices()函数生成的索引(设备号)来调用SI_Open()函数。SI_Open()函数将返回设备的句柄,该句柄将在随后的所有进程中被用到。利用
SI_Write()和SI_Read()函数就可实现数据的输入和输出。当完成数据的输入和输出操作后,可通过调用SI_Close()关闭设备。图6为I/O接口驱动程序框图。
3.2.2 LabVIEW程序设计用户图形界面(前面板)设计
动态心电监护系统应用程序部分可实现心电信号的接收、实时显示、存储及回放功能;并可提供心动周期、心率等参数,为心率变异性分析和心血管疾病的诊断提供依据。心电监护系统显示界面如图7所示。
图5 心电监护系统显示界面
该设计不仅可实现传统测量仪器的全部功能,还能将实验数据存盘以进行反复观察分析。基于虚拟仪器的心电监护系统使用灵活方便、测试功能丰富、成本低廉。用户可根据实际需要,通过修改软件改变其功能和升级,实现一机多用。实验结果表明:该系统具有较强的抑制基线漂移能力、低功耗、操作简单。采用USB接口实时传输心电数据,并将心电数据采集模块设计为计算机外设,高速快捷。由于全部采用SMT封装,数据采集模块尺寸仅为60
mmx60 mm,方便实用。因此,该设计是一款实用的、低成本的、动态心电监护系统。
FZ-MCU51单片机开发板集实验开发、编程、仿真和下载于一体,支持AT89S51、AT89S52、AT89S53的和STC系列单片机如STC89C53RC等全系列单片机的编程和实验,使用配套的仿真模......关键字:
据报道,美国招聘网站Glassdoor周二发布今年最佳实习雇主榜单,硅谷科技公司占据其中大部分位置。......关键字:
时光飞逝,离俺最初画第一块电路已有3年。刚刚开始接触电路板的时候,与大家一样,俺充满了疑惑同时又带着些兴奋。......关键字:
我 要 评 论
热门关键词应用串行口的数字电压表,程序有错误,求大神指点【51单片机吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:59,270贴子:
应用串行口的数字电压表,程序有错误,求大神指点收藏
上图是我仿真的结果,根本不对呀这个是引脚连接部分
同步整流升压芯片,小封装升压芯片,大电流升压芯片,免费提供样品及DEM板测试,快充3V升12V/1.5A升压方案 免费提供样品板联系:
//************************乙机数字电压表***************************//
设计要求//
接收甲机数据//
电压变化范围0~5v//
用数码管显示测量结果//************************************************************//
单片机培训SF//************************************************************#include&reg51.h&
//51单片机调用头文件#define
//51单片机习惯定义#define
uchar unsigned
//51单片机习惯定义//****************定义引脚开始*******************************sbit dp = P0^0;//****************定义引脚结束*******************************//****************定义变量开始*******************************uchar code LEDData[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09};//共阳极段码//****************定义变量结束*******************************//****************定义函数开始*******************************void delay(uint z);
//调用延时程序void display(uint d);
//调用显示程序void init();
//调用初始化程序void rdd();
//接收程序//****************定义函数结束*******************************//****************主程序开始*********************************void main(){init();while(1){display(temp);}}//****************主程序结束*********************************//****************初始化程序开始*****************************void init(){SCON = 0x50;
//串口工作在方式1 允许接收TMOD = 0x20;
//定时器1 工作方式2TH1
//波特率为9600bit/sTL1
//启动定时器1RI
= 0x00; //P0口为输出做准备EA
= 1; //打开总中断ES
= 1; //打开串口中断}//***************初始化程序结束******************************//******************中断程序开始**********************************void rdd() interrupt 4{temp = SBUF;temp = temp * 1.9607843;}//*****************中断程序结束***********************************//****************显示程序开始*******************************void display(uint d){P2 = 0x80;
//显示个位P0 = LEDData[d%10];delay(5);P2 = 0x40;
//显示十位P0 = LEDData[d%100%10];delay(5);P2 = 0x20;
//显示百位P0 = LEDData[d/100];dp=0;//点亮百位的小数点delay(5);}//***************显示程序结束*******************************//***************延时程序开始*******************************void delay(uint z){uint x,y;for(x=z;x&0;x--)for(y=120;y&0;y--);}//**************延时程序结束*********************************
登录百度帐号如何用串口连续接收5个字节?连续中断5次吗? - 捷配电子市场网
如何用串口连续接收5个字节?连续中断5次吗?
作者:bosszc 栏目:
如何用串口连续接收5个字节?连续中断5次吗?请教大狭有个仪器每秒从串口发送5个字节,我用单片机从仪器的串口要读出这5个字节&&&.我的方法是用单片机连续中断5次来读的.但是好没有收到数据,请问是什么原因?由于仪器每秒是连续发送五个字节的数据,中间没有间断,但是单片机每次的串口中断只能接受一个字节,是不是要连续中断五次才能读完五字节。下面是接收数据的部分程序每次中断返回后都在等待新一次的中断,...........mov r0,#10h...........org 0023hreceive_data:&&&&jnb ri,$&&&&clr ri&&&&clr ex1&&&&;禁止外部按键中断&&&&mov a,sbuf&&&&mov @r0,a&&&&inc r0&&&&cjne r0,#15h,wait&&&&mov r0,#10hwait:&&&reti &&&波特率,n,8,1 定时器t1方式2,串口方式1.&&&&&
作者: 夏虫 于
10:05:00 发布:
单片机的接收缓冲区只有一个字节的空间单片机的接收缓冲区只有一个字节的空间,不可能一次接收5个字节
作者: yang96381 于
10:22:00 发布:
呵呵,制定通信协议!!!&
作者: sclarkca 于
12:02:00 发布:
不应该会这样的你第一个字节能收到吗?
作者: lishuanghua 于
12:20:00 发布:
你老在中断中等待新的中断,这样是不行的&
作者: isoar 于
12:29:00 发布:
他老人家的汇编写得不怎么样&
作者: tzfzephyr 于
13:39:00 发布:
你这样只能收到一个数据&
作者: bosszc 于
15:05:00 发布:
需要什么样的通信协议.我也知道一次中断,只能读取一个字节!所以我采用了中断五次的方法, 注意:每接受到一个字节后中断会返回的,并不是在中断中等中断!!!而且每过一秒,接受到的数据都会更新.就是重写10h~14h这5个单元. yang96381你好:&&&&不知道您能不能具体一点呢?需要什么样的通信协议.
作者: jjg 于
21:01:00 发布:
如果是每次固定收5个字节的数据,那你可以在中断中连续收5个。进入中断连续接收5个字节后再退出中断。
作者: 艾森豪威尔 于
8:26:00 发布:
作者: xymxym 于
11:48:00 发布:
中断里面接收一个字节放入缓冲数组后退出,不要死等!数组指针加1,再通过数组指针判断字节数是否达到了5个字节(也可以再用一个变量来作为计数,并与数组初值下标相加,相加后的和就是当前要存入的数组单元了,同时这个变量作为判断接收字节数的依据),如果达到了5个字节,则将数组指针重置初值(为下一次5个字节的接收作准备,如果用了计数变量的话,也要将变量置0x00)并置接收完毕的标致为1,在主程序里面去判断这个标致并相应处理就行了!怎么处理楼主应该会吧? * - 本贴最后修改时间: 11:52:48 修改者:xymxym
作者: bosszc 于
14:16:00 发布:
发送数据的协议是:,N,8,1 每秒一次,每次5字节多谢这末多大狭来参加讨论,还是要说明一下:1.仪器的串口发送数据的协议是:,N,8,1&&这个与接收端单片机串口设置为:定时器t1方式2,串口方式1,波特率 是否有什么问题或者不符?2.现在的问题是接受不到数据而不是接收到后怎末处理的问题.3.有人建议在中断中连续接收5字节,不知道如何可以在一次串口中断中实现,请指点. 请大家指点.谢谢.
作者: 夏虫 于
14:55:00 发布:
偶也不明白偶也不明白怎么在一次中断中连续接收5次?这跟5次中断有什么区别?
作者: xymxym 于
15:46:00 发布:
你要把串口方面初始化程序贴出来大家才能知道啊比如,TH1,TL1是多少,晶振是多少,TR1=等1?ES=1?EA=1?这样子谁知道你设的是不是4800bps,是否有没有使能串口中断!!!
作者: 南方的老树 于
18:35:00 发布:
不好在中断中连续接收n个字节,因为不能保证对方不会少发一个&
作者: hotpower 于
18:44:00 发布:
晕~~~&每秒是连续发送五个字节的数据,中间没有间断&停止位是干晕事的??? * - 本贴最后修改时间: 18:46:42 修改者:hotpower
作者: 啊龙 于
23:05:00 发布:
有意思,如果你只是接收,不必判断RI,直接清除,数据读入缓冲即可不好做的是,你如何能保证接收的5个数据同发送的5个数据同步,需要协议
作者: bosszc 于
9:35:00 发布:
回复: xymxym&比如,TH1,TL1是多少,晶振是多少,TR1=等1?ES=1?EA=1?这样子谁知道你设的是不是4800bps,是否有没有使能串口中断!!!& 波特率设置没有问题的!!!!晶振,TR1=1,ES=1,EA=1 中断是使能的.每次发送的第5个字节都是0dh,硬件是通过COM1口的3线简单接法.
作者: stering 于
9:57:00 发布:
我是5次中断反正我做的422的通讯协议是一次中断一个字节的。楼上高手不知道能不能详细介绍怎么在一次中断里取5个数
作者: water2005 于
20:41:00 发布:
re我想阿龙说的有道理,如何保证接收和发送一致,有可能发送5个,只接收到4个,或者像老树说的那样。如果实现了同步应该可以 * - 本贴最后修改时间: 20:49:04 修改者:water2005
作者: quliuwuhen 于
10:54:00 发布:
串口设置问题&
作者: xhf001 于
10:58:00 发布:
给你个程序COM: &&ACC&&&&&&&&PSW&&&&&&MOV&&&PSW,#10H&&&&&&JB&&&&TI,COM1&&&&&&CLR&&&RI&&&&&&MOV&&&A,SBUF&&&&&&MOV&&&@R0,A&&&&&&INC&&&R0&&&&&&INC&&&R2&&&&&&CJNE&&R2,#05H,COM2&&&&&&MOV&&&R2,#00H ;5字节计数器&&&&&&MOV&&&R0,#30H ;数据存放起始地址&&&&&&SETB&&02H&&;完毕标志COM2: POP&&&PSW&&&&&&POP&&&ACC&&&&&&RETICOM1: CLR&&&TI&&&&&&-----&&&&&&-----&&&&&&POP&&&PSW&&&&&&POP&&&ACC&&&&&&RETI&&&&&&
作者: xchangjun 于
11:08:00 发布:
用串口接收你可用串口rx接收,同时注意波特率及位数的设置
作者: SupermanTm 于
13:25:00 发布:
可以通过帧间隔期来实现同步的协议约定,发送端发出的数据是连续的(一帧内的相邻两个字节之间间隔不超过1byte的时间)接收端每发生RI中断即对计时器复位,当计时器到的时候就设定为帧同步状态。最节约资源的方法是,如果使用半双工的通讯,让发送始终发生(可通过外部器件封锁发送),那么在两次RI之间经过两次的TI中断则视作帧同步。
作者: bosszc 于
16:15:00 发布:
如何才能实现同步呢?????????如何才能实现同步呢?????????还是协议的问题吧????需要什么样的协议呢?
作者: bosszc 于
16:20:00 发布:
现在第一个字节也收不到!!!!!!!!!现在第一个字节也收不到!!!!!!!!!需要什么样的协议呢??如何才能同步呢?仪器是一次连续发送5字节,中间好象没有停止位,只是最后一个字节为0xd,表示一次发送完!!
作者: 南方的老树 于
16:23:00 发布:
协议已经规定了,有个尾也可以然后倒推,2个尾之间如果是4个字节那就是有效数据
作者: bosszc 于
16:25:00 发布:
如何同步呢????&
作者: dengm 于
17:39:00 发布:
re: 给你改一下, 要学会用 XRL&&&RX_BUF&&&EQU 10H&&&FRAM_LEN EQU 5&&&END_CODE EQU 0DH...........&&mov r0,#RX_BUF ;10h&&MOV (RX_BUF+FRAM_LEN-1), #(END_CODE+1)&&; 不等于 end_code ...........org 0023hreceive_data:&&&&JBC RI, RX_A&&&&&&clr TI&&&&&&RETI..........RX_A:&&&& ACC&&&&mov a,sbuf&&&&;*******&&&&&&&&&clr ex1&&&&;禁止外部按键中断&&&&mov @r0,a&&&&XRL A, #END_CODE&&&&&&&&&&&&&&&&JZ RX_B&&&&&&MOV A, #(RX_BUF + FRAM_LEN-1)&&&&&&XRL A, R0&&&&&&INC R0&&&&&&JNZ RX_X&&&&&&RX_B: &&&&MOV R0, #RX_BUF RX_X: &&&&POP ACC&&&&&&&&reti
* - 本贴最后修改时间: 17:49:33 修改者:dengm
作者: bosszc 于
18:29:00 发布:
这个仪器是主动发送数据的注意:这个仪器是主动发送数据的,所以如何实现握手信号是个问题,同步也是难题.
作者: happylover 于
18:59:00 发布:
不合理首先你的程序就有问题,在进入中断后,你知道ri标志位要清零,但在等待的之前就应该先将ri标志位清零,不然就一直带等待再次,这么做如果出现了误码的话,在现在这样的程序下,不好解决误码重发的问题,也就是上面几位朋友说到的.还是做好协议,用置标志位的方法好一些.
作者: liumsn 于
15:02:00 发布:
当然一次中断一个字节,自己另外定一个缓冲嘛&
作者: 艾森豪威尔 于
16:24:00 发布:
如果是每秒一次,每次5字节,那最好别一次中断收5个字节因为那样有可能对方发送得很慢(比方说每隔200ms发一个字节),那么你进一次中断要在中断里面等一秒,这是不允许的。所以建议还是采取一次中断接收一个字节的方法。下面是一次中断接收多个字节的例子(至少接收两个字节):unsinged
SerialBuf[N];unsinged *SerialBufp=SerialBvoid serial_isr(void){&&while(1) {&&&i=0;&&&if(RI==1)&&&&&RI=0;&&&*SerialBufp++=SBUF;&&&while(!RI)&&&{&&&&&if(i++ & 300)//估计值&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&*SerialBufp++=SBUF;&&&if((SerialBufp-SerialBuf)==N)&&&&& }}
作者: bosszc 于
9:57:00 发布:
多谢各位大狭的帮助,问题已经解决!!!&
作者: 肖敏锋 于
0:24:00 发布:
你的中断程序应保证执行时间应小于10B的数据传输时间。接收5个数据,设缓冲区5次中断是比较好的,个人认为你非要在一次接受5个也可以。就是效率不敢恭维
作者: LFSLY 于
8:45:00 发布:
你要把串口中断设为第一高优先级&
作者: zhwdy81 于
11:24:00 发布:
我做过的,很容易就实现的我用的是moto的,连续接收都做过的,没问题的,无论是模块,还是用软件来模拟的,都很容易实现的。如果是接收不到的话,或乱码的话最好也看一下设置,通常都是在波特率上出问题。
作者: bosszc 于
11:37:00 发布:
问题都解决了问题都解决了....谢谢大家参与讨论!决定!决定
作者: 夏虫 于
15:18:00 发布:
说说怎么解决的啊!!大家共同分享嘛&
作者: huxiangbin 于
21:09:00 发布:
就是怎么解决的呀?&
讨论内容:
Copyright &
www.dzsc.com 浙ICP证030469号

我要回帖

更多关于 单片机串口接收数据包 的文章

 

随机推荐