本帖最后由 frankfly 于 2013-1-30 17:35 编辑
有个项目,中间有个串口设备,波特率是38400,需要读取数据后无线发送,因此选用了nrf24le1单片机。但是接收数据后对数据进行处理出现问题。请各位大侠指教。接收数据的格式“12345,-1.0,2.5,0.5,-0.1<回车>”
我用PC模拟设备,
第一步,PC发送什么数据,单片机返回什么数据,没有问题。
void uart_isr() interrupt 4
{
unsigned char buf,i;
if( RI ) {RI = 0;
buf = SBUF;
UART_T(buf);
if(buf_num>=0&&buf_num<30)
{
buffer_dat[buf_num++]=buf;
if(buffer_dat[buf_num-1]==',')flag_douhao++;
if(buffer_dat[buf_num-2]=0x0D&&buffer_dat[buf_num-1]==0x0A&&flag_douhao==4)
{
// for(i=0;i<30;i++)
// {
// UART_T(buffer_dat);
// }
}
if(buffer_dat[buf_num-2]=0x0D&&buffer_dat[buf_num-1]==0x0A)
{
flag_douhao=0;
buf_num=0;
}
// UART_T(flag_douhao);
}
else buf_num=0;
}
}
第二步,PC发送“12345,-1.0,2.5,0.5,-0.1<回车>”,单片机解析逗号的个数,通过 UART_T(flag_douhao);打印
void uart_isr() interrupt 4
{
unsigned char buf,i;
if( RI ) {RI = 0;
buf = SBUF;
// UART_T(buf);
if(buf_num>=0&&buf_num<30)
{
buffer_dat[buf_num++]=buf;
if(buffer_dat[buf_num-1]==',')flag_douhao++;
if(buffer_dat[buf_num-2]=0x0D&&buffer_dat[buf_num-1]==0x0A&&flag_douhao==4)
{
// for(i=0;i<30;i++)
// {
// UART_T(buffer_dat);
// }
}
if(buffer_dat[buf_num-2]=0x0D&&buffer_dat[buf_num-1]==0x0A)
{
flag_douhao=0;
buf_num=0;
}
UART_T(flag_douhao);
}
else buf_num=0;
}
}
串口调试助手打印“00 00 00 00 00 01 01 01 01 01 02 02 02 02 03 03 03 03 04 04 04 04 04 04 00 ”,也没有问题,说明读出了数据,一共4个逗号
第三步,将接收的数据存入一个全局静态数据中,就有问题了
void uart_isr() interrupt 4
{
unsigned char buf,i;
if( RI ) {RI = 0;
buf = SBUF;
// UART_T(buf);
if(buf_num>=0&&buf_num<30)
{
buffer_dat[buf_num++]=buf;
if(buf==',')flag_douhao++;
if(buffer_dat[buf_num-2]=0x0D&&buffer_dat[buf_num-1]==0x0A&&flag_douhao==4)
{
for(i=0;i<30;i++)
{
UART_T(buffer_dat);
}
}
if(buffer_dat[buf_num-2]=0x0D&&buffer_dat[buf_num-1]==0x0A)
{
flag_douhao=0;
buf_num=0;
}
// UART_T(flag_douhao);
}
else buf_num=0;
}
}
将数据存在全局静态数组,一帧结束后,打印该数据,却面目全非
串口助手字符打印“”十六进制打印“00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 0A 00 00 00 00 00”
本来以为是单片机的问题,但是换了stc12C5A60S2也是一样的结果,肯定是程序的问题,
难道是波特率太高,处理不过来,还是其他原因呢?
请高手不吝赐教
|