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

anjie4402211 2010-04-26 09:25:00
今天试了下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还有其它东西也要处理的时候?)

...全文
599 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
cyymycc 2010-04-27
  • 打赏
  • 举报
回复
调试有步骤的
首先排除硬件的问题,变一个简单的小程序,再找一个上位机的调试软件运行一下。
然后单调试通信程序,然后。。。。
dceacho 2010-04-27
  • 打赏
  • 举报
回复
串口中应该有个数据准备发送线的
如果顺序是PC发送指令->51接收指令->51返回数据
可以把数据准备发送这个线接到51外部中断(应该可以直接用MAX232)
然后51一有中断就在终中断里用查询方式接收

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

你温度采集是用其他模块?
普通中断不会导致一般的通信(I2C,SPI...)出问题除非你中断里任务太多了
anjie4402211 2010-04-27
  • 打赏
  • 举报
回复
谢谢qzf368和azmao

关于时序的, 我也问了别人.
说是温度采集要求并不太高.如果在时序中产生中断,时序后延,中断后继续.
因此我打算试试这个.

另外我还想到一个就是:
可以使用一个标记位.在那1秒采集温度前,将标记置位. 在串口中断将其复位. 然后温度采集后再检查标记是否置位. 仍置位表示这期间没有产生中断. 数据有效,可将其发往上位机.否则过程中有中断.数据无效.

希望能行
azmao 2010-04-27
  • 打赏
  • 举报
回复
(因为我们51采集温度等数据大概需要一秒.这一秒应是需要严格的时序的,所以这一秒内必须关中断?)

不能关中断,考虑其它办法吧。你的时序的最小单元时间是多少?10ms?1ms?
用时间片的概念,把通讯的时间安排到时序中。
azmao 2010-04-27
  • 打赏
  • 举报
回复
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编程不能长时间关中断,更改一下你的编程思路。

chutianya 2010-04-27
  • 打赏
  • 举报
回复
中断时有优先级的,你那个温度采集如果采用定时器定时中断进行采集比较靠谱,这是你的串行口中断不会影响你的温度采集中断服务程序,因为定时器中断的优先级要高一些。这样就可以保证你的温度采集系统不出差错了。然后等到你的定时器中断结束后,还可以继续响应那个串口中断。。。。。
qzf368 2010-04-26
  • 打赏
  • 举报
回复
PC通过串口发送数据也是靠中断发送的,只不过最底层的函数被封装了,提供给用户的就是使用方便的API函数了。
你也可以仿照这样,给51做一个软件的串口缓冲区FIFO,只收数据但不处理,然后在主函数里面处理这些收到的数据
贝隆 2010-04-26
  • 打赏
  • 举报
回复
关注。。。。。

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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