关于单片机串口同时收发数据的时序问题
一是:如果串口收到数据,产生中断后。我先处理其它程序没有给RI归0时。那么发送方是会继续按时钟发送数据呢。还是等到我接收方软件RI归位后才接着发送呢。二是:如果双方同时发...
一是:如果串口收到数据,产生中断后。我先处理其它程序没有给RI归0时。那么发送方是会继续按时钟发送数据呢。还是等到我接收方软件RI归位后才接着发送呢。
二是:如果双方同时发大量(不止一个字节)数据时,会怎么样?因为我单片机每发送一个字节都会while(!TI);TI=0;这里有循环。假如我发5个字节,就会有5个循环在处理,那么对方发数据来时。会产生中断。去执行接收处理程序了。这里的发送循环是不是就被中断了,那么对我的发送就会产生影响吧。但是我上机测试,发现结果是,发送循环一直正常。倒是对方发来的数据丢掉了中间5个字节。这是怎么回事。
如果我想双方都同时发送接收数据。单片机里应该怎么写。是不是应该软件里设置个结束符(比如0x0d),比如收到对方发来的结束符,表示上位机命令发送完了。然后我根据这个判断。再将结果发送回去。发送完了再加一个结束符,上位机才知道可以发送一条命令了。
主要就是发送接收同时进行的问题。我迷糊好久了。麻烦指导一下。按理说,如果上位机发查询命令,下位机收到规定的结束符后再发送结果,这样是不会有什么问题的。但这只适用于双方有规定的查询命令协议(一人说一句话的来)时。
如果双方都有可能不定期发送数据怎么办。比如。上位机可以随时查询下位机温度。随时可以下发查询命令。但下位机每隔60秒又定时在向上位机报告温度。不管上位机请求没有。这种情况就有可能数据线上同时在发送和接收多字节数据(如果刚好时间巧合的话)。那么这种情况会造成什么样的数据丢失?我上机试了,确实不正常,但我搞不懂原理。
麻烦各位指教一下 展开
二是:如果双方同时发大量(不止一个字节)数据时,会怎么样?因为我单片机每发送一个字节都会while(!TI);TI=0;这里有循环。假如我发5个字节,就会有5个循环在处理,那么对方发数据来时。会产生中断。去执行接收处理程序了。这里的发送循环是不是就被中断了,那么对我的发送就会产生影响吧。但是我上机测试,发现结果是,发送循环一直正常。倒是对方发来的数据丢掉了中间5个字节。这是怎么回事。
如果我想双方都同时发送接收数据。单片机里应该怎么写。是不是应该软件里设置个结束符(比如0x0d),比如收到对方发来的结束符,表示上位机命令发送完了。然后我根据这个判断。再将结果发送回去。发送完了再加一个结束符,上位机才知道可以发送一条命令了。
主要就是发送接收同时进行的问题。我迷糊好久了。麻烦指导一下。按理说,如果上位机发查询命令,下位机收到规定的结束符后再发送结果,这样是不会有什么问题的。但这只适用于双方有规定的查询命令协议(一人说一句话的来)时。
如果双方都有可能不定期发送数据怎么办。比如。上位机可以随时查询下位机温度。随时可以下发查询命令。但下位机每隔60秒又定时在向上位机报告温度。不管上位机请求没有。这种情况就有可能数据线上同时在发送和接收多字节数据(如果刚好时间巧合的话)。那么这种情况会造成什么样的数据丢失?我上机试了,确实不正常,但我搞不懂原理。
麻烦各位指教一下 展开
2个回答
展开全部
回答这些问题之前,你要先复习一下串口部件的结构和数据收发的原理。
1.不管你有没有处理RI,还是在继续接收数据的。数据接收完成之后,数据从移位寄存器转移到数据寄存器中,这时才产生中断,但移位寄存器是空的,还可以继续接收数据。
2.你想让串口的收和发同时工作,那就只能使用中断方式,你用查询方式是不可能的。如果是使用“半双工”,那就简单些:A查询方法发送数据,B以查询方式接收数据,反之依然,这样的缺点是比较耗时,没有实时性。
后面的几个问题就用2来回答了,就是用中断的方法来接收和发送数据,这样不管你是不是同时收发的,都能处理。按照你的例子说,上位机要发送命令来查询下位机的结果,那简单,下位机必须要一个缓冲区来保存收到的数据,然后在主程序中处理缓冲区中的内容,再根据情况向上位机发送数据。当然下位机的发送也可以使用缓冲区来保存待发送的数据。
使用缓冲区的好处就是能保证不发送遗漏。比如上位机可以一次发送多个命令给下位机,这样就是在接收缓冲区中形成命令队列,即“排队”,下位机逐一处理队列中的每一条命令,然后将对应结果送入发送缓冲区中“排队”,再有串口发送中断逐一将其中的字节发送出去。
1.不管你有没有处理RI,还是在继续接收数据的。数据接收完成之后,数据从移位寄存器转移到数据寄存器中,这时才产生中断,但移位寄存器是空的,还可以继续接收数据。
2.你想让串口的收和发同时工作,那就只能使用中断方式,你用查询方式是不可能的。如果是使用“半双工”,那就简单些:A查询方法发送数据,B以查询方式接收数据,反之依然,这样的缺点是比较耗时,没有实时性。
后面的几个问题就用2来回答了,就是用中断的方法来接收和发送数据,这样不管你是不是同时收发的,都能处理。按照你的例子说,上位机要发送命令来查询下位机的结果,那简单,下位机必须要一个缓冲区来保存收到的数据,然后在主程序中处理缓冲区中的内容,再根据情况向上位机发送数据。当然下位机的发送也可以使用缓冲区来保存待发送的数据。
使用缓冲区的好处就是能保证不发送遗漏。比如上位机可以一次发送多个命令给下位机,这样就是在接收缓冲区中形成命令队列,即“排队”,下位机逐一处理队列中的每一条命令,然后将对应结果送入发送缓冲区中“排队”,再有串口发送中断逐一将其中的字节发送出去。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询