#include "main.h" #include "os-app.h" #include #include #include #include #include #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 *) ®_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 ; }