serialPort 接收延时问题

pj386960300 2017-08-23 08:22:10
如题:
程序第一次发送串口指令.等待串口返回数据,如果隔3秒之后还没有接收到数据,程序再第二次发送同样的串口指令,这时串口开始连接返回第一次、第二次发送的指令。这样造成了我接收数据的重复。并且我在每次发送串口指令之前我都会清buffer ,可是无效和。
请问有没有什么方法,在我第二次发送串口指令时,终止串口第一次发送指令的数据返回?

目前我采用了一种很笨的方法来解决,就是我在发送指令的时候设了一个变量,然后我在接收数据的时候也设了一个变量,判断两者是否相等,如果相等,则接收数据。但是这种方法总觉得有问题。
另外,这分数已经是我可用分数了,还请大家见谅!
...全文
439 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
一个灵敏的系统,它的设计自然一开始是“发散的”,然后逻辑上再汇聚成一个强大而灵敏的系统。 那种只会顺序编程思维的人,只能做一些简单的数学函数,并不能设计出来好的交互式系统软件。
  • 打赏
  • 举报
回复
“死循环、阻塞、延迟、同步”这些都是好的通讯编程的大忌。当你发送消息之后,你的过程就应该结束了。然后如果收到了返回(因为你一直监听和处理 DataReceived 事件,并且在识别收到了一条完整的消息)之后立刻回调这条消息对应的预先注册的委托。当你发送消息之后可以注册一个3秒定时器回调,当你收到了返回时则停止此定时器回调;否则它定时回调时按照超时逻辑继续处理。 总之,最关键地是,如果你一上来就是什么死循环的思路,那么你把全部精力都用来处理一个事情(本来应该分别设计成千上万独立的事件回调),而且还做不好。
易2017 2017-08-23
  • 打赏
  • 举报
回复
引用 楼主 pj386960300 的回复:
如题: 程序第一次发送串口指令.等待串口返回数据,如果隔3秒之后还没有接收到数据,程序再第二次发送同样的串口指令,这时串口开始连接返回第一次、第二次发送的指令。这样造成了我接收数据的重复。并且我在每次发送串口指令之前我都会清buffer ,可是无效和。 请问有没有什么方法,在我第二次发送串口指令时,终止串口第一次发送指令的数据返回? 目前我采用了一种很笨的方法来解决,就是我在发送指令的时候设了一个变量,然后我在接收数据的时候也设了一个变量,判断两者是否相等,如果相等,则接收数据。但是这种方法总觉得有问题。 另外,这分数已经是我可用分数了,还请大家见谅!
串口返回的数据是下位机发送的,你如何终止,你接收数据为什么不能重复呢?没有具体的需求没有办法帮你分析问题
易2017 2017-08-23
  • 打赏
  • 举报
回复
串口通信有这么慢么,我觉得你应该从下位机找问题
单片机课程设计 双机通信 一、设计目的 1、掌握单片机89C52的程序设计,掌握单片机通信程序编制方法。 2、了解单片机实现通信的硬件环境。 3、掌握双机通信的原理和方法。 二、设计要求 1、用两片单片机,实现双机通信; 2、用与A机连接的按键控制A机对B机的信息传输,每按一次键,首先发送端显示要发送 数据,两台机器的发光二极管的显示相同。 3、用与B机连接的按键控制B机对A机的信息传输,每次按键,数码管的显示自动加一。 三、设计器材 "器件名称 "个数 " "STC8952RC "2 " "晶振 "2 " "电容(30PF) "4 " "电容(10uF) "2 " "LED "4 " "电阻(10K) "4 " "电阻(330) "2 " "电阻(8.2K) "2 " "开关 "4 " "数码管 "2 " "三极管(NPN) "1 " "排阻 "1 " 四、设计思路及方案 1、设计思路 计划采用主从共两片STC8952RC单片机来实现双机通信的,我们采用单片机直接交叉 连接的方式,上位机发送的数据由串行口TXD端输出,直接由下位机的串行口数据接收端 RXD接收。需要注意的是一定要保证主从机相同的数据传输速率,即要求设置相同的波特 率。电路分为数码管显示模块,单片机工作的基本复位、晶振模块。 2、设计原理 (1)原理概述 双机通信系统通过主从单片机的串行口来实现数据的收发。主单片机通过开关电路 来启动发送程序,当开关按下时向从机发送一个数据,从机通过接收中断来接收主机发 送过来的数据,并通过编写好的数据代码在LED数码管上显示主机发送过来的数据。同时 从机给主机发送一个应答信号来表示已经接收到了主机发送过来的数据,在主机接收应 答并校验正确,以二极管显示,这样就完成了一个数据的通信过程,等待按键按下,然 后继续下一次数据的发送直到结束。 (2)串行通信 串行数据通信要解决两个关键问题,一个是数据传送,另一个是数据转换。所谓数 据传送就是指数据以什么形式进行传送。所谓数据转换就是指单片机在接收数据时,如 何把接收到的串行数据转化为并行数据,单片机在发送数据时,如何把并行数据转换为 串行数据进行发送。单片机的串行通信使用的是异步串行通信,所谓异步就是指发送端 和接收端使用的不是同一个时钟。异步串行通信通常以字符(或者字节)为单位组成字 符帧传送。字符帧由发送端一帧一帧地传送,接收端通过传输线一帧一帧地接收。而对 于两个单片机之间的串行通信,由于具有相同的数据格式及电平且是短距离通信则不必 要使用一些电平转化芯片便可直接实现串行通讯,需要注意的是两单片机硬件要共地, 软件中需要设置相同波特率。 五、软件系统实现 1、软件仿真图 单片机晶振电路 复位电路 2、软件程序代码 (1)甲机程序代码 /* 名称:甲机串口程序 说明:甲机向乙机发送控制命令字符,甲机同时接收乙机发送的数字,并显示在数码管 上。*/ #include #define uchar unsigned char #define uint unsigned int sbit LED1=P1^0; sbit LED2=P1^3; sbit K1=P1^7; uchar Operation_No=0; //操作代码 //数码管代码 uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //延时 void DelayMS(uint ms) { uchar i; while(ms--) for(i=0;i<120;i++); } //向串口发送字符 void Putc_to_SerialPort(uchar c) { SBUF=c; while(TI==0); TI=0; } //主程序 void main() { LED1=LED2=1; P0=0x00; SCON=0x50; //串口模式 1,允许接收 TMOD=0x20; //T1 工作模式 2 PCON=0x00; //波特率不倍增 TH1=0xfd; TL1=0xfd; TI=RI=0; TR1=1; IE=0x90; //允许串口中断 while(1) { DelayMS(100); if(K1==0) //按下 K1 时选择操作代码 0,1,2,3 { while(K1==0); Operation_No=(Operation_No+1)%4; switch(Operation_No)//根据操作代码发送 A/B/C 或停止发送 { case 0: Putc_to_SerialPort('X'); LED1=LED2=1; break; case 1: Putc_to_SerialPort('A');

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧