用STC单片机模拟串口,接收的时候,只有第一个字节是正确的,后边的都错误,而且接收的数据比正确的数据短

unsignedcharRByte()//模拟串口接收,位间隔采用软件延时{unsignedcharj;//延时函数是用示波器调出来的while(1){if(newRXD... unsigned char RByte() //模拟 串口接收,位间隔采用软件延时
{
unsigned char j; //延时函数是用示波器调出来的
while(1)
{
if(newRXD==(bit)0)
{
bdelay(6); //延时26us 半个位的时间
for(j=0;j<100;j++)
{
unsigned char i=8;
unsigned char output=0;

adelay(9); //延时一个位的时间,等过起始位
while(i--)
{
output>>=1;//>><<
if(newRXD)output|=0x80;
adelay(9); //延时一个位的时间,接收8位数据

}
adelay(9); //延时一个位的时间,等过第九位
adelay(9); //延时一个位的时间,等过结束位
send_char_com(output);
}//for
}//if
}
采用的是9位的串口:数据8位+数据1/地址0
展开
 我来答
ghost4063
2012-04-25 · TA获得超过6520个赞
知道大有可为答主
回答量:2940
采纳率:75%
帮助的人:2751万
展开全部
不要用函数调用来延时!!
对于时间精度要求高的场合,函数调用是很不合适,因为函数的参数传递,当前状态的进栈出栈都要消耗时间,而这些时间你未必能完全掌握,就象你的串口接收,我估计波特率的偏差肯定非常大,所以才会造成你所说的情况。
建议你还是用定时器来延时,以while(TF0)或while(TF1)来等待延时结束。
更多追问追答
追问
首先,谢谢您的指教。我也想用定时器的,但是单片机的2个定时器都已经有了别的用途,只能通过模拟串口来进行数据的接收。我这个延时函数已经在模拟串口发送上成功应用了,但是用相同的延时函数来进行数据的接收就不行了,不但接收的数据比正常数据少,而且也不正确。无限纠结中啊!我现在参考您的建议再修改下程序看看吧,再次感谢您!
追答
换52的芯片,多一个T2,或者还有个笨办法,你把波特率降下来,例如2400,然后再找个好的参数,尽量让偏差在5%以内
匿名用户
2012-04-25
展开全部
我是来拿大洋的
更多追问追答
追问
请您拿答案来换!只要回答的好的话,大洋不是问题!!
追答
我去。函数调用延时本质是利用程序指令消耗一定的机器周期完成,无非就是循环。要实现软件精确延时必须排除中断影响,在延时前后关闭中断和打开中断,但这不是通用的方法也不一定能满足系统要求,所以软件延时的精确度不高。
所以建议定时器吧。在定时中断中设置定时计数变量,当变量达到某值,设置标志,模拟一个“事件”发生。这种方式不仅精度高,而且可以方便调整延时周期,不再需要反汇编计算。
好吧,不得不说我是搞理论的,分给我吧
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式