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...)出问题除非你中断里任务太多了
[解决办法]
调试有步骤的
首先排除硬件的问题,变一个简单的小程序,再找一个上位机的调试软件运行一下。
然后单调试通信程序,然后。。。。
[解决办法]
中断时有优先级的,你那个温度采集如果采用定时器定时中断进行采集比较靠谱,这是你的串行口中断不会影响你的温度采集中断服务程序,因为定时器中断的优先级要高一些。这样就可以保证你的温度采集系统不出差错了。然后等到你的定时器中断结束后,还可以继续响应那个串口中断。。。。。