Browse Source

修改数据格式正负数输入问题

master
parent
commit
a7f75d23d5
  1. 2
      Core/Inc/modbus.h
  2. 11
      Core/Src/app.c
  3. 75
      Core/Src/modbus.c
  4. BIN
      Debug/Core/Src/app.o
  5. 10
      Debug/Core/Src/app.su
  6. BIN
      Debug/Core/Src/main.o
  7. BIN
      Debug/Core/Src/modbus.o
  8. 22
      Debug/Core/Src/modbus.su
  9. BIN
      Debug/g031_JIECANG_JC35W8.elf
  10. 26309
      Debug/g031_JIECANG_JC35W8.list
  11. 856
      Debug/g031_JIECANG_JC35W8.map
  12. 80
      g031_JIECANG_JC35W8.launch

2
Core/Inc/modbus.h

@ -15,7 +15,7 @@
#define MODBUS_FUNCTION_CODE_06 0x06
#define MODBUS_FUNCTION_CODE_10 0x10 // 写多个寄存器功能码
#define MODBUS_BUFFER_SIZE 256
#define MODBUS_TIMEOUT_MS 5
#define MODBUS_TIMEOUT_MS 20
#define MODBUS_CRC_OFF 0 //==1关闭CRC校验
/* 定义寄存器相关参数 */
#define REGISTER_START_ADDRESS 0x0000

11
Core/Src/app.c

@ -29,7 +29,7 @@
#define Encoder_Max 4200
static volatile uint8_t adcConversionDone = 0;
static uint16_t lastRegister5 = 0;
static int16_t lastRegister5 = 0;
static void App_UpdateMotor(void);
static void App_SetCurrentLimit(uint16_t duty);
@ -120,14 +120,15 @@ static void App_UpdateMotor(void)
if (up != 0)
{
/* 正转:IO_1 高,IO_2 低 */
HAL_GPIO_WritePin(IO_1_GPIO_Port, IO_1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(IO_2_GPIO_Port, IO_2_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(IO_1_GPIO_Port, IO_1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(IO_2_GPIO_Port, IO_2_Pin, GPIO_PIN_SET);
}
else if (down != 0)
{
HAL_GPIO_WritePin(IO_1_GPIO_Port, IO_1_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(IO_2_GPIO_Port, IO_2_Pin, GPIO_PIN_RESET);
/* 反转:IO_1 低,IO_2 高 */
HAL_GPIO_WritePin(IO_1_GPIO_Port, IO_1_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(IO_2_GPIO_Port, IO_2_Pin, GPIO_PIN_SET);
}
else
{

75
Core/Src/modbus.c

@ -29,6 +29,8 @@ uint16_t modbusBufferIndex = 0;
uint32_t lastByteTime = 0;
bool messageComplete = false;
uint8_t response[256];
uint8_t rxByte; // UART 单字节接收暂存变量
/* 函数声明 */
void Modbus_Init(void);
@ -43,13 +45,20 @@ uint16_t CalculateCRC(uint8_t *data, uint8_t length);
/* 初始化函数 */
void Modbus_Init(void)
{
/* RS485 方向控制引脚置为接收状态 */
HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, GPIO_PIN_RESET);
/* 启动串口中断接收 */
modbusBufferIndex = 0;
HAL_UART_Receive_IT(&huart2, (uint8_t *)&modbusBuffer[modbusBufferIndex], 1);
HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, GPIO_PIN_RESET); // 设置 RS485 为接收模式
modbusBufferIndex = 0; // 清空接收索引
messageComplete = false; // 清除帧完成标志
HAL_UART_Receive_IT(&huart2, &rxByte, 1); // 接收到固定变量,而不是直接接收进缓冲区
}
//void Modbus_Init(void)
//{
// /* RS485 方向控制引脚置为接收状态 */
// HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, GPIO_PIN_RESET);
//
// /* 启动串口中断接收 */
// modbusBufferIndex = 0;
// HAL_UART_Receive_IT(&huart2, (uint8_t *)&modbusBuffer[modbusBufferIndex], 1);
//}
/* Modbus处理函数 - 应在主循环中调用 */
void Modbus_Process(void)
@ -138,6 +147,7 @@ void Modbus_Process(void)
/* 重置缓冲区 */
modbusBufferIndex = 0;
messageComplete = false;
}
/* 处理功能码03 */
@ -225,7 +235,7 @@ void Modbus_HandleFunction10(uint16_t startAddress, uint16_t registerCount, uint
for (uint16_t i = 0; i < registerCount; i++)
{
uint16_t regIndex = (startAddress - REGISTER_START_ADDRESS) + i;
uint16_t value = (uint16_t)((data[i * 2] << 8) | data[i * 2 + 1]);
int16_t value = (int16_t)((data[i * 2] << 8) | data[i * 2 + 1]);
/* 只有可写寄存器才更新值 */
if (registerWritable[regIndex] == 1)
@ -305,31 +315,50 @@ uint16_t CalculateCRC(uint8_t *data, uint8_t length)
/* UART接收中断回调函数 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if (huart != &huart2)
{
if (huart != &huart2) // 忽略其他串口
return;
}
lastByteTime = HAL_GetTick();
lastByteTime = HAL_GetTick(); // 更新最近一次接收时间
if (modbusBufferIndex < MODBUS_BUFFER_SIZE)
if (modbusBufferIndex < MODBUS_BUFFER_SIZE) // 检查缓冲区是否还有空间
{
/* HAL 已经将接收到的字节写入 modbusBuffer[modbusBufferIndex],
此处只需向后移动索引。 */
modbusBufferIndex++;
}
if (modbusBufferIndex < MODBUS_BUFFER_SIZE)
{
HAL_UART_Receive_IT(&huart2, (uint8_t *)&modbusBuffer[modbusBufferIndex], 1);
modbusBuffer[modbusBufferIndex++] = rxByte; // 将收到的字节复制到正确的位置
}
else
{
/* 缓冲区满,丢弃并等待下一帧 */
modbusBufferIndex = 0;
HAL_UART_Receive_IT(&huart2, (uint8_t *)&modbusBuffer[modbusBufferIndex], 1);
modbusBufferIndex = 0; // 缓冲区溢出时丢弃当前帧
messageComplete = false; // 清除当前帧状态
}
HAL_UART_Receive_IT(&huart2, &rxByte, 1); // 继续接收下一个字节
}
//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
//{
// if (huart != &huart2)
// {
// return;
// }
//
// lastByteTime = HAL_GetTick();
//
// if (modbusBufferIndex < MODBUS_BUFFER_SIZE)
// {
// /* HAL 已经将接收到的字节写入 modbusBuffer[modbusBufferIndex],
// 此处只需向后移动索引。 */
// modbusBufferIndex++;
// }
//
// if (modbusBufferIndex < MODBUS_BUFFER_SIZE)
// {
// HAL_UART_Receive_IT(&huart2, (uint8_t *)&modbusBuffer[modbusBufferIndex], 1);
// }
// else
// {
// /* 缓冲区满,丢弃并等待下一帧 */
// modbusBufferIndex = 0;
// HAL_UART_Receive_IT(&huart2, (uint8_t *)&modbusBuffer[modbusBufferIndex], 1);
// }
//}
/* UART发送完成回调:切回RS485接收方向 */
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)

BIN
Debug/Core/Src/app.o

Binary file not shown.

10
Debug/Core/Src/app.su

@ -1,8 +1,8 @@
../Core/Src/app.c:40:6:App_Init 8 static
../Core/Src/app.c:69:6:App_Process 8 static
../Core/Src/app.c:88:13:App_UpdateMotor 32 static
../Core/Src/app.c:140:13:App_SetCurrentLimit 16 static
../Core/Src/app.c:150:13:App_UpdateEncoderRegister 16 static
../Core/Src/app.c:157:13:App_ProcessZeroCommand 8 static
../Core/Src/app.c:166:13:App_UpdateLed 32 static
../Core/Src/app.c:206:6:HAL_ADC_ConvCpltCallback 32 static
../Core/Src/app.c:141:13:App_SetCurrentLimit 16 static
../Core/Src/app.c:151:13:App_UpdateEncoderRegister 16 static
../Core/Src/app.c:158:13:App_ProcessZeroCommand 8 static
../Core/Src/app.c:167:13:App_UpdateLed 32 static
../Core/Src/app.c:207:6:HAL_ADC_ConvCpltCallback 32 static

BIN
Debug/Core/Src/main.o

Binary file not shown.

BIN
Debug/Core/Src/modbus.o

Binary file not shown.

22
Debug/Core/Src/modbus.su

@ -1,11 +1,11 @@
../Core/Src/modbus.c:44:6:Modbus_Init 8 static
../Core/Src/modbus.c:55:6:Modbus_Process 32 static
../Core/Src/modbus.c:144:6:Modbus_HandleFunction03 48 static
../Core/Src/modbus.c:176:6:Modbus_HandleFunction06 40 static
../Core/Src/modbus.c:214:6:Modbus_HandleFunction10 48 static
../Core/Src/modbus.c:256:6:Modbus_SendExceptionResponse 32 static
../Core/Src/modbus.c:270:6:Modbus_SendResponse 16 static
../Core/Src/modbus.c:280:10:CalculateCRC 24 static
../Core/Src/modbus.c:306:6:HAL_UART_RxCpltCallback 16 static
../Core/Src/modbus.c:335:6:HAL_UART_TxCpltCallback 16 static
../Core/Src/modbus.c:344:6:HAL_UART_ErrorCallback 16 static
../Core/Src/modbus.c:46:6:Modbus_Init 8 static
../Core/Src/modbus.c:64:6:Modbus_Process 32 static
../Core/Src/modbus.c:154:6:Modbus_HandleFunction03 48 static
../Core/Src/modbus.c:186:6:Modbus_HandleFunction06 40 static
../Core/Src/modbus.c:224:6:Modbus_HandleFunction10 48 static
../Core/Src/modbus.c:266:6:Modbus_SendExceptionResponse 32 static
../Core/Src/modbus.c:280:6:Modbus_SendResponse 16 static
../Core/Src/modbus.c:290:10:CalculateCRC 24 static
../Core/Src/modbus.c:316:6:HAL_UART_RxCpltCallback 16 static
../Core/Src/modbus.c:364:6:HAL_UART_TxCpltCallback 16 static
../Core/Src/modbus.c:373:6:HAL_UART_ErrorCallback 16 static

BIN
Debug/g031_JIECANG_JC35W8.elf

Binary file not shown.

26309
Debug/g031_JIECANG_JC35W8.list

File diff suppressed because it is too large

856
Debug/g031_JIECANG_JC35W8.map

File diff suppressed because it is too large

80
g031_JIECANG_JC35W8.launch

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="com.st.stm32cube.ide.mcu.debug.launch.launchConfigurationType">
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.access_port_id" value="0"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.enable_live_expr" value="true"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.enable_swv" value="false"/>
<intAttribute key="com.st.stm32cube.ide.mcu.debug.launch.formatVersion" value="2"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.ip_address_local" value="localhost"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.limit_swo_clock.enabled" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.limit_swo_clock.value" value=""/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.loadList" value="{&quot;fItems&quot;:[{&quot;fIsFromMainTab&quot;:true,&quot;fPath&quot;:&quot;Debug/g031_JIECANG_JC35W8.elf&quot;,&quot;fProjectName&quot;:&quot;g031_JIECANG_JC35W8&quot;,&quot;fPerformBuild&quot;:true,&quot;fDownload&quot;:true,&quot;fLoadSymbols&quot;:true}]}"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.override_start_address_mode" value="default"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.remoteCommand" value="target remote"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.startServer" value="true"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.startuptab.exception.divby0" value="true"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.startuptab.exception.unaligned" value="false"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.startuptab.haltonexception" value="true"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.swd_mode" value="true"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.swv_port" value="61235"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.swv_trace_hclk" value="16000000"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.useRemoteTarget" value="true"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.launch.vector_table" value=""/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.launch.verify_flash_download" value="true"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.cti_allow_halt" value="false"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.cti_signal_halt" value="false"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_external_loader" value="false"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_logging" value="false"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_max_halt_delay" value="false"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.enable_shared_stlink" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.external_loader" value=""/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.external_loader_init" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.frequency" value="0"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.halt_all_on_reset" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.log_file" value="D:\cubeworkSpaceCombine\g031_JIECANG_JC35W8\Debug\st-link_gdbserver_log.txt"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.low_power_debug" value="enable"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.max_halt_delay" value="2"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.reset_strategy" value="connect_under_reset"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.stlink_check_serial_number" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.stlink_txt_serial_number" value=""/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlink.watchdog_config" value="none"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkenable_rtos" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.debug.stlinkrestart_configurations" value="{&quot;fVersion&quot;:1,&quot;fItems&quot;:[{&quot;fDisplayName&quot;:&quot;Reset&quot;,&quot;fIsSuppressible&quot;:false,&quot;fResetAttribute&quot;:&quot;Software system reset&quot;,&quot;fResetStrategies&quot;:[{&quot;fDisplayName&quot;:&quot;Software system reset&quot;,&quot;fLaunchAttribute&quot;:&quot;system_reset&quot;,&quot;fGdbCommands&quot;:[&quot;monitor reset\r\n&quot;],&quot;fCmdOptions&quot;:[&quot;-g&quot;]},{&quot;fDisplayName&quot;:&quot;Hardware reset&quot;,&quot;fLaunchAttribute&quot;:&quot;hardware_reset&quot;,&quot;fGdbCommands&quot;:[&quot;monitor reset hardware\r\n&quot;],&quot;fCmdOptions&quot;:[&quot;-g&quot;]},{&quot;fDisplayName&quot;:&quot;Core reset&quot;,&quot;fLaunchAttribute&quot;:&quot;core_reset&quot;,&quot;fGdbCommands&quot;:[&quot;monitor reset core\r\n&quot;],&quot;fCmdOptions&quot;:[&quot;-g&quot;]},{&quot;fDisplayName&quot;:&quot;None&quot;,&quot;fLaunchAttribute&quot;:&quot;no_reset&quot;,&quot;fGdbCommands&quot;:[],&quot;fCmdOptions&quot;:[&quot;-g&quot;]}],&quot;fGdbCommandGroup&quot;:{&quot;name&quot;:&quot;Additional commands&quot;,&quot;commands&quot;:[]},&quot;fStartApplication&quot;:true}]}"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.enableRtosProxy" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyCustomProperties" value=""/>
<stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriver" value="threadx"/>
<booleanAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriverAuto" value="false"/>
<stringAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyDriverPort" value="cortex_m0"/>
<intAttribute key="com.st.stm32cube.ide.mcu.rtosproxy.rtosProxyPort" value="60000"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doHalt" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.doReset" value="false"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.initCommands" value=""/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDeviceId" value="com.st.stm32cube.ide.mcu.debug.stlink"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/>
<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="61234"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.runCommands" value=""/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="true"/>
<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/>
<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/>
<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.NON_STOP" value="false"/>
<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/>
<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/>
<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_START_MODE" value="remote"/>
<booleanAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_STOP_AT_MAIN_SYMBOL" value="main"/>
<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="Debug/g031_JIECANG_JC35W8.elf"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="g031_JIECANG_JC35W8"/>
<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/>
<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.1940295628"/>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/g031_JIECANG_JC35W8"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&lt;memoryBlockExpressionList context=&quot;reserved-for-future-use&quot;/&gt;"/>
<stringAttribute key="process_factory_id" value="com.st.stm32cube.ide.mcu.debug.launch.HardwareDebugProcessFactory"/>
</launchConfiguration>
Loading…
Cancel
Save