首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

left side of asnop not an lvalue,该怎么解决

2014-04-18 来源:读书人网 【读书人网(Reader8.cn):综合教育门户网站】
left side of asnop not an lvalue现在想从一个串口接收程序,然后从另外一个串口转发给另外一个模块,但是

left side of asnop not an lvalue
现在想从一个串口接收程序,然后从另外一个串口转发给另外一个模块,但是转发的时候,必须把收到的数据转成对应的16进制ascii,并且通过特定字符发送。
程序分解开来都可以运行。
1、串口收发正常
2、指定字符转码成功

我对串口收发的理解如下:
这是串口收发单个字符的程序
#include <reg52.h>

bit Flag;   //串口接收到字符的标志
unsigned char UartChar;
    
/*--------------------------------------------------------------
                           函数声明
--------------------------------------------------------------*/
void InitUART(void);
void SendByte(unsigned char dat);
void SendStr(unsigned char *s);

/*--------------------------------------------------------------
                            主函数
--------------------------------------------------------------*/
void main (void)
{
    //串口初始化
    InitUART();
    
    Flag = 0;
    while (1)                       
    {
        if(Flag == 1) 
        {
            Flag = 0;
            SendByte(UartChar);
            if(UartChar == '\r')
            {
                SendByte('\n');
            }
        }
    }
}

/*--------------------------------------------------------------
                            串口初始化
--------------------------------------------------------------*/
void InitUART(void)
{

    SCON  = 0x50;   // SCON: 模式 1, 8-bit UART, 使能接收  
    TMOD |= 0x20;   // TMOD: timer 1, mode 2, 8-bit 重装
    //TH1 = 0xF3;   // 波特率4800、数据位8、停止位1。效验位无 (12M)
    TH1   = 0xFD;   // TH1:  重装值 9600 波特率 晶振 11.0592MHz  
    TR1   = 1;      // TR1:  timer 1 打开                         
    EA    = 1;      //打开总中断
    ES    = 1;      //打开串口中断
}                            

/*--------------------------------------------------------------
                            发送一个字节
--------------------------------------------------------------*/
void SendByte(unsigned char dat)
{
    SBUF = dat;
    while(!TI);
    TI = 0;
}

/*--------------------------------------------------------------
                            发送一个字符串
--------------------------------------------------------------*/
void SendStr(unsigned char *s)
{
    //检测是否字符串末尾, '\0'表示字符串结束标志,
    while(*s != '\0')
    {
        SendByte(*s);
        s++;
    }
}
/*--------------------------------------------------------------
                     串口中断程序
--------------------------------------------------------------*/
void UART_SER (void) interrupt 4 //串行中断服务程序
{
    if(RI)                  //判断是接收中断产生
    {
        RI=0;               //标志位清零
        UartChar = SBUF;    //读入缓冲区的值
        Flag = 1;           //把值输出到P1口,用于观察


    }
    
    if(TI)                  //如果是发送标志位,清零
    {
        //TI=0;             //发送为查询方式
    }


这个程序是对的
这个是昨天版主帮我写的指定的字符和字符串转对应的16进制ascii

#include<iostream.h>
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFERSIZE  256
char buffer[] ="AT%IPSEND="";
char buf[];
char *s1;
char *buf3;
char buf1[128];
char * hextodstr(char * src)
{
unsigned char i=0;
while(*src!=0)
{
 buf1[2*i]=*src/16+'0';
buf1[2*i+1]=(*src%16)+'0';
src++;
i++;
if(i>=64)
{
//缓冲区不够
buf1[128]=0;
return buf1;
 }
}
buf1[i*2]=0;//忘记给字符串补结束符了
return buf1;
}

void main()
{        
  char test[]="12345654321!!";
  //printf(buffer);
  //printf("\n\r");
 // printf(test);
 // printf("\n\r");
  buf3=hextodstr(test);
   strcat(buf3,""");
 // printf(hextodstr(test));
 // printf("\n\r");
  strcat(buffer,buf3);
  
  printf(buffer);

}  
这个程序也是正确的
通过上面的发送程序,51应该是中断收到一个字符后,存到Sbuf中后,然后赋值给UartChar中,发送的时候,,把UartChar赋值给Sbuf,然后再发送出来的。
那我把两个程序结合的话,我应该是中断收到一个字符后,存到Sbuf中后,赋值给UartChar,把UartChar用上面hextodstr()转换成对应的16进制,再加上我需要的字符,此时,就把一个字符变成了字符串,我再通过字符串发送函数发送出去,理论上我的逻辑没错误,我的程序如下:
while (1)

if (Flag == 1 ) 
{
Flag = 0;
                        buf3(我定义的中间存储数组)=hextodstr(UartChar);

                                                 strcat(buf3,""");
                         strcat(buf1(我需要发送的特殊字符),buf3);    

SendStr(buf3);
                                                      }
但是这样的话,赋值的时候buf3=hextodstr(UartChar);这句就会出现错误
left side of asnop not an lvalue,不知道该如何解决了,感觉没什么问题,逻辑都是正确的。

[解决办法]
我觉得楼主一会还会来问问题
那个hextodstr()返回的是全局char*,buf1
所以你执行hextodstr()后,返回的是char*但你的buf2[0]如果是16位的也勉强能行,如果是char buf2[]则是有问题的
直接使用buf1就行了,strcat(buf3,buf1);//直接点就是strcat(buf3,hextodstr(参数))
而且你参数类型也不对,UartChar是一个字节
楼主还需要恶补理论知识