4.通讯检测¶
检查舵机是否在线,就需要用到通讯检测指令。
-
如果ID号的舵机存在且在线,舵机在接收到通讯检测指令时,会发送一个响应包。
-
如果ID号的舵机不存在或者掉线,就不会有舵机发送响应数据包。
4.1.API¶
4.1.1.通讯检测¶
函数原型
usart
舵机控制对应的串口数据对象Usart_DataTypeDef
servo_id
舵机的ID
使用示例
舵机通讯检测函数FSUS_Ping
,依次传入串口数据结构体指针servoUsart
,还有舵机的ID号servoId
。
statusCode
是返回的状态码FSUS_STATUS
,如果是请求成功则返回0
,如果是其他的数值则意味着舵机通讯检测失败。可以在fashion_star_uart_servo.h
文件里面查阅不同的statusCode对应的错误。
// FSUS状态码
#define FSUS_STATUS uint8_t
#define FSUS_STATUS_SUCCESS 0 // 设置/读取成功
#define FSUS_STATUS_FAIL 1 // 设置/读取失败
#define FSUS_STATUS_TIMEOUT 2 // 等待超时
#define FSUS_STATUS_WRONG_RESPONSE_HEADER 3 // 响应头不对
#define FSUS_STATUS_UNKOWN_CMD_ID 4 // 未知的控制指令
#define FSUS_STATUS_SIZE_TOO_BIG 5 // 参数的size大于FSUS_PACK_RESPONSE_MAX_SIZE里面的限制
#define FSUS_STATUS_CHECKSUM_ERROR 6 // 校验和错误
#define FSUS_STATUS_ID_NOT_MATCH 7 // 请求的舵机ID跟反馈回来的舵机ID不匹配
4.2.例程¶
STM32F103_SDK下载链接:SDK for STM32F103
4.2.1.检测舵机是否在线¶
功能简介
持续向0号舵机发送通信检测指令,并且根据0号舵机的响应情况在日志输出串口打印提示信息。
源代码
/********************************************************
* 测试通信检测指令,测试舵机是否在线
********************************************************/
#include "stm32f10x.h"
#include "usart.h"
#include "sys_tick.h"
#include "fashion_star_uart_servo.h"
// 使用串口1作为舵机控制的端口
// <接线说明>
// STM32F103 PA9(Tx) <----> 总线伺服舵机转接板 Rx
// STM32F103 PA10(Rx) <----> 总线伺服舵机转接板 Tx
// STM32F103 GND <----> 总线伺服舵机转接板 GND
// STM32F103 V5 <----> 总线伺服舵机转接板 5V
// <注意事项>
// 使用前确保已设置usart.h里面的USART1_ENABLE为1
// 设置完成之后, 将下行取消注释
Usart_DataTypeDef* servoUsart = &usart1;
// 使用串口2作为日志输出的端口
// <接线说明>
// STM32F103 PA2(Tx) <----> USB转TTL Rx
// STM32F103 PA3(Rx) <----> USB转TTL Tx
// STM32F103 GND <----> USB转TTL GND
// STM32F103 V5 <----> USB转TTL 5V (可选)
// <注意事项>
// 使用前确保已设置usart.h里面的USART2_ENABLE为1
Usart_DataTypeDef* loggingUsart = &usart2;
// 重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
while((loggingUsart->pUSARTx->SR&0X40)==0){}
/* 发送一个字节数据到串口 */
USART_SendData(loggingUsart->pUSARTx, (uint8_t) ch);
/* 等待发送完毕 */
// while (USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);
return (ch);
}
// 连接在转接板上的总线伺服舵机ID号
uint8_t servoId = 0;
// 发送Ping请求的状态码
FSUS_STATUS statusCode;
int main (void)
{
// 嘀嗒定时器初始化
SysTick_Init();
// 串口初始化
Usart_Init();
while (1)
{
printf("\r\n");
// Ping一下舵机
printf("[INFO]ping servo %d \r\n", servoId);
statusCode = FSUS_Ping(servoUsart, servoId);
printf("[INFO]status code %d \r\n", statusCode);
// 根据状态码做不同的处理
if (statusCode == FSUS_STATUS_SUCCESS){
printf("[INFO]ping success, servo %d echo \r\n", servoId);
}else{
printf("[ERROR]ping fail, servo %d not online \r\n", servoId);
}
// 等待1000ms
SysTick_DelayMs(1000);
}
}