金砂紫钰 发表于 2012-9-29 10:00:04

请教大侠指点:串口发数据包..有警告

本帖最后由 金砂紫钰 于 2012-9-29 10:28 编辑

以下程序我是希望达到能发数据包功能.编不过.
STC12C5A60S24.C(258): warning C209: '_send_data': too few actual parameters

#include <reg51.h>
#include <stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

#define buf

#define MAX_REVBUF   17
#define MAX_TXBUF   8
typedef unsigned char UINT8;
typedef unsigned intUINT116;


typedef char            INT8;
typedef int             INT16;
typedef long            INT32;
typedef bit             BOOL;



bit PktRevFlg;
bit PktRdy;
bit RxCharTranFlg;
unsigned char RevBuf;
unsigned char RevP=0;
unsigned char UserTimer; //byte0溢出(使能)标志byte1定时值byte2定时计数器

unsigned char TxBuf;
unsigned char TxP,TxLen;
bit TxFlg;
bit TxCharTranFlg=0;


/*define eeprom command*/
#define CMD_IDLE 0                //        Standby
#define CMD_READ 1                //        Byte read
#define CMD_PROGRAM 2        //Byte program
#define CMD_ERASE   3        //Sector erase

#define ENABLE_IAP        0X81 //22.1184
//char Buf;
//char CheckSum
/*
char *PLottery number
char *PEntet Gold number
char *PQuit Gold number        */


/*
uint IAP_DAT_ADDRESS=0;                                //数据存储地址
uint IAP_ADD_ADDRESS=0x0200;                //数据存储地址指针
uchar eeprom_flag=0;                                //第一区数据存储地址标号
uchar IapReadByte(uint addr);*/
/*
struct packet{
volatile int DataBuf[]={0xbb,0x32,0x45};       //           起始符(包头起始标志0Xbb)包头:1-2字节
static char len;       //           数据](包长度) 1-2字节
const char content;       //数据        内容
int CheckSum;          //奇偶        CheckSum
int tail;//结束符(包尾结束标志0XAA)包头:1-2字节
}Buf={0xbb "DOUN"};          
   Buf1={0xbb"up"0xaa};       
   Buf2={0xbb"RIGHT"0xaa};
   Buf3={0xbb"LEFT"0xaa};
   Buf4={0xbb"exie"0xaa};
   Buf5={0xbb"control 1"0xaa};
   Buf6={0xbb"control 2"0xaa};
   Buf7={0xbb"INTO"0xaa};
   Buf8={0xbb &processor   0xaa}; */

//typedef unsigned char uchar;
//typedef unsigned int uint;
// char ch;
// bit read_flag= 0 ;
/*
sfr IAP_DATA =0xC2;
sfr IAP_ADDRH=0xc3;
sfr IAP_ADDRL=0xc4;
sfr IAP_CMD=0XC5;
sfr IAP_TRIG =0xc6;
sfr IAP_CONTR=0xc7;                   //定义IAP*/





sbit s17=P0^7;   //定义S17按键控制UP
sbit s18=P0^6;   //定义S18按键控制DOWN
sbit s19=P0^5;   //定义S19按键控制RIGHT
sbit s20=P0^4;   //定义S20按键控制LEFT
sbit s21=P0^3;          //定义S21按键控制INTO
sbit s22=P0^2;           //定义S22按键控制exie
sbit s23=P0^1;           //定义S23按键控制Control 1          (发炮1)
sbit s24=P0^0;           //定义S24按键控制Control 2       (        发炮2 )
sbit s25=P1^5;   //片选信号控制脚

//uchar Sbuf[]="1";        //串口助手发主板的数据。

uchar buf0[]="DOUN\n";          
uchar buf1[]="up\n";        //从层向PC机的命今
uchar buf2[]="RIGHT\n";
uchar buf3[]="LEFT\n";
uchar buf4[]="exie\n";
uchar buf5[]="control 1\n";
uchar buf6[]="control 2\n";
uchar buf7[]="INTO\n";
uchar buf8[]="processor\n";       //是接收到PC机信息后处理后,发给PC机命令

voidchoose(void)
{
        s25=0;
}
                          //片选信号


void delay(uint n)
{
        while (n--);
}

//////////**************************
//// 中断波特率
///
//***********************************
void init_com( void )
{
SCON = 0x50;   
PCON = 0x00;   
IE |= 0x90 ;   
TMOD = 0x20;   
TH1=0xD0;   
TL1=0xD0;      
TR1=1;
}
/*
void send_string(uchar *buf)
{

uchar i;
//RI = 0 ;
i=0;
while (buf != 0x00)
{
SBUF = buf;
while (TI == 0);
TI = 0;
i++;
}
}
*/
///////////////////////////////////
uchar keyValue;

void delay2(uint time)                     
{
        uint i,j;                  
        for(i=0;i<time;i++)         
                for(j=0;j<50;j++);      
}
///////////////////////////////////
void keyScan(void)                           
{
        P0=P0|0xff;               
        if((P0&0xff)!=0xff)      
        {
                delay(50);            

                        keyValue=(P0&0xff);
   
        }
        else
                {keyValue=0xff;}
}
//*******************************
//
//*********************************
void send_data(uchar *Sbuf,uchar n)
{
        uchari;
        for(i=0;i<n;i++)
        {
                //SBUF=Sbuf;
                SBUF=Sbuf;
                while (TI==0);
                TI =0;
        }
}

//***********************************************
// 给数据包不同的命令
//*************************************************
/*
void assembly        packet(uchar *buf)

{

uchar j;
j=0;
while (buf != 0x00)
{
&processor= buf;
while (TI == 0);
TI = 0;
i++;
}                         */







/*********彩票机 退币机给PC机数********************/





//**************************************************************************************************
//按键扫描结果处理函数
//**************************************************************************************************

void keyHandle(void)                     
{      
        switch(keyValue)         
        {
                case 0x7f:         //如果S17按键按下
                  // delay2(2);
                        send_data(buf0);                              // 发送UP
                        break;         
                case 0xbf:         //如果S18按键按下
                        // delay2(2);
                        send_data(buf1);                   // DOWN
                        break;
                case 0xdf:         //如果S19按键按下
          // delay2(2);
                        send_data(buf2);                                       // RIGHT
                        break;
                case 0xef:         //如果S20按键按下
                   //delay2(2);
                        send_data(buf3);                                     //         LEFT
                        break;
                case 0xf7:         //如果S21按键按下// INTO
                  //delay2(2);
                        send_data(buf4);                                       
                        break;
                case 0xfb:               // exit
                  // delay2(2);   
                        send_data(buf5);                                    
                        break;
                case 0xfd:               // Control 1          (发炮1)
                   // delay2(2);
                        send_data(buf6);                                    
                        break;
                case 0xfe:                  // Control 2       (        发炮2 )
                  // delay2(2);
                        send_data(buf7);
                        break;            
                  default:
                        break;
        }      
}

                                                                       












//***************************************************
//**************************************************************************************************
/*
void serial () interrupt 4 using 3
{
    if (RI)
       {
      RI = 0 ;       //此步必不可少,因为硬件不能将其置0   
      ch=SBUF;       //从SBUF中取出数据      
      read_flag= 1 ; //就置位取数标志
      }
}
       */


//***************************************************************************************
//存储程序
//***************************************************************************************




/**************************/


/*****************************************************/
        /*                void Delay(uchar n);
                        void IapIdle();
                  void IapProgramByte(uint addr,uchar dat);
                        void IapEraseSector(uint addr);
                        void IapRead_Add(void);        */                          //存储程序子程序

        //        send_string(Buf);
        //        delay(20000);
       

////////////////////////////////C51串口数据包处理程序/////////////////////////////////////////


/*
void Timer0Int(void) interrupt 1//16位定时器 22.1184M CPU频率下 17.6ms中断一次
{
char SysTick
SysTick++;
if(!UserTimer)
    {UserTimer++;
   if(UserTimer>=UserTimer)
      {UserTimer=1;}
      }
}          */


void UartInt(void) interrupt 4
{
unsigned char ch;
if(RI)
    {RI=0;
       ch=SBUF;
       if(PktRdy)       return;          //上一包未处理直接返回
       if(PktRevFlg)                     //判断接收有无超时
          {if(UserTimer)            //有超时发生
                  PktRevFlg=0;               //清除包标志
                }
       if(ch==0x7e)                      //包标识符
          {if(!PktRevFlg)                                   //包头
                  {PktRevFlg=1;
                       RevP=0;                   //初始化接收指针
                       UserTimer=0;                   //开启定时器
                       UserTimer=0;
             RevBuf=0xff;
             RxCharTranFlg=0;
                        }
               else                        //包尾(但需做长度对比来最终确认)
                  {if(RevP==(RevBuf+1))   //收到的长度相符则确认是包尾
                           {PktRdy=1; PktRevFlg=0;}
                       else                               //否则接收错误
                           PktRevFlg=0;
                        }
                }
       else
          {if(RevP>=MAX_REVBUF)          //超出最大缓冲区长度
                  PktRevFlg=0;
               else
                  {if(RxCharTranFlg)          //转义有效
                                {switch(ch)
                                   {case 0x5e : ch=0x7e;
                                  break;
                                  case 0x5d : ch=0x7d;
                                        break;
                                        default   : PktRevFlg=0;
                                        break;
                                   }
               RxCharTranFlg=0;
                                }
                       else
                          {if(ch==0x7d)
                                 RxCharTranFlg=1;
                             else
                                     RevBuf=ch;       
                          }
                        }
                }                       
        }
if(TI)
    {TI=0;
   if(!TxFlg) return;
   if(TxP==TxLen)
      {TxFlg=0;         //发送完毕
         SBUF=0x7e;
      }
   else
      {if(TxBuf==0x7e||TxBuf==0x7d)
            {if(!TxCharTranFlg)
                {TxCharTranFlg=1;
               SBUF=0x7d;
                }
             else
                {if(TxBuf==0x7e)   SBUF=0x5e;
               if(TxBuf==0x5d)   SBUF=0x5d;
               else SBUF=0xff;
               TxP++;
               TxCharTranFlg=0;
                }
            }
         elseSBUF=TxBuf;         //继续发送
      }
        }
}

unsigned char GetCheckSum(unsigned char *Sbuf,unsigned char len)
{
unsigned char sum=0;

do{
//   sum+=buf[--len];
       sum+=Sbuf[--len];
    }
   while(len);
   return sum;

}

#defineNATIVE_ADDR      (*((unsigned char code *)0x07ff))
void PktProc(void)                                               //数据包解析
{
unsigned char len;
len=RevBuf;
if(RevBuf==GetCheckSum(RevBuf,len))       //校验无误
    {if(RevBuf!=NATIVE_ADDR)            //地址比较
      return;
   switch (RevBuf)                      //解析命令
      {case 0x01:                        //读取设备状态
            TxBuf=0x1b;                      //包头 开始位
            TxBuf=0x31;            //机器位固定值
            TxBuf=5;                   //命令字长度(从下标到结束)
            TxBuf=0;                                  //内容 (0-255)
            TxBuf=0;                                  // 内容 (0-255)
            TxBuf=0xE0;                                  // 内容 命令位
            TxBuf=GetCheckSum(TxBuf,6);                   //校验
                 TxBuf=0x0d;                                  //包尾
                  SBUF=0x1b;                     //开始发送        包头识别
            TxLen=8;
            TxFlg=1;
            TxP=0;
         break;                                                
         default:
         break;
      }   
    }
}
main()
{
        char Sbuf[]=20;
        charbuf
        IT0 = 1;   
        EX0 = 1;      
        EA = 1;          //开中断
        init_com();
        choose();
        while (1)
        {                        

                keyScan();
                keyHandle();
                delay(20000);
                //if (read_flag)      //如果取数标志已置位,就将读到的数从串口发出
                //}
                        //read_flag= 0 ;//取数标志清0
                        //send_data(buf,"A");//将读到的数从串口发出
                send_data(Sbuf,8);
        }
}
********************************************************************
PC机上格式是这样的
//       查键
void checkkey(){
      char Sbuf[]=20;
                Sbuf=0x1b;
                Sbuf=0x31;
                Sbuf=5;
                Sbuf=0;
                Sbuf=0;
                Sbuf=0xe0;
                Sbuf=GetCheckSum(Sbuf,5);
                Sbuf=0x0d;
                send_data(Sbuf,8);
               }
退币
   void OutGameCoin(uchar tbio){
      char Sbuf[]=20;
                Sbuf=0x1b;
                Sbuf=0x31;
                Sbuf=7;
                Sbuf=0;
                Sbuf=0;
                Sbuf=0xe1;
                Sbuf=tbio+'0';
                Sbuf=0x0d;
                Sbuf=GetCheckSum(Sbuf,7);
                Sbuf=0x0d;
                send_data(Sbuf,10);
                }
LED灯
/* void outGameLed(){
      int f
      char Sbuf[]=100;
                uchar i,j;
                Sbuf=0x1b;
                Sbuf=0x31;
                Sbuf=25;
                Sbuf=0;
                Sbuf=0;
                Sbuf=0xe4;
                f=6;
                for(i=0;i<20;i++;f++){
                Sbuf=pledvalue;
                }
                Sbuf=(char)GetCheckSum(Sbuf,25);
                Sbuf=SER_END;
                send_data(Sbuf,28);
                  }       */




kebaojun305 发表于 2012-9-29 10:11:36

本帖最后由 kebaojun305 于 2012-9-29 10:15 编辑

语法错误 错误说明中已经说的很清楚 “缺少实参”。   send_data函数原型是2个参数   程序中有部分调用是只传入了一个参数。

这个函数中void keyHandle(void)                     
{      
      switch(keyValue)         
      {
                case 0x7f:         //如果S17按键按下
                  // delay2(2);
                        send_data(buf0);                              // 发送UP
                        break;         
                case 0xbf:         //如果S18按键按下
                        // delay2(2);
                        send_data(buf1);                   // DOWN
                        break;
                case 0xdf:         //如果S19按键按下
          // delay2(2);
                        send_data(buf2);                                       // RIGHT
                        break;
                case 0xef:         //如果S20按键按下
                   //delay2(2);
                        send_data(buf3);                                     //         LEFT
                        break;
                case 0xf7:         //如果S21按键按下// INTO
                  //delay2(2);
                        send_data(buf4);                                       
                        break;
                case 0xfb:               // exit
                  // delay2(2);   
                        send_data(buf5);                                    
                        break;
                case 0xfd:               // Control 1          (发炮1)
                   // delay2(2);
                        send_data(buf6);                                    
                        break;
                case 0xfe:                  // Control 2         (      发炮2 )
                  // delay2(2);
                        send_data(buf7);
                        break;            
                  default:
                        break;
      }      
}

金砂紫钰 发表于 2012-9-29 10:30:17

kebaojun305 发表于 2012-9-29 10:11 static/image/common/back.gif
语法错误 错误说明中已经说的很清楚 “缺少实参”。   send_data函数原型是2个参数   程序中有部分调用是只 ...

我解决不了呢,请帮个手,

金砂紫钰 发表于 2012-9-29 10:31:06

我再试一试,谢了,

kebaojun305 发表于 2012-9-29 10:39:07

金砂紫钰 发表于 2012-9-29 10:31 static/image/common/back.gif
我再试一试,谢了,

比如 我帖子中的第7行你调用send_data函数时只有一个参数。另一个参数 你把它整哪里去了。
页: [1]
查看完整版本: 请教大侠指点:串口发数据包..有警告