2759|6

124

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

问一个 串口通信的问题 纠结了很久 [复制链接]

 
串口发送数据是一位一位发送的  接收数据也是一位一位接收的  除去起始位 和 停止位  就剩下了 8位 数据    当接收到8位数据后便申请中断  所以必须在下一个8位数据来之前取走这个数据  不然这个数据就会丢失   以上这些  是别人告诉我的   
(下面是我的理解)
但是 串口里面不是有一个叫  接收缓存寄存器  吗??单片机来不及  处理的  数据  不是可以存在  那里吗??  还有 如果 我通过  串口调试  助手  向单片机 发送yes  我的理解是  先发送 y   然后是e  最后是s  系统会分别将  这三个字母  拆分成8位数据+1个停止位+1个起始位  但是就会触发3次串口接收中断
还有人 告诉我  发送  yes  就是将 y e s  这三个字母  一起 打包成  8位数据+1个起始位+1个终止位
我现在很迷糊
我的  理解对不对啊??问了好几个人  查了一些关于串口的资料  但是还是不理解   求指教

最新回复

串口接收的电路原理是定时采样,然后将采样结果送入移位寄存器,移位寄存器的8位存储满了之后整体转入接收寄存器,如果这时使能了接收中断则发生中断请求。所谓接收缓存指的是移位寄存器,只要在移位寄存器溢出之前将接收寄存器内的数据取走即可保证不丢失数据。有些MCU带有串口FIFO,这时准许更多字节的缓存,但多数MCU是没有FIFO的。 对于发多个字节的数据,都是一个字节、一个字节独立处理的,过程完全相同。楼主对此的理解是正确的。  详情 回复 发表于 2014-3-7 16:09
点赞 关注
 

回复
举报

114

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
在430的串口中,接收缓冲是一字节一字节接收的,你要没取走,就会被下一个数据给覆盖掉。
 
 
 

回复

449

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
本帖最后由 Aragorn 于 2014-3-7 10:30 编辑

看来你周边的人都是半桶子水啊,那就让我这个大半桶子水的人来替你解答吧:
1. 每一款单片机都不一样,有一些是这样的:移位寄存器 —> FIFO[n] —> 接收缓冲器。移位寄存器将通信线上的比特位一位一位的移进来,移完之后放到FIFO,一般FIFO不止一个,有很多是16个。而接收缓冲器对应着FIFO中最早收到的数据,而单片机总是只能从接收缓冲器中读数据。这种单片机可以一次接收多个而不丢失数据;

2. 有一些单片机没有FIFO,比如变态的STM32,那么它是这样的:移位寄存器 —> 接收缓冲器,这个时候如果你不用DMA传送,那么就得在下一个数据接收完成之前读取出来,否则就会丢失;

3. 如果你直接发送yes,那么在通信线上面出现的一定是y+e+s,你的单片机会分三次接收到这三个字符。当然了,如果你想办法将yes这三个字符加密变成一个字符,那么通信线上只会出现一个字符,只不过你要在单片机上面用逆方法将它解密成三个字符。总之一句话,你给串口写几个字符,那么它就发送几个,不会多发,出不会少发。它会为每一个字符构造起始位和停止位,甚至校验位,然后一位一位移出去。

点评

那还好 。。。。嘿嘿 我想把收到的yes 存在一个数组里面 我现在还没有什么成型的思路 只是感觉应该 将这3个字符放在 一个数组里面 我的想法是将 接收缓存寄存器 中的 yes 通过一个for循环 来放到数组  详情 回复 发表于 2014-3-7 11:08
 
 
 

回复

124

帖子

0

TA的资源

一粒金砂(中级)

4
 
Aragorn 发表于 2014-3-7 10:29
看来你周边的人都是半桶子水啊,那就让我这个大半桶子水的人来替你解答吧:
1. 每一款单片机都不一样,有 ...

那还好  。。。。嘿嘿   我想把收到的yes  存在一个数组里面  我现在还没有什么成型的思路   只是感觉应该 将这3个字符放在  一个数组里面  我的想法是将  接收缓存寄存器  中的  yes  通过一个for循环  来放到数组里面  可是  此时RBUF  里面已经有  3个字符了  我该怎么  为数组元素惊醒赋值啊??大侠  麻烦你帮我写一下这条鱼据吧   我也学习一下    跪谢啦~~

点评

示意代码如下: //下面是中断程序 if(接收缓存不空) { ucBuff[ ulRxCount++ ] = RBR; }  详情 回复 发表于 2014-3-7 12:35
 
 
 

回复

449

帖子

0

TA的资源

纯净的硅(中级)

5
 
1157421908 发表于 2014-3-7 11:08
那还好  。。。。嘿嘿   我想把收到的yes  存在一个数组里面  我现在还没有什么成型的思路   只是感觉应 ...

示意代码如下:

//下面是中断程序

if(接收缓存不空)
{
        ucBuff[ ulRxCount++ ] = RBR;
}

 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

6
 
在430的串口中,接收缓冲是一字节一字节接收的,你要没取走,就会被下一个数据给覆盖掉。
 
 
 

回复

1万

帖子

141

TA的资源

版主

7
 
串口接收的电路原理是定时采样,然后将采样结果送入移位寄存器,移位寄存器的8位存储满了之后整体转入接收寄存器,如果这时使能了接收中断则发生中断请求。所谓接收缓存指的是移位寄存器,只要在移位寄存器溢出之前将接收寄存器内的数据取走即可保证不丢失数据。有些MCU带有串口FIFO,这时准许更多字节的缓存,但多数MCU是没有FIFO的。
对于发多个字节的数据,都是一个字节、一个字节独立处理的,过程完全相同。楼主对此的理解是正确的。
个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表