标题: 关于单片机串口的一些问题(一只菜鸟的学习51记录贴(2)) [打印本页]

作者: 一念逐光    时间: 2018-9-9 17:23
标题: 关于单片机串口的一些问题(一只菜鸟的学习51记录贴(2))
----一只菜鸟的学习51记录贴(2)----
------关于一点串口的理解--轻喷--求大神指点-哦耶----
1.串口通信和串行通信不一样,概念不要混淆!(自己一直没有发现这一点)-------简单说串口是一种数据传输的手段,串行是一种概念。
2.串行通信->异步传输的几个要点
2.1字符格式:
异步传输时候数据是以帧为单位传送的,各帧字符之间存在空闲位,而不是连续发送。
(补充帧:一帧理解成
包括起始位+8个数据位+奇偶校验位+结束位)

2.2波特率个人理解:1.1定义:每秒传送二进制代码的速度
                              1.2为什么设置波特率:为了保证数据没有错误
(好比两个人行走,中间有条绳子挂在两个人身上,如果两个人的速度不一样,绳子肯定会在一个时间点断掉)

2.3波特率和字符格式一旦有问题异步传输就gg。
3.串口通信(针对异步传输)
/********************************************************************************************/

PC和单片机

void delay(int i)
{
  while(i--)
  {}
}
void ser_init()
{
SCON=0X50;   
TMOD=0X20;   
PCON=0X80;   
TH1=0XF3;   
TL1=0XF3;
ES=1;     
EA=1;   
TR1=1;   
}
void ser() interrupt 4
{
    unsigned char  receivedata;
receivedata=SBUF;
RI = 0;
SBUF=receivedata;
while(!TI);
TI=0;
delay(10000);          **** //问题//*****
}
main()
{
  ser_init();
  while(1)
  {
  
  }
}

/********************************************************************************************/
想法一:
我在中断函数里面加了延时
发现发送“123456789”
结果只能发送“12” 后面的数据就丢失了
能不能理解为:
单片机产生中断的时候 PC也正在以之前的波特率发送数据,当单片机中断完成时候,之前的数据就被覆盖了。可是按我这个理解单片机应该收到“19”而不是“12”啊
想法二:
1.既然中断会占用单片机的时间,是不是可以说单片机的波特率事实上是有误差,中断的时间越长,波特率的误差也就越大。
2.所以说传送很大的数据的时候,通过串口这样的方法会产生数据的丢失??




作者: qingfengyu    时间: 2018-9-9 20:08
应该是程序崩溃了  如果你在串口中断延时 则中断程序未返回保留在栈段  下一个中断又来了 继续进入栈段 多次后 栈段一直未释放 栈段溢出 程序就蹦了 所以一般 串口中断 和定时器中断 函数中 要关闭中断允许位在延时  
作者: sxhwdz    时间: 2018-9-10 08:29
中断里面加延时是很不好的习惯,一定要克服。中断是暂停别的工作,临时处理应急事项,应该尽快完成,否则会影响别的工作。





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1