搜索
bottom↓
回复: 4

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

[复制链接]

出0入0汤圆

发表于 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 int  UINT116;


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



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

unsigned char TxBuf[MAX_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[2];         //           数据]  (包长度) 1-2字节
const char content;         //数据        内容
int CheckSum[2];          //  奇偶        CheckSum
int tail[20];  //结束符(包尾结束标志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机命令

void  choose(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)
{
        uchar  i;
        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[j] != 0x00)
{
&processor= buf[j];
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[0])
    {UserTimer[1]++;
     if(UserTimer[1]>=UserTimer[2])
        {UserTimer[0]=1;}
        }
}          */


void UartInt(void) interrupt 4
{
unsigned char ch;
if(RI)
    {RI=0;
         ch=SBUF;
         if(PktRdy)       return;          //上一包未处理直接返回
         if(PktRevFlg)                     //判断接收有无超时
            {if(UserTimer[0])              //有超时发生
                    PktRevFlg=0;               //清除包标志
                }
         if(ch==0x7e)                      //包标识符
            {if(!PktRevFlg)                                   //包头
                    {PktRevFlg=1;
                         RevP=0;                   //初始化接收指针
                         UserTimer[1]=0;                   //开启定时器
                         UserTimer[0]=0;
             RevBuf[0]=0xff;
             RxCharTranFlg=0;
                        }
                 else                          //包尾(但需做长度对比来最终确认)
                    {if(RevP==(RevBuf[0]+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[RevP++]=ch;       
                            }
                        }
                }                       
        }
if(TI)
    {TI=0;
     if(!TxFlg) return;
     if(TxP==TxLen)  
        {TxFlg=0;         //发送完毕
         SBUF=0x7e;
        }
     else
        {if(TxBuf[TxP]==0x7e||TxBuf[TxP]==0x7d)
            {if(!TxCharTranFlg)
                {TxCharTranFlg=1;
                 SBUF=0x7d;
                }
             else
                {if(TxBuf[TxP]==0x7e)   SBUF=0x5e;
                 if(TxBuf[TxP]==0x5d)   SBUF=0x5d;
                 else SBUF=0xff;
                 TxP++;
                 TxCharTranFlg=0;
                }
            }
         else  SBUF=TxBuf[TxP++];         //继续发送
        }
        }
}

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

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

}

#define  NATIVE_ADDR      (*((unsigned char code *)0x07ff))
void PktProc(void)                                                 //数据包解析
{
unsigned char len;
len=RevBuf[0];
if(RevBuf[len]==GetCheckSum(RevBuf,len))       //校验无误
    {if(RevBuf[1]!=NATIVE_ADDR)              //地址比较
        return;
     switch (RevBuf[2])                      //解析命令
        {case 0x01  :                        //读取设备状态
            TxBuf[0]=0x1b;                      //包头 开始位
            TxBuf[1]=0x31;            //机器位  固定值
            TxBuf[2]=5;                   //命令字长度(从下标到结束)
            TxBuf[3]=0;                                  //  内容 (0-255)
            TxBuf[4]=0;                                  // 内容 (0-255)
            TxBuf[5]=0xE0;                                  // 内容 命令位
            TxBuf[6]=GetCheckSum(TxBuf,6);                   //校验
                 TxBuf[7]=0x0d;                                  //包尾
                    SBUF=0x1b;                       //开始发送        包头识别
            TxLen=8;
            TxFlg=1;
            TxP=0;
         break;                                                
         default:
         break;
        }     
    }
}
main()
{
        char Sbuf[]=20;
        char  buf
        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[0]=0x1b;
                Sbuf[1]=0x31;
                Sbuf[2]=5;
                Sbuf[3]=0;
                Sbuf[4]=0;
                Sbuf[5]=0xe0;
                Sbuf[6]=GetCheckSum(Sbuf,5);
                Sbuf[7]=0x0d;
                send_data(Sbuf,8);
                 }
退币
   void OutGameCoin(uchar tbio){
        char Sbuf[]=20;
                Sbuf[0]=0x1b;
                Sbuf[1]=0x31;
                Sbuf[2]=7;
                Sbuf[3]=0;
                Sbuf[4]=0;
                Sbuf[5]=0xe1;
                Sbuf[6]=tbio+'0';
                Sbuf[7]=0x0d;
                Sbuf[8]=GetCheckSum(Sbuf,7);
                Sbuf[9]=0x0d;
                send_data(Sbuf,10);
                }
LED灯
/* void outGameLed(){
        int f
        char Sbuf[]=100;
                uchar i,j;
                Sbuf[0]=0x1b;
                Sbuf[1]=0x31;
                Sbuf[2]=25;
                Sbuf[3]=0;
                Sbuf[4]=0;
                Sbuf[5]=0xe4;
                f=6;
                for(i=0;i<20;i++;f++){
                Sbuf[f]=pledvalue;
                }
                Sbuf[26]=(char)GetCheckSum(Sbuf,25);
                Sbuf[27]=SER_END;
                send_data(Sbuf,28);
                  }         */




阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入8汤圆

发表于 2012-9-29 10:11:36 | 显示全部楼层
本帖最后由 kebaojun305 于 2012-9-29 10:15 编辑

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

这个函数中
  1. void keyHandle(void)                     
  2. {      
  3.         switch(keyValue)         
  4.         {
  5.                 case 0x7f:           //如果S17按键按下
  6.                   // delay2(2);
  7.                         send_data(buf0);                                // 发送UP
  8.                         break;         
  9.                 case 0xbf:           //如果S18按键按下
  10.                         // delay2(2);
  11.                         send_data(buf1);                   // DOWN
  12.                         break;
  13.                 case 0xdf:           //如果S19按键按下
  14.           // delay2(2);
  15.                         send_data(buf2);                                       // RIGHT
  16.                         break;
  17.                 case 0xef:           //如果S20按键按下
  18.                    //  delay2(2);
  19.                         send_data(buf3);                                     //         LEFT
  20.                         break;
  21.                 case 0xf7:           //如果S21按键按下  // INTO  
  22.                     //  delay2(2);
  23.                         send_data(buf4);                                       
  24.                         break;
  25.                 case 0xfb:               // exit  
  26.                     // delay2(2);   
  27.                         send_data(buf5);                                    
  28.                         break;
  29.                 case 0xfd:                 // Control 1          (发炮1)
  30.                    // delay2(2);
  31.                         send_data(buf6);                                      
  32.                         break;
  33.                 case 0xfe:                  // Control 2         (        发炮2 )
  34.                     // delay2(2);
  35.                         send_data(buf7);
  36.                         break;              
  37.                     default:
  38.                         break;
  39.         }      
  40. }  
复制代码

出0入0汤圆

 楼主| 发表于 2012-9-29 10:30:17 | 显示全部楼层
kebaojun305 发表于 2012-9-29 10:11
语法错误 错误说明中已经说的很清楚 “缺少实参”。   send_data函数原型是2个参数   程序中有部分调用是只 ...

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

出0入0汤圆

 楼主| 发表于 2012-9-29 10:31:06 | 显示全部楼层
我再试一试,谢了,

出0入8汤圆

发表于 2012-9-29 10:39:07 | 显示全部楼层
金砂紫钰 发表于 2012-9-29 10:31
我再试一试,谢了,

比如 我帖子中的第7行  你调用send_data函数时  只有一个参数。另一个参数 你把它整哪里去了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-11 00:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表