This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TM4C1294KCPDT:特定事件执行时的以太网断开问题

Guru**** 2527710 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1055869/tm4c1294kcpdt-ethernet-disconnection-issue-on-specific-event-execution

器件型号:TM4C1294KCPDT

您好!

在随附的代码中、当我们从主机向器件发送"L:"或"D"命令时、我们面临以太网断开连接的问题、"S"和"E"命令工作正常。 设备将充当客户端(192.168.1.139),主机将位于 IP192.168.1.130上。 对于"S"命令-它启动计时器并通过以太网发送数据、"E"命令停止计时器并停止通过以太网发送数据。 对于这个通信器件、主器件的值必须为0、否则它将作为从器件运行、并且不会与主机连接。 最初,必须在开始数据传输时发送“S”命令。 当我们发送"L"命令时、它会开启两个引脚 PL4和 PL5、并将数据发送到 UART。 随着这条线路的执行、以太网将停止工作并在几秒钟后断开连接。

执行以下行时出现问题。 还随附了整个代码。

if (snap = 1)

SNAP_ON=0;
Snap1_on;
Snap2_on;
Modbus_transmit;
Modbus_REC_BUF=0x4C;
UARTSend (((uint8_t *)&MODBUS_REC_BUF、1);//向从属方发送命令
//UARTSend ((uint8_t *)"L"、1);
//SysCtlDelay (SOFT_DELAY);

if (snap:off = 1)

SNAP_OFF=0;
Snap1_off;
Snap2_off;
Modbus_transmit;
Modbus_REC_BUF=0x55;
UARTSend (((uint8_t *)&MODBUS_REC_BUF、1);//向从属方发送命令
//UARTSend ((uint8_t *)"U"、1);
//SysCtlDelay (SOFT_DELAY);

/*
 * Author : - KHODIDAS DOMADIYA\
 * Organization: - Optimzed Solutions Ltd.
 * Department: -Product ENgineering services.
 *
 * Date:- 12-05-2021

 *=> IP ADDRESS USED IS STATIC
 *

 *
 *
 * Indication OF leds - For ethernet , default LEDs used
 *
 *
 */


/*
 *    ======== tcpEcho.c ========
 */

/* XDCtools Header files */
#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>


#include <xdc/std.h>
#include <xdc/cfg/global.h>
#include <ti/sysbios/hal/Hwi.h>

#include <xdc/runtime/Error.h>
#include <xdc/runtime/Memory.h>
#include <xdc/runtime/System.h>

/* BIOS Header files */
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Clock.h>
#include <ti/sysbios/knl/Task.h>

 /* NDK Header files */
#include <ti/ndk/inc/netmain.h>
#include <ti/ndk/inc/_stack.h>

/* TI-RTOS Header files */
#include <ti/drivers/GPIO.h>

/* Example/Board Header files */
#include "Board.h"


//#include <time.h>
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "inc/hw_sysctl.h"
#include "driverlib/sysctl.h"

#include "driverlib/pin_map.h"

#include "inc/hw_gpio.h"
#include "driverlib/gpio.h"

#include "inc/hw_ints.h"
#include "driverlib/interrupt.h"

#include "inc/hw_timer.h"
#include "driverlib/timer.h"

#include <xdc/cfg/global.h>
#include <ti/sysbios/hal/Timer.h>

#include "inc/hw_flash.h"
#include "driverlib/flash.h"
#include "driverlib/uart.h"
#include "inc/hw_uart.h"
#include "utils/uartstdio.h"

#define SOFT_DELAY 4000
Timer_Params Timer2;
Timer_Handle myTimer;

SOCKET lSocket;
struct sockaddr_in sLocalAddr;

#define TCPPACKETSIZE 256
#define NUMTCPWORKERS 3
/**************************************************************** Global variable ****************************************************************/
bool MASTER;

#define MODBUS_TRANSMIT (GPIOPinWrite(GPIO_PORTP_BASE, GPIO_PIN_2, GPIO_PIN_2))
#define MODBUS_RECIEVE (GPIOPinWrite(GPIO_PORTP_BASE, GPIO_PIN_2, 0x00))

#define SYNC_START (GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0, GPIO_PIN_0))
#define SYNC_STOP (GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_0, 0x00))

#define SYNC_READ (GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_0))
#define SLAVE (!MASTER)

#define MODBUS_COM_LED_ON (GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_2, 0))
#define START_STP_LED_ON (GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_1, 0))
#define MASTER_SLAVE_LED_ON (GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_0, 0))
#define ETH_LED_ON (GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_3, GPIO_PIN_3))

#define MODBUS_COM_LED_OFF (GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_2, GPIO_PIN_2))
#define START_STP_LED_OFF (GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_1, GPIO_PIN_1))
#define MASTER_SLAVE_LED_OFF (GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_0, GPIO_PIN_0))
#define ETH_LED_OFF (GPIOPinWrite(GPIO_PORTH_BASE, GPIO_PIN_3, 0))


#define SNAP1_ON  GPIOPinWrite(GPIO_PORTL_BASE,GPIO_PIN_4,GPIO_PIN_4)
#define SNAP2_ON  GPIOPinWrite(GPIO_PORTL_BASE,GPIO_PIN_5,GPIO_PIN_5)
#define SNAP1_OFF  GPIOPinWrite(GPIO_PORTL_BASE,GPIO_PIN_4,0)
#define SNAP2_OFF  GPIOPinWrite(GPIO_PORTL_BASE,GPIO_PIN_5,0)
//****************************************************************************
// System clock rate in Hz.
//****************************************************************************
uint32_t g_ui32SysClock;
#define MODBUS_DATA_SIZE 28
//*****************************************************************************
// Global flag to indicate data was received
//*****************************************************************************
volatile uint32_t g_bReceiveFlag = 0;

//*****************************************************************************
// Flags that contain the current value of the interrupt indicator as displayed
// on the UART.
//*****************************************************************************
uint32_t g_ui32Flags;

//uint8_t Eth_Buffer[50]="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmn";
uint8_t Eth_Buffer[56];
uint8_t Modbus_Buffer[28];
// UART INT variable
uint32_t c;
uint32_t C;

// for looping purpose of GPIO
uint8_t i = 0;
uint8_t j = 0;

// Different buffer for signals
bool pin_data[208];
uint8_t SET_1[8];
uint8_t SET_2[8];
uint8_t SET_3[8];
uint8_t snap_status;
/*uint8_t portD_data;
uint8_t portE_data;
uint8_t portN_data;
uint8_t portP_data;
uint8_t portB_data;
uint8_t portL_data;
uint8_t portM_data;*/

// Start and Stop command from host
char rcvd_data[1];
char MODBUS_REC_BUF;
// Slave command receive buffer
uint8_t slave_cmd[2];

// data store in slave buffer
uint8_t SLAVE_1_BUFFER[MODBUS_DATA_SIZE],SLAVE_2_BUFFER[MODBUS_DATA_SIZE],SLAVE_3_BUFFER[MODBUS_DATA_SIZE],SLAVE_4_BUFFER[MODBUS_DATA_SIZE],SLAVE_5_BUFFER[MODBUS_DATA_SIZE];

// timer initial define 0
bool TIMER_ON=0,START_FLAG;

// Master and Slave address
uint8_t SLAVE_ADDRESS;
bool SNAP_ON,SNAP_OFF;

uint8_t ETHSIZE;
//counting verible
uint16_t timerCount;
uint32_t worktimecount=0;
//**************************************************************** TIMER INIT FUNCTIONS****************************************************************/
void timer_init(void);
void timerIntHandler(void);



//**************************************************************** APPLICATION FUNCTIONS****************************************************************/
void decoderAddrLineSelect(uint8_t temp);
void readSignal();
void Snap_Config(void);
void modbusUART6init(void);
void DebugUART0(void);
void UARTSend( const uint8_t *pui8Buffer, uint32_t ui32Count);
void UARTRecieve(uint8_t *BUFF, uint32_t ui32Count);
void Timer_init();
void Debug_Send( const uint8_t *pui8Buffer, uint32_t ui32Count);
/**************************************************************** LOGIC *****************************************************************/

//*********************************inialaization 24 GPIO for different input signals*******************************//
void signalconfigure(void)
{
    HWREG(GPIO_PORTD_BASE+GPIO_O_LOCK) = GPIO_LOCK_KEY;         //
    HWREG(GPIO_PORTD_BASE+GPIO_O_CR) |= GPIO_PIN_7;             //  Unlock port D pin 7
    GPIODirModeSet(GPIO_PORTD_BASE,GPIO_PIN_7,GPIO_DIR_MODE_IN);//
    GPIOPinTypeGPIOInput(GPIO_PORTD_BASE,  GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_4);

    HWREG(GPIO_PORTE_AHB_BASE+GPIO_O_LOCK) = GPIO_LOCK_KEY;      //
    HWREG(GPIO_PORTE_AHB_BASE+GPIO_O_CR) |= GPIO_PIN_4;          // Unlock port E pin 4
    GPIOPinTypeGPIOInput(GPIO_PORTE_BASE, GPIO_PIN_4);           //
    GPIODirModeSet(GPIO_PORTE_BASE,GPIO_PIN_4,GPIO_DIR_MODE_IN); //

    GPIOPinTypeGPIOInput(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1);
    GPIOPinTypeGPIOInput(GPIO_PORTP_BASE, GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_3);
    GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4);
    GPIOPinTypeGPIOInput(GPIO_PORTL_BASE, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_3|GPIO_PIN_1|GPIO_PIN_0);
    GPIOPinTypeGPIOInput(GPIO_PORTM_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_7);
}

//*********************************Signal read of 24 GPIO*******************************//
/*void readSignal()
{
    portD_data = GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_7 |GPIO_PIN_6|GPIO_PIN_4) & 0xD0;
    portE_data = GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_4) & 0x10;
    portB_data = GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_4|GPIO_PIN_3|GPIO_PIN_2) & 0x1C;
    portN_data = GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_0|GPIO_PIN_1) & 0x03;
    portP_data = GPIOPinRead(GPIO_PORTP_BASE, GPIO_PIN_5|GPIO_PIN_4|GPIO_PIN_3) & 0x38;
    portL_data = GPIOPinRead(GPIO_PORTL_BASE, GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_3|GPIO_PIN_1|GPIO_PIN_0) & 0xC7;
    portM_data = GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_7) & 0xDF;
}*/
void readSignal()
{
         /* pin_data[j]   =  GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_7);
          pin_data[j+1] =  GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_6);
          pin_data[j+2] =  GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_4);
          pin_data[j+3] =  GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_4);
          pin_data[j+4] =  GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_4);
          pin_data[j+5] =  GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_0);
          pin_data[j+6] =  GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_1);
          pin_data[j+7] =  GPIOPinRead(GPIO_PORTP_BASE, GPIO_PIN_5);

          pin_data[j+8] =  GPIOPinRead(GPIO_PORTP_BASE, GPIO_PIN_4);
          pin_data[j+9] =  GPIOPinRead(GPIO_PORTP_BASE, GPIO_PIN_3);
          pin_data[j+10] = GPIOPinRead(GPIO_PORTL_BASE, GPIO_PIN_6);
          pin_data[j+11] = GPIOPinRead(GPIO_PORTL_BASE, GPIO_PIN_7);
          pin_data[j+12] = GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_3);
          pin_data[j+13] = GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_2);
          pin_data[j+14] = GPIOPinRead(GPIO_PORTL_BASE, GPIO_PIN_3);
          pin_data[j+15] = GPIOPinRead(GPIO_PORTL_BASE, GPIO_PIN_1);

          pin_data[j+16] = GPIOPinRead(GPIO_PORTL_BASE, GPIO_PIN_0);
          pin_data[j+17] = GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_0);
          pin_data[j+18] = GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_1);
          pin_data[j+19] = GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_2);
          pin_data[j+20] = GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_3);
          pin_data[j+21] = GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_4);
          pin_data[j+22] = GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_6);
          pin_data[j+23] = GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_7);
          j+=24;
          if( j == 192)
          {
              j = 0;
          }*/
          SET_1[j]=   (GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_7) << 0) + (GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_6) << 1) \
                    + (GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_4) << 2) + (GPIOPinRead(GPIO_PORTE_BASE, GPIO_PIN_4) << 3) \
                    + (GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_4) << 4) + (GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_0) << 5) \
                    + (GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_1) << 6) + (GPIOPinRead(GPIO_PORTP_BASE, GPIO_PIN_5) << 7);

          SET_2[j]=   (GPIOPinRead(GPIO_PORTP_BASE, GPIO_PIN_4) << 0) + (GPIOPinRead(GPIO_PORTP_BASE, GPIO_PIN_3) << 1) \
                    + (GPIOPinRead(GPIO_PORTL_BASE, GPIO_PIN_6) << 2) + (GPIOPinRead(GPIO_PORTL_BASE, GPIO_PIN_7) << 3) \
                    + (GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_3) << 4) + (GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_2) << 5) \
                    + (GPIOPinRead(GPIO_PORTL_BASE, GPIO_PIN_3) << 6) + (GPIOPinRead(GPIO_PORTL_BASE, GPIO_PIN_1) << 7);
          SET_3[j]=   (GPIOPinRead(GPIO_PORTL_BASE, GPIO_PIN_0) << 0) + (GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_0) << 1) \
                    + (GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_0) << 2) + (GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_1) << 3) \
                    + (GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_2) << 4) + (GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_4) << 5) \
                    + (GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_6) << 6) + (GPIOPinRead(GPIO_PORTM_BASE, GPIO_PIN_7) << 7);
}
//*********************************SNAP RELAY PIN CONFIGURATION*******************************//
void Snap_Config(void)
{
    GPIOPinTypeGPIOOutput(GPIO_PORTL_BASE, GPIO_PIN_4|GPIO_PIN_5);
    GPIOPinWrite(GPIO_PORTL_BASE,GPIO_PIN_4|GPIO_PIN_5, 0|0);
}

//********************************* EXTERNAL MUX ADDRESS SELECTOR RESET*******************************//
void resetExternalMuxSelect(void)
{
    GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_5); // Pin low
    GPIOPinWrite(GPIO_PORTB_BASE, GPIO_PIN_5, 0);       //

    GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_5);     // Pin high
    GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_5, GPIO_PIN_5);  //

}

//********************************* MASTER SLAVE ADDRESS SELECT PIN CONFIGURATION*******************************//
void Master_Slave_Pin_Config(void)
{
    // Enable the GPIO Peripheral
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOQ);

    // select GPIO for MODBUS address
     GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_0);
     GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_1);
     GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_2);
     GPIOPinTypeGPIOInput(GPIO_PORTD_BASE, GPIO_PIN_3);
     GPIOPinTypeGPIOInput(GPIO_PORTQ_BASE, GPIO_PIN_0);
}

//*********************************  MUX ADDRESS GENERATOR PIN (S0, S1, S2) CONFIGURATION*******************************//
void MuxAddress_Pin_Configuration()
{
    GPIOPinTypeGPIOOutput(GPIO_PORTK_BASE, GPIO_PIN_0); // s1
    GPIOPinTypeGPIOOutput(GPIO_PORTK_BASE, GPIO_PIN_1); // s0
    GPIOPinTypeGPIOOutput(GPIO_PORTK_BASE, GPIO_PIN_2); //s2
}

//*********************************  MUX ADDRESS GENERATOR FUNCTION (S0, S1, S2) *******************************//
void decoderAddrLineSelect(uint8_t temp)
{
    GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_0, temp);
    GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_1, temp);
    GPIOPinWrite(GPIO_PORTK_BASE, GPIO_PIN_2, temp);
}

//*****************************************************************************
// Master and slave address selection
//*****************************************************************************
bool Master_Slave_Select()
{
    bool t1,t2,t3;
    t1=GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_0);
    t2=GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_1);
    t3=GPIOPinRead(GPIO_PORTD_BASE, GPIO_PIN_2);

    SLAVE_ADDRESS = (t1<<0) + (t2<<1) +(t3<<2);

    if(SLAVE_ADDRESS==0x00)
    {
        MASTER_SLAVE_LED_ON;
        Debug_Send((uint8_t *)"Device is Master",20);
        return 1;
    }
    else
    {
        MASTER_SLAVE_LED_OFF;
        char debug_buf[]="Device is slave:-";
        sprintf(debug_buf,"Device is slave:-%d",SLAVE_ADDRESS);
        Debug_Send((uint8_t *)debug_buf,20);
        return 0;
    }

}

//*****************************************************************************
// MODBUS UART6 interrupt handler.
//*****************************************************************************
void modbusUART6IntHandler(void)
{
    uint32_t ui32Status;


    // Get the interrupt status.
    ui32Status = UARTIntStatus(UART6_BASE, true);

    // Clear the asserted interrupts.
    UARTIntClear(UART6_BASE, ui32Status);

    if( ( (UART_INT_RX & ui32Status) == UART_INT_RX ) || ( (UART_INT_RT & ui32Status) == UART_INT_RT) )
    {
             // Receive UART char
             while(UARTCharsAvail(UART6_BASE))
             {
                 // Read the next character from the UART and write it back to the UART.
                 UARTCharGetNonBlocking(UART6_BASE);

                  C = UARTCharGet(UART6_BASE);
             }
       }
}

//*****************************************************************************
// MODBUS UART6 configure
//*****************************************************************************
void modbusUART6init(void)
{
    // Enable UART6.
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART6);
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOP);

    // Enable processor interrupts.
    IntMasterEnable();

    // Configure GPIO Pins for UART mode.
    GPIOPinConfigure(GPIO_PP0_U6RX);
    GPIOPinConfigure(GPIO_PP1_U6TX);
    GPIOPinTypeUART(GPIO_PORTP_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    // Initialize the UART for console I/O.
    UARTConfigSetExpClk(UART6_BASE, g_ui32SysClock, 2000000,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE));

    //IntEnable(INT_UART6);
    //UARTIntEnable(UART6_BASE, UART_INT_RX | UART_INT_TX |UART_INT_RT);
    UARTEnable(UART6_BASE);

    GPIOPinTypeGPIOOutput(GPIO_PORTP_BASE, GPIO_PIN_2); //MODBUS_TX_RX_CNTRL
}

void DebugUART0(void)
{
    // Enable the GPIO Peripheral used by the UART.
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

    // Enable UART0.
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);

    // Enable processor interrupts.
     IntMasterEnable();

    // Configure GPIO Pins for UART mode.
    GPIOPinConfigure(GPIO_PA0_U0RX);
    GPIOPinConfigure(GPIO_PA1_U0TX);
    GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

    UARTConfigSetExpClk(UART0_BASE, g_ui32SysClock, 115200,(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |UART_CONFIG_PAR_NONE));
    UARTFIFOLevelSet(UART0_BASE, UART_FIFO_TX1_8, UART_FIFO_RX1_8);
    // Enable the UART interrupt.
    UARTEnable(UART0_BASE);
}

//*****************************************************************************
// Send a string to the UART.
//*****************************************************************************
void UARTSend( const uint8_t *pui8Buffer, uint32_t ui32Count)
{
        // Loop while there are more characters to send.
        while(ui32Count--)
        {
        // Write the next character to the UART.
            UARTCharPut(UART6_BASE, *pui8Buffer++);
        }
}

//*****************************************************************************
// Receive a string to the UART.
//*****************************************************************************
void UARTRecieve(uint8_t *BUFF, uint32_t ui32Count)
{
    while(UARTCharsAvail(UART6_BASE))
  {
        while(ui32Count--)
        {
          // Read the next character from the UART
          UARTCharGetNonBlocking(UART6_BASE);
          *BUFF++ = UARTCharGet(UART6_BASE);
        }
  }
}

void Debug_Send( const uint8_t *pui8Buffer, uint32_t ui32Count)
{
        // Loop while there are more characters to send.
        while(ui32Count--)
        {
        // Write the next character to the UART.
            UARTCharPut(UART0_BASE, *pui8Buffer++);
        }
}
// Timer configuration as RTOS base
void Timer_init()
{
      timer_init();
      Timer_Params_init(&Timer2);
      Timer2.arg=0;
     // Timer2.period= 10; // 20us
     Timer2.period= 1000; //1 ms (Milliseconds)
      //Timer2.period= 800; //800 us (Microseconds)
      Timer2.periodType=Timer_PeriodType_MICROSECS;
      myTimer=Timer_create(2,(Timer_FuncPtr)timerIntHandler,&Timer2,NULL);
      //Timer_start(myTimer);

       Timer_stop(myTimer);

}

// Timer start
void Timer_Start(void)
{
    Timer_start(myTimer);
}

// Timer stop
void Timer_Stop(void)
{
    Timer_stop(myTimer);
}

void timer_init(void)
{
  uint32_t ui32Period;

       //Set CPU Clock to 40MHz. 400MHz PLL/2 = 200 DIV 5 = 40MHz
       SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);

       SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
       GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1);

      // Timer 2 setup code
      SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER2);           // enable Timer 2 periph clks
      TimerConfigure(TIMER2_BASE, TIMER_CFG_PERIODIC);        // cfg Timer 2 mode - periodic

      ui32Period = (SysCtlClockGet() /100);
      TimerLoadSet(TIMER2_BASE, TIMER_A, ui32Period);         // set Timer 2 period

      TimerIntEnable(TIMER2_BASE, TIMER_TIMA_TIMEOUT);        // enables Timer 2 to interrupt CPU

      TimerEnable(TIMER2_BASE, TIMER_A);                      // enable Timer 2
}



void Sync_Config()
{
    if(MASTER)
    {
        GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0); // SYNCH PIN
        SYNC_STOP;
    }
    else
    {
       GPIOPinTypeGPIOInput(GPIO_PORTB_BASE, GPIO_PIN_0); // SYNCH PIN
    }
}

void Indication_Led_config()
{
    GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_2); // MODBUS COM
    GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_1); //START/ STOP LED
    GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_0); //MASTER/SLAVE LED
    GPIOPinTypeGPIOOutput(GPIO_PORTH_BASE, GPIO_PIN_3); //ETH_LED

    MODBUS_COM_LED_OFF;
    START_STP_LED_OFF;
    MASTER_SLAVE_LED_OFF;
    ETH_LED_OFF;
}
//int checkLinkState(void)
//    {
//        return EMAC_isLinkUp(0);
//    }
/*
 *  ======== tcpHandler ========
 *  Creates new Task to handle new TCP connections.
 */
Void tcpHandler(UArg arg0, UArg arg1)
{
    fdOpenSession(TaskSelf());

    lSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (lSocket < 0)
    {
       // System_printf("tcpHandler: socket failed\n");
        Task_exit();
        return;
    }

    memset((char *)&sLocalAddr, 0, sizeof(sLocalAddr));
    sLocalAddr.sin_family = AF_INET;
    sLocalAddr.sin_addr.s_addr = inet_addr("192.168.1.130");//htonl(INADDR_ANY);
    sLocalAddr.sin_port = htons(arg0);

    Timer_init();
    //status = checkLinkState();

    while(SLAVE_ADDRESS>0)
       {

           MODBUS_RECIEVE;
           if(START_FLAG==0)
           {
               //if(UARTCharGetNonBlocking(UART6_BASE)==0x53)
               MODBUS_RECIEVE;
               MODBUS_REC_BUF= UARTCharGet(UART6_BASE);
               if(MODBUS_REC_BUF==0x53)
               {
                   MODBUS_REC_BUF=0x00;
                   Timer_Start();
                   START_STP_LED_ON;
                   START_FLAG=1;
                   TIMER_ON=1;
               }
           }

       }

        while(connect(lSocket, (struct sockaddr *)&sLocalAddr, sizeof(sLocalAddr)) < 0)
         {
             ETH_LED_OFF;
             SysCtlDelay(400000);
         }
       ETH_LED_ON;
       while (1)
       {
           recv(lSocket,(char *)rcvd_data,sizeof(rcvd_data), MSG_DONTWAIT);
           while(MASTER)
           {
               recv(lSocket,(char *)rcvd_data,sizeof(rcvd_data), MSG_DONTWAIT);

               if(strcmp(rcvd_data, "S" )==0) //START
               {
                   Timer_Start();
                   MODBUS_TRANSMIT;
                   SYNC_START;
                   UARTSend((uint8_t *)"S",1);
                   SysCtlDelay(SOFT_DELAY);
                   START_STP_LED_ON;
                   TIMER_ON=1;
               }

               //send(lSocket, flashbuffer,sizeof(flashbuffer), 0 );
               while(TIMER_ON)
               {


                   recv(lSocket,(char *)rcvd_data,sizeof(rcvd_data), MSG_DONTWAIT);
                   if(strcmp(rcvd_data,"E" )==0) //STOP
                   {
                       START_STP_LED_OFF;
                       TIMER_ON=0;
                       SYNC_STOP;
                       MODBUS_TRANSMIT;
                       UARTSend((uint8_t *)"E",1);
                       SysCtlDelay(SOFT_DELAY);
                       Timer_Stop();
                       timerCount=0;
                   }
                   if(strcmp(rcvd_data, "L" )==0)
                   {
                       //SNAP1_ON;
                       //SNAP2_ON;
                       snap_status=1;
                       SNAP_ON=1;
                       rcvd_data[0]=0;
                       //MODBUS_TRANSMIT;
                       //UARTSend((uint8_t *)"L",1);
                       //SysCtlDelay(SOFT_DELAY);
                   }
                   if(strcmp(rcvd_data,"D" )==0)
                   {
                       //SNAP1_OFF;
                       //SNAP2_OFF;
                       SNAP_OFF=1;
                       snap_status=0;
                       rcvd_data[0]=0;
                       //MODBUS_TRANSMIT;
                       //UARTSend((uint8_t *)"U",1);
                       //SysCtlDelay(SOFT_DELAY);
                   }
                   if(ETHSIZE==56)
                   {
                       ETHSIZE=0;
                       send(lSocket, Eth_Buffer,sizeof(Eth_Buffer), 0 );

                   }
               }
           }
       }
}

/*
 *  ======== main ========
 */
int main(void)
{
//    Task_Handle taskHandle;
//    Task_Params taskParams;
//    Error_Block eb;

    g_ui32SysClock = SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |SYSCTL_OSC_MAIN |SYSCTL_USE_PLL |SYSCTL_CFG_VCO_320), 120000000);

       /* Call board init functions */
       Board_initGeneral();
       Board_initGPIO();
       Board_initEMAC();



       Indication_Led_config();
       signalconfigure();
       Snap_Config();
       resetExternalMuxSelect();
       DebugUART0();
       modbusUART6init();
       Master_Slave_Pin_Config();
       MuxAddress_Pin_Configuration();
       MASTER = Master_Slave_Select();
       Sync_Config();


       /* Start BIOS */
       BIOS_start();

       return (0);
}



//--------------------------------------- ------------------------------------
// timer interrupt
//---------------------------------------------------------------------------
void timerIntHandler(void)
{
    uint8_t ui32count=0;

    TimerIntClear(TIMER2_BASE, TIMER_TIMA_TIMEOUT);         // must clear timer flag FROM timer
    worktimecount++;
    timerCount++; // counting time
    if(timerCount>4000)
    {
        timerCount=1;
    }


    /* Read 26 signals 8 times */
    while(i<8)
      {
          decoderAddrLineSelect(i); // MUX line selection
          readSignal();
          i++;
      }
      i=0;

   /* Master and Slave logic */
   if(MASTER)
   {

       Eth_Buffer[0]=SLAVE_ADDRESS;
       memcpy(Eth_Buffer+1,&SET_1,8);
       memcpy(Eth_Buffer+9,&SET_2,8);
       memcpy(Eth_Buffer+17,&SET_3,8);
       Eth_Buffer[25] = (timerCount >> 8);
       Eth_Buffer[26] = timerCount;
       Eth_Buffer[27] = snap_status;

       //=====================================command to salve 01==================================//

       MODBUS_TRANSMIT;
       MODBUS_REC_BUF=0x01;
       UARTSend((uint8_t *)&MODBUS_REC_BUF,1); // Send command to slave
       SysCtlDelay(SOFT_DELAY);
      // MODBUS_REC_BUF=0x54;
      // UARTSend((uint8_t *)&MODBUS_REC_BUF,1);
      // SysCtlDelay(SOFT_DELAY);
       ui32count=0;
       while(ui32count<MODBUS_DATA_SIZE)
       {
           MODBUS_RECIEVE;
           SLAVE_1_BUFFER[ui32count]= UARTCharGet(UART6_BASE); // data receive from the slave
           ui32count++;
       }
       SysCtlDelay(SOFT_DELAY);
       memcpy(Eth_Buffer+28,SLAVE_1_BUFFER,sizeof(SLAVE_1_BUFFER));

       ETHSIZE=56;
           if(SNAP_ON==1)
             {
                 SNAP_ON=0;
                 SNAP1_ON;
                 SNAP2_ON;
                 MODBUS_TRANSMIT;
                 MODBUS_REC_BUF=0x4C;
                 UARTSend((uint8_t *)&MODBUS_REC_BUF,1); // Send command to slave
                 //UARTSend((uint8_t *)"L",1);
                 //SysCtlDelay(SOFT_DELAY);
             }
             if(SNAP_OFF==1)
             {
                 SNAP_OFF=0;
                 SNAP1_OFF;
                 SNAP2_OFF;
                 MODBUS_TRANSMIT;
                 MODBUS_REC_BUF=0x55;
                 UARTSend((uint8_t *)&MODBUS_REC_BUF,1); // Send command to slave
                 //UARTSend((uint8_t *)"U",1);
                 //SysCtlDelay(SOFT_DELAY);
             }
/*       //=====================================command to salve 02==================================//
       MODBUS_TRANSMIT;
       MODBUS_REC_BUF=0x02;
       UARTSend((uint8_t *)&MODBUS_REC_BUF,1); // Send command to slave
       MODBUS_REC_BUF=0x54;
       UARTSend((uint8_t *)&MODBUS_REC_BUF,1);
       SysCtlDelay(SOFT_DELAY);
       while(ui32count<MODBUS_DATA_SIZE)
       {
           MODBUS_RECIEVE;
           SLAVE_1_BUFFER[ui32count]= UARTCharGet(UART6_BASE); // data receive from the slave
           ui32count++;
       }
       SysCtlDelay(SOFT_DELAY);
       memcpy(Eth_Buffer+56,SLAVE_1_BUFFER,sizeof(SLAVE_1_BUFFER));
       //=====================================command to salve 03==================================//
       MODBUS_TRANSMIT;
       MODBUS_REC_BUF=0x03;
       UARTSend((uint8_t *)&MODBUS_REC_BUF,1); // Send command to slave
       MODBUS_REC_BUF=0x54;
       UARTSend((uint8_t *)&MODBUS_REC_BUF,1);
       SysCtlDelay(SOFT_DELAY);
       while(ui32count<MODBUS_DATA_SIZE)
       {
           MODBUS_RECIEVE;
           SLAVE_1_BUFFER[ui32count]= UARTCharGet(UART6_BASE); // data receive from the slave
           ui32count++;
       }
       SysCtlDelay(SOFT_DELAY);
       memcpy(Eth_Buffer+84,SLAVE_1_BUFFER,sizeof(SLAVE_1_BUFFER));
       //=====================================command to salve 04==================================//
       MODBUS_TRANSMIT;
       MODBUS_REC_BUF=0x04;
       UARTSend((uint8_t *)&MODBUS_REC_BUF,1); // Send command to slave
       MODBUS_REC_BUF=0x54;
       UARTSend((uint8_t *)&MODBUS_REC_BUF,1);
       SysCtlDelay(SOFT_DELAY);
       while(ui32count<MODBUS_DATA_SIZE)
       {
           MODBUS_RECIEVE;
           SLAVE_1_BUFFER[ui32count]= UARTCharGet(UART6_BASE); // data receive from the slave
           ui32count++;
       }
       SysCtlDelay(SOFT_DELAY);
       memcpy(Eth_Buffer+112,SLAVE_1_BUFFER,sizeof(SLAVE_1_BUFFER));
       //=====================================command to salve 05==================================//
       MODBUS_TRANSMIT;
       MODBUS_REC_BUF=0x05;
       UARTSend((uint8_t *)&MODBUS_REC_BUF,1); // Send command to slave
       MODBUS_REC_BUF=0x54;
       UARTSend((uint8_t *)&MODBUS_REC_BUF,1);
       SysCtlDelay(SOFT_DELAY);
       while(ui32count<MODBUS_DATA_SIZE)
       {
           MODBUS_RECIEVE;
           SLAVE_1_BUFFER[ui32count]= UARTCharGet(UART6_BASE); // data receive from the slave
           ui32count++;
       }
       SysCtlDelay(SOFT_DELAY);
       memcpy(Eth_Buffer+140,SLAVE_1_BUFFER,sizeof(SLAVE_1_BUFFER));
*/
   }
   else
   {

     MODBUS_RECIEVE;
     slave_cmd[0]= UARTCharGet(UART6_BASE);
     //slave_cmd[1]= UARTCharGet(UART6_BASE); // Command receive from master
     SysCtlDelay(SOFT_DELAY);
     if(slave_cmd[0]==0x01)
     {
           //if(slave_cmd[1]==0x54)
            {
                   MODBUS_TRANSMIT;
                   Modbus_Buffer[0]=SLAVE_ADDRESS;
                   memcpy(Modbus_Buffer+1,&SET_1,8);
                   memcpy(Modbus_Buffer+9,&SET_2,8);
                   memcpy(Modbus_Buffer+17,&SET_3,8);
                   Modbus_Buffer[25] = (timerCount >> 8);
                   Modbus_Buffer[26] = timerCount;
                   Modbus_Buffer[27] = snap_status;
//                     UARTSend((uint8_t *)"ABCDEFGHIJKLMNOPQRSTUVWXYZ01",28);
                   UARTSend(Modbus_Buffer, sizeof(Modbus_Buffer));
                   SysCtlDelay(SOFT_DELAY);
                   slave_cmd[0]=0x00;
                   slave_cmd[1]=0x00;

            }
     }
     if(slave_cmd[0]==0x45)
     {
         //if(slave_cmd[1]==0x01)
         {
             timerCount=0;
             TIMER_ON=0;
             START_FLAG=0;
             Timer_Stop();

             //while(1)
             {
                 MODBUS_RECIEVE;
                 MODBUS_REC_BUF= UARTCharGet(UART6_BASE);
                 SysCtlDelay(SOFT_DELAY);
                    if(MODBUS_REC_BUF==0x53)
                    {
                        MODBUS_REC_BUF=0x00;
                        Timer_Start();
                        START_STP_LED_ON;
                        START_FLAG=1;
                        TIMER_ON=1;
                        //break;
                    }
             }
         }
     }
     if(slave_cmd[0]==0x4C)
      {
         SNAP1_ON;
         SNAP2_ON;
         snap_status=1;
      }
     if(slave_cmd[0]==0x55)
      {
         SNAP1_OFF;
         SNAP2_OFF;
         snap_status=0;
      }
     /*switch (slave_cmd[0])
     {

             case 0x01:

                     if(slave_cmd[1]==0x54)
                       {
                          MODBUS_TRANSMIT;
                          memcpy(Modbus_Buffer,&SLAVE_ADDRESS,sizeof(SLAVE_ADDRESS));
                          memcpy(Modbus_Buffer+1,SET_1,sizeof(SET_1));
                          memcpy(Modbus_Buffer+9,SET_2,sizeof(SET_2));
                          memcpy(Modbus_Buffer+17,SET_3,sizeof(SET_3));
                          memcpy(Modbus_Buffer+25,(timerCount<<8),sizeof(timerCount)/2);
                          memcpy(Modbus_Buffer+26,timerCount,sizeof(timerCount)/2);
                          memcpy(Modbus_Buffer+27,&snap_status,sizeof(snap_status));
                          // UARTSend((uint8_t *)"ABCDEFGHIJKLMNOPQRSTUVWXYZ01",28);
                           UARTSend(Modbus_Buffer, sizeof(Modbus_Buffer));
                           SysCtlDelay(SOFT_DELAY);
                           slave_cmd[0]=0x00;
                           slave_cmd[1]=0x00;
                       }
                     break;
             case 0x02:
                     if(slave_cmd[1]==0x54)
                       {
                         MODBUS_TRANSMIT;
                         memcpy(Modbus_Buffer,&SLAVE_ADDRESS,sizeof(SLAVE_ADDRESS));
                         memcpy(Modbus_Buffer+1,SET_1,sizeof(SET_1));
                         memcpy(Modbus_Buffer+9,SET_2,sizeof(SET_2));
                         memcpy(Modbus_Buffer+17,SET_3,sizeof(SET_3));
                         memcpy(Modbus_Buffer+25,(timerCount<<8),sizeof(timerCount)/2);
                         memcpy(Modbus_Buffer+26,timerCount,sizeof(timerCount)/2);
                         memcpy(Modbus_Buffer+27,&snap_status,sizeof(snap_status));memcpy(Modbus_Buffer+27,&timerCount,sizeof(timerCount)/2);
                        // UARTSend((uint8_t *)"ABCDEFGHIJKLMNOPQRSTUVWXYZ01",28);
                         UARTSend(Modbus_Buffer, sizeof(Modbus_Buffer));
                         SysCtlDelay(SOFT_DELAY);
                         slave_cmd[0]=0x00;
                         slave_cmd[1]=0x00;

                       }
                     break;
             case 0x03:
                     if(slave_cmd[1]==0x54)
                       {
                         MODBUS_TRANSMIT;
                         memcpy(Modbus_Buffer,&SLAVE_ADDRESS,sizeof(SLAVE_ADDRESS));
                         memcpy(Modbus_Buffer+1,SET_1,sizeof(SET_1));
                         memcpy(Modbus_Buffer+9,SET_2,sizeof(SET_2));
                         memcpy(Modbus_Buffer+17,SET_3,sizeof(SET_3));
                         memcpy(Modbus_Buffer+25,(timerCount<<8),sizeof(timerCount)/2);
                         memcpy(Modbus_Buffer+26,timerCount,sizeof(timerCount)/2);
                         memcpy(Modbus_Buffer+27,&snap_status,sizeof(snap_status));memcpy(Modbus_Buffer+27,&timerCount,sizeof(timerCount)/2);
                        // UARTSend((uint8_t *)"ABCDEFGHIJKLMNOPQRSTUVWXYZ01",28);
                         UARTSend(Modbus_Buffer, sizeof(Modbus_Buffer));
                         SysCtlDelay(SOFT_DELAY);
                         slave_cmd[0]=0x00;
                         slave_cmd[1]=0x00;
                       }
                     break;
             case 0x04:
                     if(slave_cmd[1]==0x54)
                       {
                         MODBUS_TRANSMIT;
                         memcpy(Modbus_Buffer,&SLAVE_ADDRESS,sizeof(SLAVE_ADDRESS));
                         memcpy(Modbus_Buffer+1,SET_1,sizeof(SET_1));
                         memcpy(Modbus_Buffer+9,SET_2,sizeof(SET_2));
                         memcpy(Modbus_Buffer+17,SET_3,sizeof(SET_3));
                         memcpy(Modbus_Buffer+25,(timerCount<<8),sizeof(timerCount)/2);
                         memcpy(Modbus_Buffer+26,timerCount,sizeof(timerCount)/2);
                         memcpy(Modbus_Buffer+27,&snap_status,sizeof(snap_status));                        // UARTSend((uint8_t *)"ABCDEFGHIJKLMNOPQRSTUVWXYZ01",28);
                         UARTSend(Modbus_Buffer, sizeof(Modbus_Buffer));
                         SysCtlDelay(SOFT_DELAY);
                         slave_cmd[0]=0x00;
                         slave_cmd[1]=0x00;

                       }
                     break;
             case 0x05:
                     if(slave_cmd[1]==0x54)
                       {
                         MODBUS_TRANSMIT;
                         memcpy(Modbus_Buffer,&SLAVE_ADDRESS,sizeof(SLAVE_ADDRESS));
                         memcpy(Modbus_Buffer+1,SET_1,sizeof(SET_1));
                         memcpy(Modbus_Buffer+9,SET_2,sizeof(SET_2));
                         memcpy(Modbus_Buffer+17,SET_3,sizeof(SET_3));
                         memcpy(Modbus_Buffer+25,(timerCount<<8),sizeof(timerCount)/2);
                         memcpy(Modbus_Buffer+26,timerCount,sizeof(timerCount)/2);
                         memcpy(Modbus_Buffer+27,&snap_status,sizeof(snap_status));                  // UARTSend((uint8_t *)"ABCDEFGHIJKLMNOPQRSTUVWXYZ01",28);
                         UARTSend(Modbus_Buffer, sizeof(Modbus_Buffer));
                         SysCtlDelay(SOFT_DELAY);
                         slave_cmd[0]=0x00;
                         slave_cmd[1]=0x00;
                       }
                     break;

     }*/



   }
}

此致

霍迪达斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     很抱歉,我  不知道 Modbus。 命令 L/D 和 S/E 之间有何区别? 不确定我能在这里提供多少帮助。 我看到下面的代码行。 您是否正在尝试使用 Bit-bang MODBUS? 再说一次、我对 MODBUS 一无所知、也不知道从哪里开始。 如果   MODBUS_Transmit 只是写入 GPIO 引脚、我看不到问题。  

    #define MODBUS_Transmit (GPIOPinWrite (GPIO_PORTP_BASE、GPIO_PIN_2、GPIO_PIN_2))

    我只能建议您是否可以增加堆和堆栈大小。 这会产生影响吗?  

    有一些 TI-RTOS 的以太网示例可从 CCS Resource Explorer 下载。 您能否运行这些示例? 您是否看到任何断开问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    没有此类特定命令、它是用户界面(主机)通过以太网发送到客户端(设备)的值、其中我在接收时接收单个字符、如"S"、"L"、"E"、"D"、 条件就能完美工作。 但是、当接收到的字符为"L"或"D"时 、以太网断开连接。

    唯一 需要考虑 的是当接收到"S"时、器件会将数据传输到主机、因此我们需要在数据传输期间发送"L"或"D"。 器件在接收到字符时停止数据传输。 我们还注意到、在"L"和"D"的条件下、如果我们进行注释和不执行任何操作、那么它就可以完美地工作。 那么、为什么会发生这种情况。、  

    if (strcmp (rcvd_data、"E")=0)//停止

    START_STP_LED_OFF;
    Timer_ON=0;
    SYNC_STOP;
    Modbus_transmit;
    UARTSend (((uint8_t *)"e"、1);
    SysCtlDelay (SOFT_DELAY);
    Timer_Stop ();
    timerCount=0;

    if (strcmp (rcvd_data、"L")==0)

    //SNAP1_ON;
    //Snap2_on;
    snap 状态= 1;
    SNAP_ON=1;
    Rcvd_data[0]= 0;
    //MODBUS_Transmit;
    //UARTSend ((uint8_t *)"L"、1);
    //SysCtlDelay (SOFT_DELAY);

    if (strcmp (rcvd_data、"D")=0)

    //SNAP1_OFF;
    //Snap2_off;
    snap _off = 1;
    SNAP_STATUS=0;
    Rcvd_data[0]= 0;
    //MODBUS_Transmit;
    //UARTSend ((uint8_t *)"U"、1);
    //SysCtlDelay (SOFT_DELAY);

    此致

    霍迪达斯

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     我之前问过、增加堆和堆栈大小是否有帮助? 你没有回答我。 请尝试一下吗?

     降低  SOFT_DELAY 会产生影响吗?  

     抱歉、由于我的 NDK 有限、我真的不知道如何解决您的问题。  请查看以下帖子和解决方案、了解它们是否与您的结果有任何不同。 我真的不知道哪一个适用于您。  

    此帖子使用 SO_KEEPALIVE 选项来保持连接。  

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/513818/so_keepalive-usage?tisearch=e2e-sitesearch&keymatch=SO_KEEPALIVE#

    此帖子介绍了如何使用 SO_LINGER 选项、以便在连接关闭后、连接不会停留在超过该值的范围内。  

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1019830/ek-tm4c1294xl-tcp-client-sockets-creation-fails-after-10-times-socket-calls/3770705#3770705

    这篇文章介绍了关闭插座清洁的重要性。  

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/490061/tm4c129xx-ti-rtos-ndk-tcp-ip-socket-re-connect-issue