关于那个串口通讯的问题。麻烦指导下
一是:如果串口收到数据,产生中断后。我先处理其它程序没有给RI归0时。那么发送方是会继续按时钟发送数据呢。还是等到我接收方软件RI归位后才接着发送呢。二是:如果双方同时发...
一是:如果串口收到数据,产生中断后。我先处理其它程序没有给RI归0时。那么发送方是会继续按时钟发送数据呢。还是等到我接收方软件RI归位后才接着发送呢。
二是:如果双方同时发大量(不止一个字节)数据时,会怎么样?因为我单片机每发送一个字节都会while(!TI);TI=0;这里有循环。假如我发5个字节,就会有5个循环在处理,那么对方发数据来时。会产生中断。去执行接收处理程序了。这里的发送循环是不是就被中断了,那么对我的发送就会产生影响吧。但是我上机测试,发现结果是,发送循环一直正常。倒是对方发来的数据丢掉了中间5个字节。这是怎么回事。
如果我想双方都同时发送接收数据。单片机里应该怎么写。是不是应该软件里设置个结束符(比如0x0d),比如收到对方发来的结束符,表示上位机命令发送完了。然后我根据这个判断。再将结果发送回去。发送完了再加一个结束符,上位机才知道可以发送一条命令了。
主要就是发送接收同时进行的问题。我迷糊好久了。麻烦指导一下。按理说,如果上位机发查询命令,下位机收到规定的结束符后再发送结果,这样是不会有什么问题的。但这只适用于双方有规定的查询命令协议(一人说一句话的来)时。
如果双方都有可能不定期发送数据怎么办。比如。上位机可以随时查询下位机温度。随时可以下发查询命令。但下位机每隔60秒又定时在向上位机报告温度。不管上位机请求没有。这种情况就有可能数据线上同时在发送和接收多字节数据(如果刚好时间巧合的话)。那么这种情况会造成什么样的数据丢失?我上机试了,确实不正常,但我搞不懂原理。
(只有十分了,不好意思。真心求教。谢谢您了) 展开
二是:如果双方同时发大量(不止一个字节)数据时,会怎么样?因为我单片机每发送一个字节都会while(!TI);TI=0;这里有循环。假如我发5个字节,就会有5个循环在处理,那么对方发数据来时。会产生中断。去执行接收处理程序了。这里的发送循环是不是就被中断了,那么对我的发送就会产生影响吧。但是我上机测试,发现结果是,发送循环一直正常。倒是对方发来的数据丢掉了中间5个字节。这是怎么回事。
如果我想双方都同时发送接收数据。单片机里应该怎么写。是不是应该软件里设置个结束符(比如0x0d),比如收到对方发来的结束符,表示上位机命令发送完了。然后我根据这个判断。再将结果发送回去。发送完了再加一个结束符,上位机才知道可以发送一条命令了。
主要就是发送接收同时进行的问题。我迷糊好久了。麻烦指导一下。按理说,如果上位机发查询命令,下位机收到规定的结束符后再发送结果,这样是不会有什么问题的。但这只适用于双方有规定的查询命令协议(一人说一句话的来)时。
如果双方都有可能不定期发送数据怎么办。比如。上位机可以随时查询下位机温度。随时可以下发查询命令。但下位机每隔60秒又定时在向上位机报告温度。不管上位机请求没有。这种情况就有可能数据线上同时在发送和接收多字节数据(如果刚好时间巧合的话)。那么这种情况会造成什么样的数据丢失?我上机试了,确实不正常,但我搞不懂原理。
(只有十分了,不好意思。真心求教。谢谢您了) 展开
1个回答
展开全部
实现的串行通信,那么收发双方,应该有个协议。
一般来说,上位机发出的字节,可以说是发出“命令”;从机收到后,应该执行命令,然后向上位机“汇报”一批字节。
这种主从式,只是利用半双工即可正常工作,不会“双方同时发大量(不止一个字节)数据”。
按照主从式,多台下位机就不能自动的上传数据,都应该等待主机的命令,再传送。
--
如果双方确有大量数据需要同时互相传送,接收每个字节的时候,还是应该用中断方式。
而发送每个字节的时候,采用while(!TI);TI=0;是可以的,但是等待时间会很长,太浪费CPU的时间。那么发送,也可以采用中断方式。主程序就轻松多了。
发送大量字节,双方也应该有协议,比如发送16字节,就等待对方应答,得到对方的回信后,再传送下个16字节。
如果没有得到对方的回信,说明数据丢失了,应该重新传送,多次不正常后,应该显示传送错误。
呵呵,随便瞎写一堆,仅供参考。
一般来说,上位机发出的字节,可以说是发出“命令”;从机收到后,应该执行命令,然后向上位机“汇报”一批字节。
这种主从式,只是利用半双工即可正常工作,不会“双方同时发大量(不止一个字节)数据”。
按照主从式,多台下位机就不能自动的上传数据,都应该等待主机的命令,再传送。
--
如果双方确有大量数据需要同时互相传送,接收每个字节的时候,还是应该用中断方式。
而发送每个字节的时候,采用while(!TI);TI=0;是可以的,但是等待时间会很长,太浪费CPU的时间。那么发送,也可以采用中断方式。主程序就轻松多了。
发送大量字节,双方也应该有协议,比如发送16字节,就等待对方应答,得到对方的回信后,再传送下个16字节。
如果没有得到对方的回信,说明数据丢失了,应该重新传送,多次不正常后,应该显示传送错误。
呵呵,随便瞎写一堆,仅供参考。
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询