发新帖我要提问
12
返回列表
打印

51单片机双机串口通信程序问题(很诡异)

[复制链接]
楼主: 青石向晚
手机看帖
扫描二维码
随时随地手机跟帖
21
青石向晚|  楼主 | 2010-5-31 18:46 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
我想问一下,发送方怎样确定接受方已经将sbuf里面的数据取走了,万一接收方并没有取走而发送方还在发数据岂不是把上面的没有取走的数覆盖了?? 20# 冷漠

使用特权

评论回复
22
冷漠| | 2010-5-31 20:11 | 只看该作者
本帖最后由 冷漠 于 2010-5-31 20:15 编辑

所以,高级通信技术是按“帧”发送的,每帧可能100,甚至1000字节,——一页书一帧,发送接收方都有几百、几千字节的缓冲器。这是外话。

UART每帧一字节封装,2字节缓冲器,不太现实每字节都要接收方回应。不过,这就像打电话一样,只要连接过了,发送方就只管“说”,不用担心接收方是否听得见。——它肯定全能听得见。9600发送一字节大约1ms,1ms时间接收方能运行大约500条指令。而一条aaa=SBUF;指令只要几us。接收中断的响应时间也是几us,如果中断接收,20us之内肯定能取走了,接收还有一级缓冲,也就是说,(不采用中断接收的话)500条指令里,你不取走都没关系,2ms内,1,000条指令执行完,顾及一下SBUF取走就行啦。有这么编通信程序的吗?

使用特权

评论回复
23
efen| | 2010-5-31 20:29 | 只看该作者
利害利害,学习了

使用特权

评论回复
24
冷漠| | 2010-6-1 08:30 | 只看该作者
本帖最后由 冷漠 于 2010-6-1 08:32 编辑

回21楼:
     SBUF被覆盖的条件是RI=0,当SBUF“满”时,RI=1,SBUF“自锁”,不会被覆盖。只有可能丢失后面接收的数据,——接收器数据无法进入SBUF,只能丢弃了。

    当程序取走SBUF数据时,紧接着清除RI=0,于是SBUF“解锁开门,成为接收器的第1级缓冲器。

这就是SBUF取数指令和RI=0;解锁指令应该顺序先后同时执行的原因吧。

使用特权

评论回复
25
冷漠| | 2010-6-1 08:59 | 只看该作者

看字符串加了' \0 ' 后的输出

本帖最后由 冷漠 于 2010-6-1 09:02 编辑

下面这句写错了:
     for(;i<strlen(sendData)-1;i++)
                send(sendData);     
可以修改为:   
       for(;i<strlen(sendData);i++)
                send(sendData );

使用特权

评论回复
26
冷漠| | 2010-6-1 09:07 | 只看该作者

去掉' \ 0' ,正好多输出一字节!

本帖最后由 冷漠 于 2010-6-1 09:10 编辑

去掉字符串后面的结尾标志'\0'(NUL),正好多输出一字节:uchar i ;  然后以uchar j = 0 ;  充当字符串结尾!

unsigned char sendData[]={'1','2','3','4','5','a','n','b','f' };   // 定义要发送的数据


使用特权

评论回复
27
冷漠| | 2010-6-1 09:12 | 只看该作者
再把uchar j=0 ; 也注释掉,试试?输出更不可控了。

使用特权

评论回复
28
nym209| | 2011-1-10 16:44 | 只看该作者
我用你的程序了,编译都过不去。卡在receivedata=receive();
怎么办?

使用特权

评论回复
29
hf5542| | 2011-5-24 22:21 | 只看该作者
mark

使用特权

评论回复
30
ou_er| | 2011-5-24 23:10 | 只看该作者
膜拜一下

使用特权

评论回复
31
luanxuan1| | 2013-10-25 17:16 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则