⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 promotion.c.svn-base

📁 AVR单片机下
💻 SVN-BASE
字号:
/*                ****ROBOCON 2009 | BUPT TEAM*******
 * ------------------------------------------------------------------------
 * FileName   : speed.c
 * Version    : 1.0
 * Brief      : 与promotion的通信协议C语言实现
 * Code by    : Leaf
 * Date       : March 22 2008
 * Dependence : Usart
 * Parameters : SPEED_LIMIT(integer), SPDREVERSEL(-/nothing),
 *              SPDREVERSER(-/nothing)
 * Note       :
 * ------------------------------------------------------------------------
 */
#include "lib_bupt.h"
#include <string.h>
#ifdef   PROMOTION_H_INCLUDED
/*设置是否在发指令后等待promotion的应答*/
void promSetWaitAck(Promotion *p, Bool wait){
	p->waitAck = wait;
	if(wait){
		promSendCommand(p, "ANSW2");
	}
	else{
		promSendCommand(p, "ANSW1");
	}
}

/*广播,发给所有port上的驱动器*/
void promBroadcast(PromPort p, const char *cmd){
	usartPuts(p, cmd);
}

/*初始化串口*/
void promPortInit(PromPort p, Ubrr baud){
	usartInit(p, baud);
}

/*返回信息不得长于20字节*/
void promWaitAck(Promotion *p, const char *ack){
	char   buffer[21];
	do{
		usartReadline(p->port, buffer);
	}while( strcmp(buffer, ack) != 0 );
}

/*不停发送命令,直到收到想要的回应*/
void promSureCommand( Promotion *p, const char *cmd, const char *ack ){
	char answer[21];
	do{
		promSendCommand(p, cmd);
		usartReadline(p->port, answer);
	}while( strcmp(answer, ack) != 0 );
}

/*在调用之前一定要初始化好串口*/
void promInit(Promotion *p, PromPort port, PromId id){
	p->port = port;
	p->id = id;
}

/*向promotion发送指令*/
void promSendCommand(Promotion *p, const char *cmd){
	usartGetLock( p->port );
	/*为网络连接方式时,添加地址*/
	if(p->id != PROM_SINGLE){
		char buf[5];
		itoa(p->id, buf, 10);
		usartSendString(p->port, buf);
	}
	usartPuts(p->port, cmd);
	usartUnLock( p->port );
}

/* 便捷的指令生成法,外部不能调用 */
static inline void promQuickCommand(char *buf, const char prefix, INT16 param){
	buf[0] = prefix;
	itoa(param, &buf[1], 10);
}
/* 当指令头不为单字符时,用这个函数生成指令,外部也不能调用 */
static inline void promGetCommand(char *buf, const char *prefix, INT32 param){
	strcpy(buf, prefix);
	ltoa(param, &buf[strlen(prefix)], 10);
}

/*发送速度指令*/
void promSpeed(Promotion *p, SPEED_T speed){
	char buf[9];
	promQuickCommand(buf, 'V', speed);
	if(p->waitAck){
		promSureCommand(p, buf, "OK!");
	}
	else{
		promSendCommand(p, buf);
	}
}

/*发送电压模式的指令*/
void promVotage(Promotion *p, INT16 v){
	char buf[9];
	promQuickCommand(buf, 'U', v);
	if(p->waitAck){
		promSureCommand(p, buf, "OK!");
	}
	else{
		promSendCommand(p, buf);
	}
}

/*发送电流模式的指令*/
void promCurrent(Promotion *p, INT16 c){
	char buf[9];
	promQuickCommand(buf, 'C', c);
	if(p->waitAck){
		promSureCommand(p, buf, "OK!");
	}
	else{
		promSendCommand(p, buf);
	}
}

/*发送位移指令*/
void promMove(Promotion *p, DIST_T dist){
	char buf[11] = "LR";
	ltoa(dist, &buf[2], 10);
	promGetCommand(buf, "LR", dist);
	promSendCommand(p, buf);
	_delay_us( 700 );
	if(p->waitAck){
		promSureCommand(p, "M", "OK!");
	}
	else{
		promSendCommand(p, "M");
	}
}

/*发送绝对位移指令*/
void promPosition(Promotion *p, DIST_T dist){
	char buf[11] = "LA";
	ltoa(dist, &buf[2], 10);
	promSendCommand(p, buf);
	_delay_us( 700 );
	if(p->waitAck){
		promSureCommand(p, "M", "OK!");
	}
	else{
		promSendCommand(p, "M");
	}
}

/*先改变port上所有驱动器的波特率,再改变此串口的波特率*/
void promChangeBaud(PromPort p, UINT32 baudrate){
	char buf[12] = "BAUD";
	ltoa(baudrate, &buf[4], 10);
	promBroadcast(p, buf);
	usartSetBaudrate(p, baudrate);
}

/*先改变驱动器的ID,再改变单片机方面的设置*/
void promChangeId(Promotion *p, PromId id){
	char buf[11] = "NODEADR";
	itoa(id, &buf[7], 10);
	promSendCommand(p, buf);
	p->id = id;
}

#endif

⌨️ 快捷键说明

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