下面程序是为了实现二自由度自动进样检测器的控制而编写的. 在程序执行过程中, 我发现, 在发送Start.E再发送Stop.E后, 串口助手接收缓存区并未显示一连串"00": 这说明在输入Start.E后, 虽然又收到Stop.E时执行了"en = 0"这个表达式, 但是回到第一层中断处理程序后, 这里的en还是"1"(并未变为我们希望的"0"). 这说明, 以串口中断实现对二自由度自动进样检测仪的控制, 还是有一定难度的. 接下来我将致力于解决这一难题.
#include <STC89C5xRC.H>
char buf[30];//存放串口传来的数据
int i = 0;
int en;
void UART_INT() interrupt 4//串行通信中断处理程序
{
int len = 0;
int j = 0;
if(RI == 1)//如果收到数据
{
if(i == 30)
{
i = 0;//防止越界访问
}
RI = 0;
buf[i++] = SBUF;//将数据接收下来
if(buf[i - 1] == 'E')//到达结尾
{
len = i - 1;//记录数据长度
i = 0;
if(len == 6)
{
if(buf[0] == 'S' && buf[1] == 't' && buf[2] == 'a' && buf[3] == 'r' && buf[4] == 't' && buf[5] == '.')
{
//Start命令(开机)
en = 1;
while(1)
{
SBUF = 1;
while(TI == 0);
TI = 0;
while(en == 0)
{
SBUF = 0;
while(TI == 0);
TI = 0;
}
}
}
else if(buf[0] == 'R' && buf[1] == 'e' && buf[2] == 's' && buf[3] == 'e' && buf[4] == 't' && buf[5] == '.')//主转盘回到原始位置,针臂抬到最高位置
{
//Reset命令(复位命令)
while(j < len)
{
SBUF = buf[j];
while(TI == 0);//等待数据发送
TI = 0;
j++;
}
j = 0;
en = 0;
}
}
else if(len == 5)//停机命令
{
if(buf[0] &