📄 promotion.c.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 + -