STC单片机串口接收程序

模块自动连续发送以下格式(ASCII):x.xx nn.n ppp.pp<CR><LF>,x.xx,nn.n,ppp.pp分别代表三个数据,波特率115200,数据位8,停止位1,无校验。STC12C5A32S2单片机接收这三个数据,请帮忙写出接收代码。或者查看以下代码接收不到数据的错误在哪里
void main(void)
{
int_UART();

jpn = 0;
buffer[0] = 0;
buffer[1] = 0 ;
buffer[2] = 0;
display();
while(1)
{

if(sendtime >= 40) //每2s开串口中断并计算
{
sendtime = 0;
ES = 1;
comput(showflag);//采集到的数据进行计算并显示
}

void int_UART(void) //115200bps@11.0592MHz
{

PCON |= 0x80; //0x80; //使能波特率倍速位SMOD
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x04; //独立波特率发生器时钟为Fosc,即1T
BRT = 0xFA; //设定独立波特率发生器重装值
AUXR |= 0x01; //串口1选择独立波特率发生器为波特率发生器
AUXR |= 0x10; //启动独立波特率发生器
RI = 0; //清收发标志
TI = 0;

}

void interrupt_UART(void)interrupt 4 //using 0
{

if(RI)
{

if(SBUF == recstart ) //接收开始
{
recbuf[0] = SBUF;
}
if(recbuf[0]== recstart ) //接收开始
{
recbuf[recPosi] = SBUF;
recPosi++;
}
RI=0;

if(recbuf[2]==0x2e )
{

grealC = (recbuf[1]-48) + (recbuf[3]-48)*0.1+(recbuf[4]-48)*0.01;
if(recbuf[6] == 0x2e)
{
grealT = (recbuf[5]-48)*10+(recbuf[7]-48);
}
else if(recbuf[7] == 0x2e)
{
grealT = (recbuf[5]-48)*100+(recbuf[6]-48)*10+(recbuf[8]-48);
}
}
else if(recbuf[3]==0x2e)
{
grealC = (recbuf[1]-48)*10 +(recbuf[2]-48) + (recbuf[4]-48)*0.1;
// grealT = (recbuf[6]-48)*100+(recbuf[7]-48)*10+(recbuf[8]-48);
if(recbuf[6] == 0x2e)
{
grealT = (recbuf[5]-48)*10+(recbuf[7]-48);
}
else if(recbuf[7] == 0x2e)
{
grealT = (recbuf[5]-48)*10+(recbuf[6]-48)+(recbuf[8]-48)*0.1;
}
}

}

if(TI)
{
TI=0;
}

}

串口调试助手采集到的模块发送数据
最新回答
为你╰我宁愿放下

2024-06-01 00:06:47

一组数据,共有多少字节? 20 个?
根据字节数,设定一个数组。

收到一个,存放一个。
收到 20 个后,判断:

if (recbuf[16] == 'm' && recbuf[17] == 'b' && recbuf[18] == 'a' && recbuf[19] == 'r')

满足条件,就把其前面的,变换成数:

//recbuf[1] = '.';
x = (recbuf[0] - 48) + (recbuf[2] - 48) * 0.1 + (recbuf[3] - 48) * 0.01;

//recbuf[4] = ' ' //recbuf[7] = '.'
n = (recbuf[5] - 48) * 10 + (recbuf[6] - 48) + (recbuf[8] - 48) * 0.1;

//recbuf[9] = ' ' //recbuf[13] = '.'
p = (recbuf[10] - 48) * 100 + (recbuf[11] - 48) * 10 + (recbuf[12] - 48)
+ (recbuf[14] - 48) * 0.1 + (recbuf[15] - 48) * 0.01;
追问
还是接收不到数据呀?
if(SBUF == 0x0A ) //接收开始
{
recbuf[0] = SBUF;
}
if(recbuf[0]== 0x0A ) //接收开
{
recbuf[recPosi] = SBUF;
recPosi++;
}
这样写接收开始对吗?
还有,不一定是20个字节,最后的p会在会在997.00~1003.00之间变化