g0b1vetx-board/Comm/probusthread.c
2023-11-30 08:10:01 +08:00

176 lines
3.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "main.h"
#include "os-app.h"
#include <stdio.h>
#include <rtthread.h>
#include <net-app.h>
#include <easyflash.h>
#include <string.h>
#include "usart-board.h"
#include "modbus-s.h"
#include "modbusaddr.h"
#include "data.h"
ALIGN (RT_ALIGN_SIZE)
static char thread_stack[4096];
static struct rt_thread probus_thread;
//uint16_t REG_DATA[REG_MAX] = {0x00};
reg_data_t reg_data =
{
.gopen = 56,
.aload = 0,
};
static ModBusSlave_t modbus_slave;
static uint8_t modbus_rx_data[256];
static void eth2_data_rxdone (void)
{
rt_event_send (gUartEvents, EVENT_UART_ETH2_RX);
}
static void probus_handle (reg_addr_t addr, uint8_t * data)
{
uint32_t data32;
TypeIndexMail_t mail;
switch (addr)
{
case reg_sopen: // 设定闸门开度
data32 = data[0];
data32 = (data32 << 8) + data[1];
SluiceData[0].sopen = data32 * 10;
break;
case reg_slopt: // 执行闸门动作
rt_kprintf ("reg_slopt\r\n");
if (data[0] == 0x01) // 执行
{
rt_kprintf ("reg_slopt\r\n");
mail.Type = MAIL_SLUICE_OPT;
mail.index = 0;
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
}
else
{
mail.Type = MAIL_SLUICE_STP;
mail.index = 0;
rt_mb_send (gSluiceMail, * ( (uint32_t*) &mail));
rt_kprintf ("reg_stp\r\n");
}
break;
default:
break;
}
}
static void thread_entry (void * argument)
{
int k = 0;
uint8_t txbuff[128] = {0};
int tx_size = 0;
rt_kprintf ("%s was start!\r\n", __FILE__);
g_ETH2Drv.rxdone = eth2_data_rxdone;
g_ETH2Drv.BaudRate = 115200;
MX_UART_Init (&g_ETH2Drv);
ModbusSlaveInit (&modbus_slave, 0x01, modbus_rx_data, (uint16_t *) &reg_data, sizeof (reg_data_t) / 2);
MX_UART_Clear (&g_ETH2Drv);
// 注册网络驱动
// 注册网络驱动
while (1)
{
// 从其他数据区域更新到寄存器
reg_data.gopen = SluiceData[0].gopen * 10;
//reg_data.aload = SluiceData[0].lload;
//reg_data.bload = SluiceData[0].rload;
if (RT_EOK == rt_event_recv (gUartEvents, EVENT_UART_ETH2_RX, RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR, RT_WAITING_NO, RT_NULL))
{
for (int i = 0; i < g_ETH2Drv.rx_size; i++)
{
rt_kprintf ("%02x", g_ETH2Drv.rx_buffer[i]);
}
if (g_ETH2Drv.rx_size > 4)
{
k = ModbusSlaveHandle (&modbus_slave, (uint8_t *) g_ETH2Drv.rx_buffer, g_ETH2Drv.rx_size);
//k = 2;
rt_kprintf ("k:%d\r\n", k);
if (k == 0)
{
switch (modbus_slave.func)
{
case 0x03:
tx_size = ModbusSlavePacket (&modbus_slave, txbuff);
// 直接返回当前寄存器中的数据
break;
case 0x06:
//处理对应的事件
probus_handle (modbus_slave.Addr, modbus_slave.data);
// 数据打包回复
tx_size = ModbusSlavePacket (&modbus_slave, txbuff);
break;
default:
tx_size = 0;
break;
}
}
else
{
tx_size = 0;
}
if (tx_size > 0)
{
//rt_kprintf("tx_size :%d\r\n",tx_size);
MX_UART_PutBuffer (&g_ETH2Drv, (char *) txbuff, tx_size);
}
}
MX_UART_Clear (&g_ETH2Drv);
}
rt_thread_mdelay (100);
}
}
void PROBUS_APPThreadStart (void)
{
/* 创建线程1名称是thread1入口是thread1_entry*/
rt_thread_init (&probus_thread, "probus_thread",
thread_entry, RT_NULL,
&thread_stack[0],
sizeof (thread_stack),
PROBUS_APP_THREAD_PRIORITY, PROBUS_APP_THREAD_TIMESLICE);
rt_thread_startup (&probus_thread);
return ;
}