Browse Source

优化为拉毛的有线程序

master
LIN\54376 1 month ago
parent
commit
cc14bdd027
  1. 4
      .settings/language.settings.xml
  2. 17
      BASE/Inc/BSP/bsp_UDP.h
  3. 6
      BASE/Inc/MSP/msp_485_android.h
  4. 2
      BASE/Inc/MSP/msp_U7.h
  5. 2
      BASE/Src/BSP/bsp_UART.c
  6. 403
      BASE/Src/BSP/bsp_UDP.c
  7. 4
      BASE/Src/BSP/bsp_client_setting.c
  8. 120
      BASE/Src/MSP/msp_485_android.c
  9. 4
      BASE/Src/MSP/msp_TI5MOTOR.c
  10. 1
      BASE/Src/MSP/msp_U7.c
  11. 2
      BHBF_NewFiveWheel3.0.ioc
  12. 2
      Core/Protobuf/PSource/bsp_GV.pb.h
  13. 21
      Core/Protobuf/PSource/msp_U7.pb.h
  14. 5
      Core/Protobuf/Proto/msp_U7.proto
  15. 4
      Core/Src/FSM.c
  16. 14
      Core/Src/main.c
  17. 7
      Core/Src/motors.c
  18. 2
      Core/Src/usart.c
  19. 3
      readme.txt

4
.settings/language.settings.xml

@ -5,7 +5,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="464840693227456435" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1865330267719313672" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>
@ -16,7 +16,7 @@
<provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/>
<provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/>
<provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/>
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="464840693227456435" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<provider class="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" console="false" env-hash="1865330267719313672" id="com.st.stm32cube.ide.mcu.toolchain.armnone.setup.CrossBuiltinSpecsDetector" keep-relative-paths="false" name="MCU ARM GCC Built-in Compiler Settings" parameter="${COMMAND} ${FLAGS} -E -P -v -dD &quot;${INPUTS}&quot;" prefer-non-shared="true">
<language-scope id="org.eclipse.cdt.core.gcc"/>
<language-scope id="org.eclipse.cdt.core.g++"/>
</provider>

17
BASE/Inc/BSP/bsp_UDP.h

@ -8,10 +8,17 @@
#ifndef INC_BSP_BSP_UDP_H_
#define INC_BSP_BSP_UDP_H_
#include "lwip/udp.h"
extern void udp_client_init(void);
extern void udp_dlt_send_back(char *pData,uint16_t Size);
extern void udp_cmd_send_back(char *pData, uint16_t Size);
typedef void (*DLT_DecodeFuncPtr)(uint8_t*, uint16_t);
extern void udp_send_by_pcb(struct udp_pcb * upcb,char *pData, uint16_t Size);
// 再用该类型声明变量
extern DLT_DecodeFuncPtr UDP_DLT_ReceivedCallback;
extern int8_t is_udp_GV_update_loop_enalbed;
void udp_printf_CmdBack(char *pData);
void udp_client_init(void);
void GF_UDP_Send(uint8_t *pData,uint16_t Size,uint16_t UDP_port);
void GF_UDP_long_Send_Server(void);
void GF_UpdataPos_Send(uint8_t *pData,uint32_t Size);
#endif /* INC_BSP_BSP_UDP_H_ */

6
BASE/Inc/MSP/msp_485_android.h

@ -13,10 +13,10 @@
extern int isOnLineCount;
extern int16_t read_android_holidng_register_count;
void android_485_intialize_with_slaveID(struct UARTHandler *Handler,
extern void android_485_intialize_with_slaveID(struct UARTHandler *Handler,
int slave_id);
void android_485_intialize(struct UARTHandler *Handler);
extern void android_485_intialize(struct UARTHandler *Handler);
#endif /* BASE_INC_MSP_MSP_485_ANDROID_H_ */

2
BASE/Inc/MSP/msp_U7.h

@ -12,7 +12,7 @@
void Sbus_Data_Count_U7(uint8_t *buf, int32_t *But_Value);
extern SP_MSP_U7_Button *P_U7;
void Robot_ResetCheck_Loop(void);
extern uint8_t IsRemoteAtInitialPosition(void);
//
extern void U7_Sbus_UART_Handler_intialize(struct UARTHandler* Handler);
uint8_t IsRemoteAtInitialPosition(void);

2
BASE/Src/BSP/bsp_UART.c

@ -1,7 +1,7 @@
#include "bsp_UART.h"
#include "main.h"
#include <stdlib.h>
#include "DLT/DLTuc.h"
#include "DLTuc.h"
void GF_UART_Send_List_Send(struct UARTHandler *handler);
void Dispatcher_List_Add(struct UARTHandler *uartHandler,

403
BASE/Src/BSP/bsp_UDP.c

@ -10,21 +10,47 @@
#include "udp.h"
#include "string.h"
#include "bsp_UDP.h"
#include "bsp_DLT_Log.h"
#include <bsp_UpperComputer_Handler.h>
#include "bsp_GPIO.h"
void UDP_GV_Dispatch();
void UDP_IV_Dispatch();
void udp_cmd_send_GV(char *pData, uint16_t Size);
/* 定义端口号 */
#define UDP_REMOTE_PORT 8881 /* 远端端口 */
#define UDP_LOCAL_PORT 8880 /* 本地端口 */
#define UDP_Send_LOCAL_PORT 9880 /* 本地端口 */
#define UDP_DLT_LOCAL_PORT 8000 /* 本地端口 */
#define UDP_CMD_LOCAL_PORT 8002 /* 本地端口 */
#define UDP_CMD_LOCAL_Android_Listen_PORT 8006 /* 本地端口 接收安卓 */
#define UDP_DLT_Send_LOCAL_PORT 7000 /* 本地端口 */
#define UDP_CMD_Send_LOCAL_PORT 7002 /* 本地端口 */
#define UDP_GV_Send_LOCAL_PORT 7004 /* 本地端口 */
#define UDP_Android_Send_LOCAL_PORT 7006 /* 本地端口 发给安卓*/
/*32从7006发往安卓9006*/
/*安卓从9006发往32的8006*/
#define UDP_REMOTE_DLT_PORT 9000 /* 远端端口 */
#define UDP_REMOTE_CMD_PORT 9002 /* 远端端口 */
#define UDP_REMOTE_GV_PORT 9004 /* 远端端口 */
#define UDP_REMOTE_Android_PORT 9006 /* 远端端口 */
#define UDP_Printf_PORT 8881
#define UDP_Long_PORT 8882
#define UDP_UpdataPos_PORT 8883
int8_t is_udp_GV_update_loop_enalbed = 0;
unsigned char received_data[1000];
/* udp控制块 */
static struct udp_pcb *upcb;
static struct udp_pcb *upcb_send;
static struct udp_pcb *upcb_Rx_DLT;
static struct udp_pcb *upcb_Rx_Cmd;
static struct udp_pcb *upcb_Rx_From_Android;
static struct udp_pcb *upcb_Tx_DLT;
static struct udp_pcb *upcb_Tx_Cmd;
static struct udp_pcb *upcb_Tx_GV;
static struct udp_pcb *upcb_Tx_Android;
ip_addr_t serverIP;
ip_addr_t Android_ServerIP;
DLT_DecodeFuncPtr UDP_DLT_ReceivedCallback;
/******************************************************************************
* :
* : -
@ -33,49 +59,119 @@ ip_addr_t serverIP;
static void udp_receive_callback(void *arg, struct udp_pcb *upcb,
struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
if (p == NULL) return;
memcpy(received_data, p->payload, p->len);
if (p != NULL)
if (upcb->local_port == UDP_DLT_LOCAL_PORT)
{
memcpy(received_data, p->payload, p->len);
//err_t t = udp_sendto(upcb_send, p, &serverIP, 8000);
pbuf_free(p);
} else
UDP_DLT_ReceivedCallback(received_data, p->len);
//DLT_DataReceiveEndCallback(received_data, p->len);
}
else if (upcb->local_port == UDP_CMD_LOCAL_PORT)
{
pbuf_free(p);
if (*received_data == 0x55 && *(received_data + 1) == 0x55
&& p->len >= 3)
{
decode_command_and_feedback(received_data + 2, p->len - 2, 2,
NULL); //0代表UDP
}
else if (*received_data == 0x66 && *(received_data + 1) == 0x66
&& p->len >= 3)
{
GF_BSP_GPIO_SetIO(received_data[3], received_data[2]);
}
else
{
udp_cmd_send_back(received_data, p->len);
}
}
else if (upcb->local_port == UDP_CMD_LOCAL_Android_Listen_PORT)
{
//对PV数据进行修改
//if (*buffer == 0x55 && *(buffer + 1) == 0x55 && length >= 4)
if (received_data[0] != 0x55 || received_data[1] != 0x55 || p->len < 4)
{
return;
}
uint16_t crc_check = ((received_data[p->len - 1] << 8)
| received_data[p->len - 2]);
uint16_t crc_check1 = MB_CRC16(received_data, p->len - 2);
/* CRC 校验正确 */
if (crc_check != MB_CRC16(received_data, p->len - 2)) return;
if (received_data[2] != 0x01 || received_data[3] != 0x01) return;
pb_istream_t i_pv_stream =
{ 0 };
i_pv_stream = pb_istream_from_buffer(&received_data[4], p->len - 4);
pb_decode(&i_pv_stream, PV_struct_define_fields, &_decoded_PV_temp);
if (_decoded_PV_temp.TimeStamp > decoded_PV.TimeStamp)
{
decoded_PV = _decoded_PV_temp;
}
}
pbuf_free(p);
}
//char UDPprintf[100];
void udp_printf_CmdBack(char *pData)
void udp_dlt_send_back(char *pData, uint16_t Size)
{
struct pbuf *p;
/* 分配缓冲区空间 */
p = pbuf_alloc(PBUF_TRANSPORT, strlen(pData), PBUF_POOL);
p = pbuf_alloc(PBUF_TRANSPORT, Size, PBUF_RAM);
if (p != NULL)
{
/* 填充缓冲区数据 */
pbuf_take(p, pData, strlen(pData));
pbuf_take(p, pData, Size);
/* 发送udp数据 */
udp_send(upcb, p);
//err_t t = udp_sendto(upcb, p, &serverIP, UDP_Printf_PORT);
//udp_send(upcb_DLT, p);
err_t t = udp_sendto(upcb_Tx_DLT, p, &serverIP,
UDP_REMOTE_DLT_PORT);
/* 释放缓冲区空间 */
pbuf_free(p);
}
}
void udp_cmd_send_back(char *pData, uint16_t Size)
{
struct pbuf *p;
/* 分配缓冲区空间 */
p = pbuf_alloc(PBUF_TRANSPORT, Size, PBUF_RAM);
if (p != NULL)
{
/* 填充缓冲区数据 */
pbuf_take(p, pData, Size);
/* 发送udp数据 */
err_t err = udp_send(upcb_Tx_Cmd, p);
if (err != ERR_OK)
{
// 发送失败
printf("Failed to send UDP data: %d\n", err);
}
/* 释放缓冲区空间 */
pbuf_free(p);
}
}
void GF_UDP_Send(uint8_t *pData, uint16_t Size, uint16_t UDP_port)
void udp_cmd_send_GV(char *pData, uint16_t Size)
{
struct pbuf *p;
/* 分配缓冲区空间 */
p = pbuf_alloc(PBUF_TRANSPORT, Size, PBUF_POOL);
p = pbuf_alloc(PBUF_TRANSPORT, Size, PBUF_RAM);
if (p != NULL)
{
@ -83,16 +179,39 @@ void GF_UDP_Send(uint8_t *pData, uint16_t Size, uint16_t UDP_port)
pbuf_take(p, pData, Size);
/* 发送udp数据 */
//udp_send(upcb, p);
err_t t = udp_sendto(upcb, p, &serverIP, UDP_port);
err_t err = udp_send(upcb_Tx_GV, p);
if (err != ERR_OK)
{
// 发送失败
//printf("Failed to send UDP data: %d\n", err);
}
/* 释放缓冲区空间 */
pbuf_free(p);
}
}
void GF_UpdataPos_Send(uint8_t *pData, uint32_t Size)
void udp_send_by_pcb(struct udp_pcb *upcb, char *pData, uint16_t Size)
{
GF_UDP_Send(pData, Size, UDP_UpdataPos_PORT);
struct pbuf *p;
/* 分配缓冲区空间 */
p = pbuf_alloc(PBUF_TRANSPORT, Size, PBUF_RAM);
if (p != NULL)
{
/* 填充缓冲区数据 */
pbuf_take(p, pData, Size);
/* 发送udp数据 */
err_t err = udp_send(upcb, p);
if (err != ERR_OK)
{
// 发送失败
//printf("Failed to send UDP data: %d\n", err);
}
/* 释放缓冲区空间 */
pbuf_free(p);
}
}
/******************************************************************************
@ -102,54 +221,212 @@ void GF_UpdataPos_Send(uint8_t *pData, uint32_t Size)
******************************************************************************/
void udp_client_init(void)
{
GF_BSP_Interrupt_Add_CallBack(
DF_BSP_InterCall_TIM8_2ms_PeriodElapsedCallback, UDP_GV_Dispatch);
//将UDP上传IV关闭
GF_BSP_Interrupt_Add_CallBack(
DF_BSP_InterCall_TIM8_2ms_PeriodElapsedCallback, UDP_IV_Dispatch);
//Timer intialize();
err_t err;
IP4_ADDR(&serverIP, 192, 168, 1, 102);
IP4_ADDR(&serverIP, 192, 168, 144, 255);
IP4_ADDR(&Android_ServerIP, 192, 168, 144, 20);
/* 创建udp控制块 */
upcb = udp_new();
upcb_Rx_DLT = udp_new();
if (upcb != NULL)
if (upcb_Rx_DLT != NULL)
{
/* 配置本地端口 */
upcb->local_port = UDP_LOCAL_PORT;
//upcb_DLT->local_port = UDP_DLT_LOCAL_PORT;
/* 配置服务器IP和端口 */
//upcb_DLT->so_options |= SOF_BROADCAST;
//err = udp_connect(upcb_DLT, &serverIP, UDP_REMOTE_DLT_PORT);
err = udp_bind(upcb_Rx_DLT, IP_ADDR_ANY, UDP_DLT_LOCAL_PORT);
if (err == ERR_OK)
{
/* 注册接收回调函数 */
/* 注册接收回调函数 */
udp_recv(upcb_Rx_DLT, udp_receive_callback, NULL);
}
else
{
udp_remove(upcb_Rx_DLT);
}
}
upcb_Rx_From_Android = udp_new();
if (upcb_Rx_From_Android != NULL)
{
/* 配置本地端口 */
//upcb_DLT->local_port = UDP_DLT_LOCAL_PORT;
/* 配置服务器IP和端口 */
err= udp_connect(upcb, &serverIP, UDP_REMOTE_PORT);
// err = udp_bind(upcb, IP_ADDR_ANY, UDP_LOCAL_PORT);
upcb->so_options |= SOF_BROADCAST;
//upcb_DLT->so_options |= SOF_BROADCAST;
//err = udp_connect(upcb_DLT, &serverIP, UDP_REMOTE_DLT_PORT);
err = udp_bind(upcb_Rx_From_Android, IP_ADDR_ANY,
UDP_CMD_LOCAL_Android_Listen_PORT);
if (err == ERR_OK)
{
/* 注册接收回调函数 */
udp_recv(upcb, udp_receive_callback, NULL);
/* 注册接收回调函数 */
udp_recv(upcb_Rx_From_Android, udp_receive_callback, NULL);
}
else
{
udp_remove(upcb_Rx_From_Android);
/* 发送udp数据 */
//printf("udp client connected\r\n");
} else
{
udp_remove(upcb);
//printf("can not connect udp pcb\r\n");
}
}
// upcb_send = udp_new();
//
// if (upcb_send != NULL)
// {
// /* 配置本地端口 */
// upcb_send->local_port = UDP_Send_LOCAL_PORT;
//
// /* 配置服务器IP和端口 */
// upcb_send->so_options |= SOF_BROADCAST;
// err = udp_bind(upcb_send, IP_ADDR_ANY, UDP_Send_LOCAL_PORT);
// if (err == ERR_OK)
// {
//
// } else
// {
// udp_remove(upcb_send);
//
// }
// }
}
}
upcb_Rx_Cmd = udp_new();
if (upcb_Rx_Cmd != NULL)
{
/* 配置本地端口 */
//upcb_Cmd->local_port = UDP_CMD_LOCAL_PORT;
/* 配置服务器IP和端口 */
//upcb_Cmd->so_options |= SOF_BROADCAST;
//err = udp_connect(upcb_Cmd, &serverIP, UDP_REMOTE_CMD_PORT);
err = udp_bind(upcb_Rx_Cmd, IP_ADDR_ANY, UDP_CMD_LOCAL_PORT);
if (err == ERR_OK)
{
/* 注册接收回调函数 */
udp_recv(upcb_Rx_Cmd, udp_receive_callback, NULL);
}
else
{
udp_remove(upcb_Rx_Cmd);
}
}
upcb_Tx_Cmd = udp_new();
if (upcb_Tx_Cmd != NULL)
{
/* 配置本地端口 */
upcb_Tx_Cmd->local_port = UDP_CMD_Send_LOCAL_PORT;
/* 配置服务器IP和端口 */
//upcb_Cmd->so_options |= SOF_BROADCAST;
err = udp_connect(upcb_Tx_Cmd, &serverIP, UDP_REMOTE_CMD_PORT);
if (err == ERR_OK)
{
/* 注册接收回调函数 */
//udp_recv(upcb_Tx_Cmd, udp_receive_callback, NULL);
}
else
{
udp_remove(upcb_Tx_Cmd);
}
}
upcb_Tx_DLT = udp_new();
if (upcb_Tx_DLT != NULL)
{
/* 配置本地端口 */
upcb_Tx_Cmd->local_port = UDP_DLT_Send_LOCAL_PORT;
/* 配置服务器IP和端口 */
//upcb_Cmd->so_options |= SOF_BROADCAST;
err = udp_connect(upcb_Tx_DLT, &serverIP, UDP_REMOTE_DLT_PORT);
if (err == ERR_OK)
{
/* 注册接收回调函数 */
//udp_recv(upcb_Tx_Cmd, udp_receive_callback, NULL);
}
else
{
udp_remove(upcb_Tx_DLT);
}
}
upcb_Tx_GV = udp_new();
if (upcb_Tx_GV != NULL)
{
/* 配置本地端口 */
upcb_Tx_Cmd->local_port = UDP_GV_Send_LOCAL_PORT;
/* 配置服务器IP和端口 */
//upcb_Cmd->so_options |= SOF_BROADCAST;
err = udp_connect(upcb_Tx_GV, &serverIP, UDP_REMOTE_GV_PORT);
if (err == ERR_OK)
{
/* 注册接收回调函数 */
//udp_recv(upcb_Tx_Cmd, udp_receive_callback, NULL);
}
else
{
udp_remove(upcb_Tx_GV);
}
}
upcb_Tx_Android = udp_new();
if (upcb_Tx_Android != NULL)
{
/* 配置本地端口 */
upcb_Tx_Android->local_port = UDP_Android_Send_LOCAL_PORT;
/* 配置服务器IP和端口 */
//upcb_Cmd->so_options |= SOF_BROADCAST;
err = udp_connect(upcb_Tx_Android, &Android_ServerIP,
UDP_REMOTE_Android_PORT);
if (err == ERR_OK)
{
/* 注册接收回调函数 */
//udp_recv(upcb_Tx_Cmd, udp_receive_callback, NULL);
}
else
{
udp_remove(upcb_Tx_Android);
}
}
}
int counter_index = 0;
int iv_counter_index = 0;
void UDP_GV_Dispatch()
{
counter_index++;
if (counter_index <= 50) return;
if (is_udp_GV_update_loop_enalbed == 0) return;
counter_index = 0;
pb_ostream_t GV_o_stream =
{ 0 };
char buf[1024];
GV_o_stream = pb_ostream_from_buffer(&buf[2], sizeof(buf));
pb_encode(&GV_o_stream, GV_struct_define_fields, &GV);
buf[1] = 0xfe;
buf[0] = 0xfe;
//memcpy(&wh_LTE_7S0_Handler->Tx_Buf[2], buf, GV_o_stream.bytes_written);
udp_cmd_send_GV(buf, GV_o_stream.bytes_written + 2);
}
//现在是每一百ms执行一次
void UDP_IV_Dispatch()
{
iv_counter_index++;
if (iv_counter_index <= 50) return;
iv_counter_index = 0;
char Tx_Buf[1024];
pb_ostream_t IV_o_stream = pb_ostream_from_buffer(&Tx_Buf[2],
sizeof(Tx_Buf) - 2);
pb_encode(&IV_o_stream, IV_struct_define_fields, &IV);
Tx_Buf[0] = 0x55;
Tx_Buf[1] = 0x55;
int32_t TxCount = IV_o_stream.bytes_written + 4;
uint16_t crc = MB_CRC16(Tx_Buf, IV_o_stream.bytes_written + 2);
Tx_Buf[IV_o_stream.bytes_written + 2] = (crc >> 8) & 0xff;
Tx_Buf[IV_o_stream.bytes_written + 3] = crc & 0xff;
udp_send_by_pcb(upcb_Tx_Android, Tx_Buf, IV_o_stream.bytes_written + 4);
}

4
BASE/Src/BSP/bsp_client_setting.c

@ -36,7 +36,7 @@ void client_setting_intialize(struct UARTHandler *Handler)
void UpdateIV() //往安卓发的
{
return;
// 若485线存在,能够读写数据,则不进行解析,直接return;
if (Get_BIT(SystemErrorCode, ComError_Android_485) == CONNECTED)
{
@ -66,7 +66,7 @@ void UpdateIV() //往安卓发的
void decode_received_data_from_client(uint8_t *buffer, uint16_t length)
{
return;
// 若485线存在,能够读写数据,则不进行解析,直接return;
if (Get_BIT(SystemErrorCode, ComError_Android_485) == CONNECTED)
{

120
BASE/Src/MSP/msp_485_android.c

@ -4,26 +4,25 @@
* Created on: 2025121
* Author: akeguo
*/
#include "robot_state.h"
#include "msp_485_android.h"
#include "msp_U7.h"
#include "bsp_Error_Detect.h"
void decode_android_485(uint8_t *buffer, uint16_t length);
void decode_android_PV(uint8_t *buffer, uint16_t length);
void android_485_loop(); //inqure data from the, in fact this is a modbus 03 function;
struct UARTHandler *android_handler;
DispacherController *androidr_dispacherController;
int android_slave_id = 0x40;
int time_to_adapt = 100;
int8_t android_slave_iv_start_holiding_register = 100;
int16_t android_slave_iv_holiding_register_num = 0; //这个数据要随时改变
//最多读取多少个字节
int16_t read_android_holidng_register_count = 19 + 1
+ PV_struct_define_size / 2; //16个subs通道 1个PV数据长度,
int16_t read_android_holidng_register_count = 20;
//+ PV_struct_define_size / 2; //16个subs通道 1个PV数据长度,
uint16_t Decoded_Android_HoldingReg_Value[100]; //用来对Android的Sbus /PV /IV 的操作
uint16_t send_pv_android_holdingReg_Value[100]; // /PV /IV 的操作
void android_485_intialize(struct UARTHandler *Handler)
{
android_handler = Handler;
@ -53,27 +52,14 @@ void android_485_loop()
MB_ReadHoldingReg(&android_handler->Tx_Buf, &android_handler->TxCount,
android_slave_id, 0, read_android_holidng_register_count);
android_handler->AddSendList(android_handler, android_handler->Tx_Buf,
android_handler->TxCount, 120, decode_android_485);
//设定安卓数据
pb_ostream_t IV_o_stream = pb_ostream_from_buffer(
&send_pv_android_holdingReg_Value[1],
sizeof(send_pv_android_holdingReg_Value) - 1);
pb_encode(&IV_o_stream, IV_struct_define_fields, &IV);
android_slave_iv_holiding_register_num = (IV_o_stream.bytes_written + 1) / 2
+ 1;
send_pv_android_holdingReg_Value[0] = SWAP_ENDIAN_16(
IV_o_stream.bytes_written);
MB_WriteNumHoldingReg(&android_handler->Tx_Buf, &android_handler->TxCount,
android_slave_id, android_slave_iv_start_holiding_register,
android_slave_iv_holiding_register_num,
send_pv_android_holdingReg_Value);
android_handler->AddSendList(android_handler, android_handler->Tx_Buf,
android_handler->TxCount, 120, NULL);
android_handler->TxCount, time_to_adapt, decode_android_485);
}
int PMK32Index = 0;
int received_android_counter = 0;
int received_counter_max = 10/2;// 每次读取多少次遥控器然后读取PV/写IV
int32_t *p_mk32_pointer;
//读取 的寄存器
void decode_android_485(uint8_t *buffer, uint16_t length)
@ -91,8 +77,7 @@ void decode_android_485(uint8_t *buffer, uint16_t length)
{
p_mk32_pointer = (int32_t*) P_U7;
//Sbus 设定
for (int PMK32Index = 0; PMK32Index < 19; PMK32Index++)
for (int PMK32Index = 0; PMK32Index < 18; PMK32Index++)
{
//此处必须加类型转换
*p_mk32_pointer =
@ -100,28 +85,85 @@ void decode_android_485(uint8_t *buffer, uint16_t length)
p_mk32_pointer++;
}
received_android_counter++;
//读取遥控器
MB_ReadHoldingReg(&android_handler->Tx_Buf, &android_handler->TxCount, android_slave_id, 0, read_android_holidng_register_count);
android_handler->AddSendList(android_handler, android_handler->Tx_Buf, android_handler->TxCount, time_to_adapt,
decode_android_485);
if (received_android_counter % received_counter_max != 0) return;
switch (received_android_counter / received_counter_max % 2)
{
case 0:
{
//设定安卓数据
pb_ostream_t IV_o_stream = pb_ostream_from_buffer(
&send_pv_android_holdingReg_Value[1],
sizeof(send_pv_android_holdingReg_Value) - 1);
pb_encode(&IV_o_stream, IV_struct_define_fields, &IV);
android_slave_iv_holiding_register_num = (IV_o_stream.bytes_written + 1) / 2
+ 1;
send_pv_android_holdingReg_Value[0] = SWAP_ENDIAN_16(
IV_o_stream.bytes_written);
MB_WriteNumHoldingReg(&android_handler->Tx_Buf, &android_handler->TxCount,
android_slave_id, android_slave_iv_start_holiding_register,
android_slave_iv_holiding_register_num,
send_pv_android_holdingReg_Value);
android_handler->AddSendList(android_handler, android_handler->Tx_Buf,
android_handler->TxCount, 150, NULL);
received_android_counter = 0;
break;
}
case 1:
{ //读取安卓数据 03 PV
MB_ReadHoldingReg(&android_handler->Tx_Buf, &android_handler->TxCount, android_slave_id, 19,
(Decoded_Android_HoldingReg_Value[18] + 1) / 2);
android_handler->AddSendList(android_handler, android_handler->Tx_Buf, android_handler->TxCount,
time_to_adapt, decode_android_PV);
break;
}
}
} else
{
LOGFF(DL_ERROR, "Android_485 decoding failed");
}
}
/*****/
void decode_android_PV(uint8_t *buffer, uint16_t length)
{
// uint8_t data1[1000];
// memcpy(data1, buffer, length);
if (length <= 5)
{
return;
}
int decoded_result = MB_Decode_HoldingRegs(buffer, length, (Decoded_Android_HoldingReg_Value[18] + 1) / 2,
&Decoded_Android_HoldingReg_Value[19]);
if (decoded_result == 1)
{
//PV解析
pb_istream_t i_pv_stream =
{ 0 };
i_pv_stream = pb_istream_from_buffer(
&Decoded_Android_HoldingReg_Value[20],
Decoded_Android_HoldingReg_Value[19]);
pb_decode(&i_pv_stream, PV_struct_define_fields, &_decoded_PV_temp);
// if (decoded_PV.TimeStamp <= _decoded_PV_temp.TimeStamp)
// {
// decoded_PV = _decoded_PV_temp;
// }
i_pv_stream = pb_istream_from_buffer(&Decoded_Android_HoldingReg_Value[19],
Decoded_Android_HoldingReg_Value[18]);
int checkreturn = pb_decode(&i_pv_stream, PV_struct_define_fields, &_decoded_PV_temp);
if (checkreturn == 1)
{
if (GV.PV.TimeStamp <= _decoded_PV_temp.TimeStamp)
{
GV.PV = _decoded_PV_temp;
}
HardWareErrorController->Set_PCOMHardWare(HardWareErrorController,
"Android_485", 1);
}
} else
HardWareErrorController->Set_PCOMHardWare(HardWareErrorController, "Android_485", 1);
}
else
{
LOGFF(DL_ERROR, "Android_485 decoding failed");
}

4
BASE/Src/MSP/msp_TI5MOTOR.c

@ -28,11 +28,13 @@ CSP tempCSP;
int32_t Function_code = 0;
uint8_t ID_A_T;
uint8_t data1[20];
void DecodeTi5MotorCAN(uint32_t canID, uint8_t *buffer, uint32_t length)
{
ID_A_T = canID;
memcpy(data1, buffer, length);
if (ID_A_T >= DF_MSP_Ti5Motor_StartID
&& ID_A_T < DF_MSP_Ti5Motor_StartID + 3)
{

1
BASE/Src/MSP/msp_U7.c

@ -16,6 +16,7 @@ SP_MSP_U7_Button *P_U7;
struct UARTHandler *U7_Sbus_Controller;
void decode_U7Data(uint8_t *buffer, uint16_t length)
{
return;
if (Get_BIT(SystemErrorCode, ComError_Android_485) == CONNECTED)
{
return;

2
BHBF_NewFiveWheel3.0.ioc

@ -858,7 +858,7 @@ UART5.IPParameters=BaudRate,WordLength,Parity,OverrunDisableParam,DMADisableonRx
UART5.OverrunDisableParam=UART_ADVFEATURE_OVERRUN_DISABLE
UART5.Parity=PARITY_EVEN
UART5.WordLength=WORDLENGTH_9B
UART7.BaudRate=38400
UART7.BaudRate=115200
UART7.DMADisableonRxErrorParam=UART_ADVFEATURE_DMA_DISABLEONRXERROR
UART7.IPParameters=OverrunDisableParam,BaudRate,DMADisableonRxErrorParam
UART7.OverrunDisableParam=UART_ADVFEATURE_OVERRUN_DISABLE

2
Core/Protobuf/PSource/bsp_GV.pb.h

@ -107,7 +107,7 @@ extern const pb_msgdesc_t GV_struct_define_msg;
/* Maximum encoded size of messages (where known) */
#define BSP_GV_PB_H_MAX_SIZE GV_struct_define_size
#define GV_struct_define_size 963
#define GV_struct_define_size 951
#ifdef __cplusplus
} /* extern "C" */

21
Core/Protobuf/PSource/msp_U7.pb.h

@ -26,10 +26,9 @@ typedef struct _SP_MSP_U7_Button {
int32_t M2;
int32_t M6;
int32_t S3;
int32_t IsOnline;
int32_t M4;
int32_t S4;
int32_t S5;
int32_t S6;
int32_t IsOnline;
} SP_MSP_U7_Button;
@ -38,8 +37,8 @@ extern "C" {
#endif
/* Initializer values for message structs */
#define SP_MSP_U7_Button_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
#define SP_MSP_U7_Button_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
#define SP_MSP_U7_Button_init_default {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
#define SP_MSP_U7_Button_init_zero {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
/* Field tags (for use in manual encoding/decoding) */
#define SP_MSP_U7_Button_RxIndex_tag 1
@ -57,10 +56,9 @@ extern "C" {
#define SP_MSP_U7_Button_M2_tag 13
#define SP_MSP_U7_Button_M6_tag 14
#define SP_MSP_U7_Button_S3_tag 15
#define SP_MSP_U7_Button_IsOnline_tag 16
#define SP_MSP_U7_Button_M4_tag 16
#define SP_MSP_U7_Button_S4_tag 17
#define SP_MSP_U7_Button_S5_tag 18
#define SP_MSP_U7_Button_S6_tag 19
#define SP_MSP_U7_Button_IsOnline_tag 18
/* Struct field encoding specification for nanopb */
#define SP_MSP_U7_Button_FIELDLIST(X, a) \
@ -79,10 +77,9 @@ X(a, STATIC, SINGULAR, INT32, RU_Single, 12) \
X(a, STATIC, SINGULAR, INT32, M2, 13) \
X(a, STATIC, SINGULAR, INT32, M6, 14) \
X(a, STATIC, SINGULAR, INT32, S3, 15) \
X(a, STATIC, SINGULAR, INT32, IsOnline, 16) \
X(a, STATIC, SINGULAR, INT32, M4, 16) \
X(a, STATIC, SINGULAR, INT32, S4, 17) \
X(a, STATIC, SINGULAR, INT32, S5, 18) \
X(a, STATIC, SINGULAR, INT32, S6, 19)
X(a, STATIC, SINGULAR, INT32, IsOnline, 18)
#define SP_MSP_U7_Button_CALLBACK NULL
#define SP_MSP_U7_Button_DEFAULT NULL
@ -93,7 +90,7 @@ extern const pb_msgdesc_t SP_MSP_U7_Button_msg;
/* Maximum encoded size of messages (where known) */
#define MSP_U7_PB_H_MAX_SIZE SP_MSP_U7_Button_size
#define SP_MSP_U7_Button_size 213
#define SP_MSP_U7_Button_size 201
#ifdef __cplusplus
} /* extern "C" */

5
Core/Protobuf/Proto/msp_U7.proto

@ -16,8 +16,7 @@ message SP_MSP_U7_Button {
int32 M2 = 13;
int32 M6 = 14;
int32 S3 = 15;
int32 IsOnline= 16;
int32 M4 = 16;
int32 S4 = 17;
int32 S5= 18;
int32 S6= 19;
int32 IsOnline= 18;
}

4
Core/Src/FSM.c

@ -669,6 +669,10 @@ void Emergency()
void GF_Dispatch() //2ms调用一次 给车体速度等赋值
{
// 如果处于复位模式,直接停车,不再执行运动逻辑
if (system_mode == SYSTEM_RESET)
{

14
Core/Src/main.c

@ -59,7 +59,7 @@ int can2_DispacherPeriod = 20;
#define RS485_1_WaitTime 8
#define RS485_2_WaitTime 8
#define RS485_3_WaitTime 8
#define RS485_4_WaitTime 8
#define RS485_4_WaitTime 10
#define LTE_7S0_Serial_WaitTime 8
#define InterCall_DEBUG_WaitTime 8
#define E28_SBUS_WaitTime 6
@ -156,12 +156,12 @@ int main(void)
/* USER CODE BEGIN 2 */
SystemTimer_Intialize(); //加数数定时器
GF_BSP_GPIO_SetIO(0, 0); //0�?????????????? 1�??????????????
GF_BSP_GPIO_SetIO(0, 0); //0�??????????????? 1�???????????????
GF_BSP_GPIO_SetIO(1, 1);
HAL_Delay(5000); ////////////////////////////延时5s
DLT_LOG_ENABLE_LEVEL = 0; //7 send all information 0 send nothing
Error_Detect_Intialzie(1000); //every 1 seconds
Error_Detect_Intialzie(2000); //every 1 seconds
GF_Robot_Init();
GV.Move_Speed = 3000; //186.9 * m/min
// udp_client_init();
@ -258,10 +258,10 @@ void CV_GV_Init()
CV.SwingMoveSpeedBase = 1000;
CV.TiltMoveSpeedBase = 1000;
Motor[1] = &GV.LeftFrontMotor; //Motor[1]指向GV的电机参�??????????????
Motor[1] = &GV.LeftFrontMotor; //Motor[1]指向GV的电机参�???????????????
Motor[2] = &GV.RightFrontMotor;
// Motor[2] = &GV.LeftFrontMotor; //Motor[1]指向GV的电机参�??????????????
// Motor[2] = &GV.LeftFrontMotor; //Motor[1]指向GV的电机参�???????????????
// Motor[1] = &GV.RightFrontMotor;
RobotSpeed = &GV.Move_Speed; //RobotSpeed指向GV的移动车体�?�度 这是整体车�?? 不是单个轮的
@ -336,11 +336,11 @@ void GF_Robot_Init()
TankWashing_Motor_Controller_intialize(&FD_CAN_1_Handler);
Fsm_Init(); //把遥控器指令绑定定时�??????????????
Fsm_Init(); //把遥控器指令绑定定时�???????????????
uint8_t _state = 1;
_state = _state & GF_BSP_TIMER_Init(); //定时器最后启�???????????????????
_state = _state & GF_BSP_TIMER_Init(); //定时器最后启�????????????????????
}
/* USER CODE END 4 */

7
Core/Src/motors.c

@ -42,9 +42,9 @@ void MotorCommandsLoop()
{
for (int i = 1; i < 3; i++)
{
Motor_ClearFault(i, FiveWheel_Motor_Controller, 4);
Motor_GetFaultState(i, FiveWheel_Motor_Controller, 4);
GetCSPByCommand(i, FiveWheel_Motor_Controller, 4);
// Motor_ClearFault(i, FiveWheel_Motor_Controller, 4);
// Motor_GetFaultState(i, FiveWheel_Motor_Controller, 4);
// GetCSPByCommand(i, FiveWheel_Motor_Controller, 4);
}
for (int i = 1; i < 3; i++)
@ -54,6 +54,7 @@ void MotorCommandsLoop()
FiveWheel_Motor_Controller, 4);
ReadPosition(i, FiveWheel_Motor_Controller, 4);
Motor_GetFaultState(i, FiveWheel_Motor_Controller, 4);
GetCSPByCommand(i, FiveWheel_Motor_Controller, 4);
}
}

2
Core/Src/usart.c

@ -188,7 +188,7 @@ void MX_UART7_Init(void)
/* USER CODE END UART7_Init 1 */
huart7.Instance = UART7;
huart7.Init.BaudRate = 38400;
huart7.Init.BaudRate = 115200;
huart7.Init.WordLength = UART_WORDLENGTH_8B;
huart7.Init.StopBits = UART_STOPBITS_1;
huart7.Init.Parity = UART_PARITY_NONE;

3
readme.txt

@ -1 +1,2 @@
BHBF_NewFiveWheel3.0(2510)
BHBF_NewFiveWheel3.0(02042026)
优化为拉毛的有线程序

Loading…
Cancel
Save