单片向传感器发送多个字节,等待(60s)传感器响应,如果没响应继续发送多个字节;
传感器响应以发送6个字节作为回复,第一个字节为0x23,请问如何设计中断程序接收多个字节??
//***********************串口发送一个字符********************
void SendOneChar(unsigned char ch)
{
SBUF = ch;
}
//***********************串口发送多个字节******number 为字节个数********************
void Send_Data( unsigned char *p,unsigned char number)
{
for(;number!=0;number--)
{
SendOneChar(*p);
p++;
}
}
//***********************串口接收一个字符**************
unsigned char Rec_OneChar(void)
{
unsigned char buffer;
buffer = 0;
while(RI)
{
buffer=SBUF;
}
return buffer;
}
void uart_interrupt(void) interrupt 4 using 0
{
unsigned char i=0;
unsigned char first;
if(RI==1)
{
first=SBUF;
if(first==0x23)
{
for(i=0;i<5;i++)
{
buffer[i]=Rec_OneChar();
RI = 0; //RI清零
}
}
}
if(TI==1)
{
TI=0; //TI清零
}
}
中断函数应该有问题!!
原来的程序 RI=0时,就应该跳出了 for(i=0;i<5;i++) 这个循环,那么就0x23之后的字节就接收不到了吧??
传感器发送6个字节,第1个为0x23,最后一个为0x0D,最后一个需要校验码??传感器与单片机是两条线相连,应该是全双工,不是半双工。
我把中断和查询两个方法共用?
TI的置0可以修改放到发送一个字符那里···
(1)i!=5,不会跳出。0x23之后字节可以接收到。但只有5个后才会退出中断。
(2)当然可以,在完成所有字节时刻,处理buffer之前,判断即可。
if((i==5)&&(buffer[4]==0xd))
{
do_something_here(buffer);
i=0;
}
(3)两条线就是双工。一来一回,一收一发的意思。双向通信。所谓全与半,是指通信是否同时发生。
(4)按道理,所有的收发都可以放中断里面。比如,我上面改的程序,所有的接收都在中断里面完成。而你的发送是通过查询TI完成的(这部分,我没改,可以放在中断中TI判断里发送)。
(5)你如果非要查询TI发送,更妥的应该是发送前,关闭ES。没必要进中断。
在问一下,两个单片机如何全双工通信,就拿上边的单片机与传感器来说吧,如何通proteus仿真?
追答传感器部分,你通过虚拟仪器中的虚拟终端来模拟,RXD和TXD与单片机交叉连接,配置恰当的波特率。应答的内容从键盘录入。稍作协议调整,暂时用ASCII字符来测试。