@@ -72,6 +72,7 @@
# define RESP_TYPE_HEADER_ERR 0xF2 /**< 包头错误 */
# define RESP_TYPE_TYPE_ERR 0xF3 /**< 类型错误 */
# define RESP_TYPE_LEN_ERR 0xF4 /**< 长度错误 */
# define RESP_TYPE_DATA_ERR 0xF5 /**< 数据错误 */
/** @} */
/* ============================================================================
@@ -225,7 +226,7 @@ void handle_command(const uint8_t *frame, uint8_t len) {
// 命令必须以 'M' 开头
if ( cmd [ 0 ] ! = ' M ' ) {
send_response( RESP_TYPE_TYPE_ERR, s_report_status_err, sizeof( s_report_status_err) ) ;
// send_response( RESP_TYPE_TYPE_ERR, s_report_status_err, sizeof( s_report_status_err));
return ;
}
@@ -237,7 +238,7 @@ void handle_command(const uint8_t *frame, uint8_t len) {
if ( used_base_cmd = = 0 )
{
// 'M' 后没有数字,格式错误
send_response( RESP_TYPE_LEN_ERR, s_report_status_err, sizeof( s_report_status_err) ) ;
// send_response( RESP_TYPE_LEN_ERR, s_report_status_err, sizeof( s_report_status_err));
return ;
}
@@ -251,7 +252,7 @@ void handle_command(const uint8_t *frame, uint8_t len) {
// 启动超声波PWM发送
ultrasonic_pwm_out_cycles ( ) ;
uint16_t timeout_count = 0 ;
const uint16_t max_timeout = 1 50;
const uint16_t max_timeout = 2 50;
while ( ! g_ultrasonic_measure_done & & timeout_count < max_timeout ) {
delay_10us ( 1 ) ; // 延时 10us
@@ -263,7 +264,7 @@ void handle_command(const uint8_t *frame, uint8_t len) {
ultrasonic_distance_raw_value_report ( ) ;
} else {
static const uint8_t timeout_error_data [ ] = { 0xFF , 0xFF } ;
send_response ( RESP_TYPE_OK , timeout_error_data , sizeof ( timeout_error_data ) ) ;
send_response ( RESP_TYPE_DATA_ERR , timeout_error_data , sizeof ( timeout_error_data ) ) ;
}
return ;
@@ -290,7 +291,7 @@ void handle_command(const uint8_t *frame, uint8_t len) {
break ;
}
// 未在处理列表的无参数基础命令,回复错误
send_response( RESP_TYPE_TYPE_ERR, s_report_status_err, sizeof( s_report_status_err) ) ;
// send_response( RESP_TYPE_TYPE_ERR, s_report_status_err, sizeof( s_report_status_err));
return ;
}
@@ -301,7 +302,7 @@ void handle_command(const uint8_t *frame, uint8_t len) {
const uint8_t used_param_cmd = parse_uint_dec ( & cmd [ cmd_index ] , ( uint8_t ) ( cmd_len - cmd_index ) , & param_value ) ;
if ( used_param_cmd = = 0 ) {
// 'S' 后没有数字,格式错误
send_response( RESP_TYPE_LEN_ERR, s_report_status_err, sizeof( s_report_status_err) ) ;
// send_response( RESP_TYPE_LEN_ERR, s_report_status_err, sizeof( s_report_status_err));
return ;
}
@@ -314,7 +315,7 @@ void handle_command(const uint8_t *frame, uint8_t len) {
default :
break ;
}
send_response( RESP_TYPE_TYPE_ERR, s_report_status_err, sizeof( s_report_status_err) ) ;
// send_response( RESP_TYPE_TYPE_ERR, s_report_status_err, sizeof( s_report_status_err));
}
}
@@ -394,14 +395,14 @@ void command_process(void) {
# endif
if ( verification_status & & cmd_buf [ 1 ] ! = PROTOCOL_BOARD_TYPE ) {
send_response( RESP_TYPE_TYPE_ERR, s_report_status_err, sizeof( s_report_status_err) ) ;
// send_response( RESP_TYPE_TYPE_ERR, s_report_status_err, sizeof( s_report_status_err));
verification_status = false ;
}
if ( verification_status ) {
uint8_t crc_calc = command_sum_crc_calc ( cmd_buf , expected_cmd_len ) ;
uint8_t crc_recv = cmd_buf [ expected_cmd_len - 1 ] ;
if ( crc_calc ! = crc_recv ) {
send_response( RESP_TYPE_CRC_ERR, s_report_status_err, sizeof( s_report_status_err) ) ;
// send_response( RESP_TYPE_CRC_ERR, s_report_status_err, sizeof( s_report_status_err));
verification_status = false ;
}
}
@@ -432,6 +433,12 @@ void ultrasonic_distance_raw_value_report(void) {
// 读取定时器计数值(微秒)
uint16_t timer_count_us = timer_counter_read ( US_ECHO_TIMER ) ;
if ( timer_count_us < ULTRASONIC_TX_RINGDOWN_RELOAD ) {
// 超出最大计时范围,返回错误
send_response ( RESP_TYPE_DATA_ERR , s_report_status_err , sizeof ( s_report_status_err ) ) ;
return ;
}
// 计算距离:定时器计数值 * 17 = 距离(0.1mm)
// 声速340m/s, 往返距离, 时间单位us
// 距离(mm) = (timer_count_us * 340) / (2 * 1000) = timer_count_us * 0.17
@@ -444,4 +451,5 @@ void ultrasonic_distance_raw_value_report(void) {
// 发送响应包
send_response ( RESP_TYPE_OK , raw_result , sizeof ( raw_result ) ) ;
return ;
}