当前位置: 代码迷 >> 单片机 >> PC机给51单片机发字符串的有关问题
  详细解决方案

PC机给51单片机发字符串的有关问题

热度:220   发布时间:2016-04-28 16:28:45.0
PC机给51单片机发字符串的问题
今天试了下PC通过串口发数据给51 (字符串,即多个字节)
有些问题, 以下是我的一些猜想

1.因为51的串口接收中断是在收到一帧后将RI置位请求中断,所以发送多字节至51时,51要产生多次中断才能接收完.

2.在PC中,我所知道的是操作系统会为每个串口开一个缓冲区,收到的数据都先存至这里. 而系统提供给我们的API, windows下的ReadFile ,Linux下的read. 应该都是从这个缓冲区里读数据.所以PC里不用及时地读串口数据,数据也不会丢失(根据以往经验的猜想).

3.相对PC,51的缓冲区似乎就只有一个SBUF.只有一个字节. 因此不及时读数据似乎会丢失.(因为我们51采集温度等数据大概需要一秒.这一秒应是需要严格的时序的,所以这一秒内必须关中断?) 按照这个我用
EA=0;
DelayM(1000); //1秒
EA=1;
模拟了这个情况.
发现我发的多个字节就只收到了第一字节.( 我猜想51对这个的处理maybe是:收完第一个字节,硬件置位RI,
由中断系统结构那个框图,因EA=0.通路断开,不能引发中断. 而后续的字节也许是因为R1为置位状态,表示当前帧末被处理.
而被51忽略了. 然后当1秒延时过后,EA=1.通路通了,马上引发中断.但此时数据已没了.

4.PC上似乎没有写缓冲区(好像也不需要),当上层调用Write发数据时是直接发的,并且不保证所发数据是否被接收方收到.

所以我想问问串口底层的一些问题, 不知我上面理解的对不对? 重点为红字吧.不对的话可纠正我.有补充的也希望能回帖一下..


另外,大家对PC给51发字符串有什么好方法么.. (在51还有其它东西也要处理的时候?)



------解决方案--------------------
关注。。。。。
------解决方案--------------------
PC通过串口发送数据也是靠中断发送的,只不过最底层的函数被封装了,提供给用户的就是使用方便的API函数了。
你也可以仿照这样,给51做一个软件的串口缓冲区FIFO,只收数据但不处理,然后在主函数里面处理这些收到的数据
------解决方案--------------------
1.因为51的串口接收中断是在收到一帧后将RI置位请求中断,所以发送多字节至51时,51要产生多次中断才能接收完.
就是这样的
2.在PC中,我所知道的是操作系统会为每个串口开一个缓冲区,收到的数据都先存至这里. 而系统提供给我们的API, windows下的ReadFile ,Linux下的read. 应该都是从这个缓冲区里读数据.所以PC里不用及时地读串口数据,数据也不会丢失(根据以往经验的猜想).
MCU没有缓冲区,只能自己软件来做

3.相对PC,51的缓冲区似乎就只有一个SBUF.只有一个字节. 因此不及时读数据似乎会丢失.(因为我们51采集温度等数据大概需要一秒.这一秒应是需要严格的时序的,所以这一秒内必须关中断?) 按照这个我用
EA=0;
DelayM(1000); //1秒
EA=1;
模拟了这个情况.
发现我发的多个字节就只收到了第一字节.( 我猜想51对这个的处理maybe是:收完第一个字节,硬件置位RI,
由中断系统结构那个框图,因EA=0. 通路断开,不能引发中断. 而后续的字节也许是因为R1为置位状态,表示当前帧末被处理.
而被51忽略了. 然后当1秒延时过后,EA=1.通路通了,马上引发中断.但此时数据已没了.

MCU编程不能长时间关中断,更改一下你的编程思路。


------解决方案--------------------
(因为我们51采集温度等数据大概需要一秒.这一秒应是需要严格的时序的,所以这一秒内必须关中断?)

不能关中断,考虑其它办法吧。你的时序的最小单元时间是多少?10ms?1ms?
用时间片的概念,把通讯的时间安排到时序中。
------解决方案--------------------
串口中应该有个数据准备发送线的
如果顺序是PC发送指令->51接收指令->51返回数据
可以把数据准备发送这个线接到51外部中断(应该可以直接用MAX232)
然后51一有中断就在终中断里用查询方式接收

温度采集数据要单独放个BUF里用定时器按时采集,不要到收到PC指令时你数据还没准备好

你温度采集是用其他模块?
普通中断不会导致一般的通信(I2C,SPI...)出问题除非你中断里任务太多了
------解决方案--------------------
调试有步骤的
首先排除硬件的问题,变一个简单的小程序,再找一个上位机的调试软件运行一下。
然后单调试通信程序,然后。。。。
------解决方案--------------------
中断时有优先级的,你那个温度采集如果采用定时器定时中断进行采集比较靠谱,这是你的串行口中断不会影响你的温度采集中断服务程序,因为定时器中断的优先级要高一些。这样就可以保证你的温度采集系统不出差错了。然后等到你的定时器中断结束后,还可以继续响应那个串口中断。。。。。
  相关解决方案