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 + -
显示快捷键?