串口发送

HEROP 2005-03-25 04:24:44
以前没有注意的问题,最近便了一个调试程序和pc机通信,先用串口助手看了一下,结果发现发送前关了中断,助手接收正常。不关中断,发送少一些数据,助手接收正确,发送多一些数据,助手接收数据有的错误。请问大虾有哪些问题要注意?程序如下:
void main(void)
{
uchar i;
cpu_init();
while (1)
{
if (flag)
{
flag=0;
// EA=0;
for(i=0; i<3; i++)
{
SBUF=0xeb;
while (TI==0);
TI=0;
SBUF=0x90;
while (TI==0);
TI=0;
}
SBUF=0x71;
while (TI==0);
TI=0;
SBUF=0x61;
while (TI==0);
TI=0;
SBUF=0x02;
while (TI==0);
TI=0;
SBUF=0x01;
while (TI==0);
TI=0;
SBUF=0x01;
while (TI==0);
TI=0;
SBUF=0x84;
while (TI==0);
TI=0;

SBUF=0x06;
while (TI==0);
TI=0;
SBUF=0xdc;
while (TI==0);
TI=0;
SBUF=0x00;
while (TI==0);
TI=0;
SBUF=0xdc;
while (TI==0);
TI=0;
SBUF=0x00;
while (TI==0);
TI=0;
SBUF=0xd7;
while (TI==0);
TI=0;

SBUF=0x07;
while (TI==0);
TI=0;
SBUF=0x08;
while (TI==0);
TI=0;
SBUF=0x00;
while (TI==0);
TI=0;
SBUF=0x00;
while (TI==0);
TI=0;
SBUF=0x80;
while (TI==0);
TI=0;
SBUF=0x2B;
while (TI==0);
TI=0;
// EA=1;
}
}

}

void cpu_init(void)
{
IE=0;
PCON=0x00;
TMOD=0x21;
SCON=0x50; //UART mode 1,permit receive
TH1=0xfd;
TL1=0xfd;
TH0=0xfc;
TL0=0x66;
P1=0xff;
P2=0xff;
P0=0xff;
TR0=1;
TF0=0;
TR1=1;
TF1=0;
ET0=1;
ET1=0;
TI=0;
RI=0;
// EX0=1;
// EX1=1;
// ES=1;
EA=1;

}
//timer0 interrupt
void timer0(void) interrupt 1 using 0
{
uchar i,count;//,count1;
TH0=0xfc;
TL0=0x66;
i++;
if (i==0xff)
{
count++;
}
if (count==0x06)
{
count=0;
flag=1;
}
}
...全文
187 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
coldsea_2000 2005-03-28
  • 打赏
  • 举报
回复
1, 在每次发送之前,将TI标志清零;必要时RI也清零;
2,编写串口中断,简单代码如下:

void com_server(void) interrupt X using 1
{
RI = 0;
TI = 0;
}
suuare 2005-03-28
  • 打赏
  • 举报
回复
ET0=1; 很有可能是T0中断引起的错误 你在发送前让ET0 = 0; 试试
suuare 2005-03-28
  • 打赏
  • 举报
回复
楼主 你在串口中断中给T0赋值是做什么用啊?
wangluyan 2005-03-28
  • 打赏
  • 举报
回复
每发送一个数据完后清除发送标志!!
icesnows 2005-03-27
  • 打赏
  • 举报
回复
在软仿真的时候,i、count是记忆的也就是并不是随机的,这可能跟硬件不同!还有我建议你的SP重新设置一下,在7H位置不够!你再注意一下你软仿真和硬件到底有什么不一样的,比如说晶振是不是不一样!先把i,count改过来,再慢慢查下一个问题
icesnows 2005-03-27
  • 打赏
  • 举报
回复
在关中断的情况下,程序不进中断服务程序,程序里的问题显现不出来!在开中断时,就会出现程序紊乱!按照你的程序,应该能够收到很多遍在主程序里发送的数据,不知道你是不是可以!你不是说数据短的时候能收到嘛,你就把数据弄短些,开中断,看能不能重复收到!我认为在不是全局变量的情况下肯定是不行的!你中断服务程序里的i和count本来就是个随机数嘛!
HEROP 2005-03-27
  • 打赏
  • 举报
回复
直接用软仿真可以,但用硬件传输时就出现上面所说的问题。
HEROP 2005-03-27
  • 打赏
  • 举报
回复
不是全局变量和局部变量的问题,即使都设置成全局变量结果也是一样。问题与发送前后开关中断有关。大虾可试一试。
icesnows 2005-03-27
  • 打赏
  • 举报
回复
对,同意楼上的观点!
COUNT不为全局变量,你这个就是错误的!而且i,count都应该是全局变量!你把它们定义为局部变量后,退出中断服务程序,它们的值就是随机的!所以你这块程序运行是不正确的!改改吧!
cyymycc 2005-03-26
  • 打赏
  • 举报
回复
void timer0(void) interrupt 1 using 0
{
uchar i,count;//,count1;
TH0=0xfc;
TL0=0x66;
i++;
if (i==0xff)
{
count++;
}
if (count==0x06)
{
count=0;
flag=1;
}
}

count变量设为全局
using 0应设为using 1
czm1203 2005-03-26
  • 打赏
  • 举报
回复
我已经不在这行做了,只是以前是学这个的,所以很多东西都忘了,只能根据你的陈述,给点建议,对不对也不知道,因为,专业知识忘的差不多了。哈哈!

楼主,你程序里用了串行中断和定时器的中断,有没有设定优先级呢?
根据我残留的印象,默认的硬件优先是定时器比较高吧,那你发送的数据多的时候,就可能被定时器的中断打断了。
楼主考虑下,会不会有这个可能
dy03 2005-03-25
  • 打赏
  • 举报
回复
up
才子鸣 2005-03-25
  • 打赏
  • 举报
回复
C语言哟,
不会,
delphi还可以

27,375

社区成员

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

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