com_trans.c

来自「LPC2129实现从SPI通讯和两个串口定时器中断」· C语言 代码 · 共 449 行

C
449
字号
#define COMM_GLOBALES  1

#include 	"com_trans.h"
#include "uart0.h"
#include "spi.h"
 /*#define UART_NUM 6
#define DATA_BUF_NUM 64
#define UART_START0 0x55
#define UART_START1 0xAA
#define RXD_WAIT 0
#define SET_NEW 0X01
#define GET_LEN 0x3f
#define GET_ERROR 0x80
#define IP_ADD 0x01
#define true 1
#define false 0

struct DATA_BUF
{
char data[DATA_BUF_NUM];
char IP_addr;
char command;
char length;
char sum;
char state; //bit7=1 indicate the state of zhen is true
            //bit0=1 indicate a new data is received completely
};

struct DATA_BUF RXD_BUF[UART_NUM],TXD_BUF[UART_NUM];
*/
/*****************************/


/************ received data transport analyse begin *************/
void rx_cmd_deal(int uart_num,unsigned char receiv)
{
  static int startflag[UART_NUM];
  static char data_len[UART_NUM];
  static char data_index[UART_NUM];
  static int com_index[UART_NUM];
  static struct DATA_BUF *rxd_pk[UART_NUM];
  //buffer point
  static unsigned char tempchar1[UART_NUM];
  static unsigned char tempchar0[UART_NUM];
  static int StartFlag=false;
  int i;
  unsigned char char_sum;

  if(StartFlag!=true)
  {//initial the data
   for(i=0;i<UART_NUM;i++)
    {
     startflag[i]=0;
     data_len[i]=0x00;
     data_index[i]=0x00;
     com_index[i]=0;
     rxd_pk[i]=&RXD_BUF[i];
     tempchar1[i]=0x00;
     tempchar0[i]=0x00;
    }
   StartFlag=true;
  }

  tempchar1[uart_num]=receiv;      //store received data in tempchar1 temporaly

  if(startflag[uart_num]==RXD_WAIT)    //wait for start
  {
//    gettimeofday(&tvstart,NULL);

    if(tempchar1[uart_num]==UART_START1)  //second word head 0XAA
      {
        if(tempchar0[uart_num]==UART_START0)  //first word head 0x55
          {
            startflag[uart_num]=!RXD_WAIT;
            data_index[uart_num]=0x00;
            com_index[uart_num]=0x00;
          }
      }

    else
      tempchar0[uart_num]=tempchar1[uart_num];
 //     printf("the data is %x\n",tempchar1[uart_num]);
  }//head word

  else if(com_index[uart_num]<3)
  {
    switch(com_index[uart_num])
     {
       case 0:
          rxd_pk[uart_num]->IP_addr=tempchar1[uart_num];   //get IP
          break;
       case 1:                              //get data length
          rxd_pk[uart_num]->s_l=tempchar1[uart_num];
          rxd_pk[uart_num]->length=tempchar1[uart_num] & GET_LEN;
          data_len[uart_num]=rxd_pk[uart_num]->length;
          rxd_pk[uart_num]->state &= ~GET_ERROR;
          rxd_pk[uart_num]->state |= (tempchar1[uart_num] & GET_ERROR);
          break;
       case 2:                              //get command
          rxd_pk[uart_num]->command=tempchar1[uart_num];
          break;
          
     }
   com_index[uart_num]++;
  }

  else if(data_index[uart_num]<data_len[uart_num] && data_index[uart_num]<DATA_BUF_NUM)  //get data
  {
   rxd_pk[uart_num]->data[data_index[uart_num]]=tempchar1[uart_num];
   data_index[uart_num]++;
  }

  else  //get check sum and reset index
  {
   rxd_pk[uart_num]->sum=tempchar1[uart_num];

   com_index[uart_num]=0;
   data_index[uart_num]=0x00;
   startflag[uart_num]=RXD_WAIT;

 //  unsigned char char_sum;
   char_sum=0x55+0xaa+rxd_pk[uart_num]->IP_addr+rxd_pk[uart_num]->s_l+rxd_pk[uart_num]->command;
   for (i=0;i<(rxd_pk[uart_num]->length);i++)
      char_sum+=rxd_pk[uart_num]->data[i];
   if(char_sum==rxd_pk[uart_num]->sum)
   {
	// UART0_SendByte(0x66);
 //    printf("already receive a complete cmd!\n");
    // if(rxd_pk[uart_num]!=0x00)
    // {
      rxd_pk[uart_num]->rx_cmd[0]=0x55;
      rxd_pk[uart_num]->rx_cmd[1]=0xaa;
      rxd_pk[uart_num]->rx_cmd[2]=rxd_pk[uart_num]->IP_addr;
      rxd_pk[uart_num]->rx_cmd[3]=rxd_pk[uart_num]->s_l;
      rxd_pk[uart_num]->rx_cmd[4]=rxd_pk[uart_num]->command;
     // printf("command =%x\n",rxd_pk[uart_num]->command); 
      for (i=0;i<(rxd_pk[uart_num]->length);i++)
         rxd_pk[uart_num]->rx_cmd[5+i]=rxd_pk[uart_num]->data[i];
      rxd_pk[uart_num]->rx_cmd[5+rxd_pk[uart_num]->length]=rxd_pk[uart_num]->sum;
    // }
	 rxd_pk[uart_num]->state |=SET_NEW;//receive a complete zhen
	 /* if(0x01==rxd_pk[0]->state)
     {
      perform_command(rxd_pk[0]);
	 } */

   }
  }
}
/************* received data transport analyse end *************/


//void send_both_motor(char left_speed[],char right_speed[]);

/************ received data transport analyse begin *************/
/************* received data transport analyse end *************/

void perform_command (struct DATA_BUF *com_pk)
{
	if (com_pk->command<=0x0F)
	{
		//send_error_back_uart1(com_pk);	//反回错误命令
	}
	else if (com_pk->command<=0x1F)		
	{	
		//operate_system( com_pk );	//系统命令执行
	}	
	else if (com_pk->command<=0x2F)
	{
	  //  UART0_SendByte(0x77);
		operate_motion (com_pk);		//IO口命令执行
	} 
	else if (com_pk->command<=0x3F)
	{
		//operate_sensor( com_pk );	//传感器命令执行
	} 
	else if (com_pk->command<=0x4F)
	{
		//operate_IO( com_pk );		//IO口命令执行
	} 
	else if (com_pk->command<=0x6F)
	{
		 
	} 
	else 
	{
		//send_error_back_uart1(com_pk);	//反回错误命令
	}
	
	com_pk->state= 0x00;
//	com_pk->state &= ~SET_NEW;

}

/*********************************
#define MOVE_RESET 	0X20	//运动软复位指令
#define MOVE_HOLD	0X21	//运动刹车控制指令
#define MOVE_DIS_L_SET	0X22	//设置左电机位置
#define MOVE_DIS_R_SET	0X23	//设置右电机位置
#define MOVE_SPEEDL_SET	0X24	//设置左电机的速度	
#define MOVE_SPEEDR_SET	0X25	//设置右电机的速度	
#define MOVE_SPEED_SET	0X26	//设置双电机的速度	
#define MOVE_ACCER_SET	0X27	//设置双电机的加速度
#define MOVE_STATE_RQ	0X28	//运动参数查询	
#define MOVE_PID_SET	0X29	//设置PID参数		
#define MOVE_ELEC_RQ	0X2A	//电气参数查询		
#define MOVE_PROTECT	0X2E	//自我保护功能选择	
***************************************/
void operate_motion (struct DATA_BUF *motion_pk)
{
	
	switch (motion_pk->command)
	{
		
		case 0x20:	//运动软复位指令
			set_move_reset();
		//	send_same_back_uart(1,motion_pk);
			break;
			
		case 0x21:		//运动刹车控制指令
			set_move_hold();
		//	send_same_back_uart(1,motion_pk);
			break;
	
		case 0x26:	//设置双电机的速度
		 //   UART0_SendByte(0x88);
		//	send_same_back_uart(1,motion_pk);
			set_move_speedLR(motion_pk);
		
			break;

		default:
			break;
	}
}

 void set_move_reset(void)
{

}
void set_move_hold(void)
{
	SendSpeedLR(0,0);

}

void set_move_speedLR(struct DATA_BUF *rxd_pk)
{
	int32 SpeedL,SpeedR;


	SpeedL = rxd_pk->data[0];
	SpeedL <<= 8;
	SpeedL |= rxd_pk->data[1];

//	UART0_SendByte(rxd_pk->data[0]);
//	UART0_SendByte(rxd_pk->data[1]);

	if(SpeedL > 0x8000)
	{
		SpeedL -= 0x8000;
		SpeedL = 0 - SpeedL; 
	}

	SpeedR = rxd_pk->data[2];
	SpeedR <<= 8;
	SpeedR |= rxd_pk->data[3];
	
	if(SpeedR > 0x8000)
	{
		SpeedR -= 0x8000;
		SpeedR = 0 - SpeedR; 
	}

	SendSpeedLR(SpeedL, SpeedR);

}

void SendSpeedLR(int SpeedL, int SpeedR)
{
	while( (U0LSR&0x40)==0 );	    // 等待数据发送完毕
	SendSpeedL(SpeedL);

  	while( (U1LSR&0x40)==0 );	    // 等待数据发送完毕
	SendSpeedR(0-SpeedR);

	
}

void SendSpeedL(int TempSpeed)	  //uart0
{
	uint8 i;
	uint8 data[12];

	

	//TempSpeed /=4;		

	if(TempSpeed > 0)
	{
		i = 0;
		while(TempSpeed != 0)
		{
			data[i] = 0x30 + TempSpeed%10;

			i++;

			TempSpeed /= 10;
		}	
	}
	else if(TempSpeed < 0)
	{
		TempSpeed = 0 - TempSpeed;

		i = 0;
		while(TempSpeed != 0)
		{
			data[i] = 0x30 + TempSpeed%10;

			i++;

			TempSpeed /= 10;
		}
		
		data[i] = '-';
		i++;	
	}
	else
	{	
		i = 0;
		data[i] = '0';
		i++;
	}

	U0THR = 'V';
	do
	{
		i--;
		
		U0THR = data[i];				// 发送数据
	}
	while(i>0);

	U0THR = 0x0D;					// 发送数据

}

void SendSpeedR(int TempSpeed)	   //uart1
{
	uint8 i;
	uint8 data[12];

	
	//TempSpeed /=4;		

	if(TempSpeed > 0)
	{
		i = 0;
		while(TempSpeed != 0)
		{
			data[i] = 0x30 + TempSpeed%10;

			i++;

			TempSpeed /= 10;
		}	
	}
	else if(TempSpeed < 0)
	{
		TempSpeed = 0 - TempSpeed;

		i = 0;
		while(TempSpeed != 0)
		{
			data[i] = 0x30 + TempSpeed%10;

			i++;

			TempSpeed /= 10;
		}
		
		data[i] = '-';
		i++;	
	}
	else
	{	
		i = 0;
		data[i] = '0';
		i++;
	}

	U1THR = 'V';
	do
	{
		i--;
		
		U1THR = data[i];				// 发送数据
	}
	while(i>0);

	U1THR = 0x0D;					// 发送数据

}

/*******************************************/
/****************************************************************************
* 名称:send_same_back_uart() 
* 功能:用于正确帧的原样返回发送
* 入口参数:uart_num		发送中断所处理的串口号
			rxd_pk	需要同样返馈的数据缓冲区    
* 出口参数:无
****************************************************************************/
void send_same_back_uart(uint8 uart_num,struct DATA_BUF *rxd_pk)
{
	 /*
      rxd_pk[uart_num]->rx_cmd[0]=0x55;
      rxd_pk[uart_num]->rx_cmd[1]=0xaa;
      rxd_pk[uart_num]->rx_cmd[2]=rxd_pk[uart_num]->IP_addr;
      rxd_pk[uart_num]->rx_cmd[3]=rxd_pk[uart_num]->s_l;
      rxd_pk[uart_num]->rx_cmd[4]=rxd_pk[uart_num]->command;
	  */
	unsigned char tmp_sum;
	int i;

 	struct DATA_BUF *send_pk = &TXD_BUF[uart_num];		//初始化定义
	
    while(0x01==TXD_BUF[0].state) ;				//等待上一个数据帧发送完毕
	 
	send_pk->tx_cmd[0] =rxd_pk->rx_cmd[0];							
	send_pk->tx_cmd[1] =rxd_pk->rx_cmd[1];			
	send_pk->tx_cmd[2] =rxd_pk->rx_cmd[2];
	send_pk->tx_cmd[3] =0x00;
	send_pk->tx_cmd[4] =rxd_pk->rx_cmd[4];
	
	tmp_sum=rxd_pk->rx_cmd[0]+rxd_pk->rx_cmd[1]+rxd_pk->rx_cmd[2]+rxd_pk->rx_cmd[3]+rxd_pk->rx_cmd[4];
	send_pk->tx_cmd[5] =tmp_sum;		
		
	send_pk->state=0x01;						//设置错误标志位,无

	for(i=0;i<6;i++)
	  SSendData(send_pk->tx_cmd[i]);

	  send_pk->state=0x00;
	
//	set_sum (send_pk);									//设置校验和
	
//	uart_tx_isr(uart_num);								//开始发送数据
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?