新手上路
- 积分
- 47
- 金钱
- 47
- 注册时间
- 2019-8-23
- 在线时间
- 11 小时
|
20金钱
通过串口接收8个数据之后,会通过定时器向上位机回传一组数据,使用的波特率是9600,串口的优先级最高,定时器优先级最低static u8 step = 0;
u8 dat = 0;
if (S2CON & 0X01)
{
S2CON &= ~0X01; //清除S2RI位
dat = S2BUF;
switch(step)
{
case 0:
if(dat == Which_Down())
{
step += 1;
re[re_num] = dat;
re_num += 1;
// Send2_Data(dat);
}
break;
case 1:
re[re_num] = dat;
re_num += 1;
// Send2_Data(dat);
if(8 == re_num)
{
step = 0;
send_flag = 1;
P23 = ~P23;
}
break;
default:
break;
}
上面是关于串口接收的部分代码
void Time0_hander(void) interrupt 1
{
static u8 count = 0;
TF0 = 0; //清除TF0标志
TL0 = 0x66; //设置定时初值
TH0 = 0xB8; //设置定时初值
if(1 == send_flag)
{
// if(1 == Modbus_Check(re,8))
// {
Send_POut(out,15);
// }
send_flag = 0;
// for(count=0;count<8;count++)
// {
// re[count] = 0;
// }
}
}
定时器中断的处理函数
目前遇到的问题是:
a PC端发送多次数据后,串口才能接收一组完整的数据
b 在经过一段时间后,PC端再次发送数据 进不去串口中断
c 在回传数据时,会出现进入了发送函数,但PC端接收不到数据
|
最佳答案
查看完整内容[请看2#楼]
1.串口2进去接收中断,接收中断还没有退出立刻发送了,有没有清除串口2发送中断?2.case0中num没有清0,数组没有那么大会修改其他RAM数据。3.re是存储数据的数组,如果串口2正在处理这个数组装数据,串口1要发送又调用这个数组发送就有数据怎么办?4.所有中断函数尽可能短,例如串口1还没有发送完定时又到了。建议:发送函数不在中断中,通过标志位在主循环中发送
|