请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TM4C1294NCPDT 大家好、
我已经检查了周围情况、但除了 enet_io、enet_lwip 等、找不到更复杂和描述性的示例 我正在尝试读回 RJ45并与主机(或其他器件)通信、是否有任何其他示例。 我想看 一下 tcp_recv (PCB、SocketReceive)、tcp_accepted (PCB)等的示例?
谢谢。
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.
大家好、
我已经检查了周围情况、但除了 enet_io、enet_lwip 等、找不到更复杂和描述性的示例 我正在尝试读回 RJ45并与主机(或其他器件)通信、是否有任何其他示例。 我想看 一下 tcp_recv (PCB、SocketReceive)、tcp_accepted (PCB)等的示例?
谢谢。
您好!
下面是服务器上 TCP 回显的一个简单示例。 您可以找到类似的示例@
。
#include
#include
include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/flash.h"
#include "driverlib/interrupt.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"
#include "drivers/util.h
//
//定义设置系统时钟。
////
*****************
#define SYSTICKHZ 100
#define SYSTICKMS (1000 / SYSTICKHZ)
//*********
//
//中断优先级定义。 这些值的前3位是
//有效的、较低的值表示较高优先级的中断。
////
*****************
#define SysTK_INT_PRIORITY 0x80
#define ETHERNET_INT_PRIORITY 0xC0
//*********
//
//当前 IP 地址。
////
*****************
uint32_t g_ui32IPAddress;
//*********
//
//系统时钟频率。
////
*****************
uint32_t g_ui32SysClock;
//*********
//
//用于管理 LED 闪烁的易失性全局标志,因为它用于中断
//和主应用程序。 LED 以 SYSTICKHZ 的速率闪烁。
////
*****************
volatile bool g_bled;
void echo_init (void);
//*********************
//
//显示 lwIP 类型的 IP 地址。
////
*****************
void
DisplayIPAddress (uint32_t ui32Addr)
{
char pcBuf[16];
//
//将 IP 地址转换为字符串。
//
usprintf (pcBuf、"%d.%d.%d.%d"、ui32Addr & 0xff、(ui32Addr >> 8)& 0xff、
(ui32Addr >> 16)& 0xff、(ui32Addr >> 24)& 0xff);
//
//显示字符串。
//
UARTprintf (pcBuf);
}
//*************
//
// lwIP 库支持任何与主机相关的计时器函数所需的//。
////
*****************
void
lwIPHostTimerHandler (void)
{
uint32_t ui32NewIPAddress;
//
//获取当前 IP 地址。
//
ui32NewIPAddress = lwIPLocalIPAddrGet ();
//
//查看 IP 地址是否已更改。
//
if (ui32NewIPAddress!= g_ui32IPAddress)
{
//
//查看是否分配了 IP 地址。
//
if (ui32NewIPAddress == 0xffffffff)
{
//
//表示没有链接。
//
UARTprintf ("正在等待链接。\n");
}
否则、如果(ui32NewIPAddress =0)
{
//
//没有 IP 地址,因此请指明 DHCP 进程是什么
//正在运行。
//
UARTprintf ("正在等待 IP 地址。\n");
}
其他
{
//
//显示新的 IP 地址。
//
UARTprintf ("IP 地址:");
DisplayIPAddress (ui32NewIPAddress);
UARTprintf ("\n 回显服务器已就绪。\n");
}
//
//保存新的 IP 地址。
//
G_ui32IPAddress = ui32NewIPAddress;
}
//
//如果没有 IP 地址。
//
if ((ui32NewIPAddress =0)||(ui32NewIPAddress =0xffffffff))
{
//
//不执行任何操作并继续等待。
//
}
}
//*********
//
// SysTick 中断的中断处理程序。
////
*****************
void
SysTickIntHandler (void)
{
//
//调用 lwIP 计时器处理程序。
//
lwIPTimer (SYSTICKMS);
//
//告诉应用程序更改 LED 的状态(换句话说
//闪烁)。
//
G_bled = true;
}
//*********
//
//此示例演示了以太网控制器的使用。
////
*****************
int
main (void)
{
uint32_t ui32User0、ui32User1;
uint8_t pui8MACArray[8];
//
//确保主振荡器已启用,因为这是所要求的
// PHY。 系统必须将一个25MHz 晶体连接到 OSC
//引脚。 晶体时使用 SYSCTL_MOSC_HIGHFREQ 参数
//频率为10MHz 或更高。
//
SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ);
//
//从 PLL 以120MHz 运行。
//
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
//
//配置器件引脚。
//
PinoutSet (true、false);
//
//配置 UART。
//
UARTStdioConfig (0、115200、g_ui32SysClock);
//
//清除终端并打印横幅。
//
UARTprintf ("\033[2J\033[H");
UARTprintf ("以太网 lwIP TCP 回显示例\n");
//
//将的端口 N1配置为动画 LED 的输出。
//
MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1);
//
//将 LED 初始化为关闭(0)
//
MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、~GPIO_PIN_1);
//
//为周期性中断配置 SysTick。
//
MAP_SysTickPeriodSet (g_ui32SysClock / SYSTICKHZ);
map_SysTickEnable();
map_SysTickIntEnable();
//
//为的以太网控制器过滤配置硬件 MAC 地址
//传入数据包。 MAC 地址将存储在非易失性存储器中
// USER0和 User1寄存器。
//
map_FlashUserGet (&ui32User0、&ui32User1);
if ((ui32User0 == 0xffffffff)||(ui32User1 == 0xffffffff)
{
//
//我们永远不应该来这里。 如果 MAC 地址有、则这是一个错误
//未编程到器件中。 退出程序。
//告知用户没有 MAC 地址
//
UARTprintf ("未对 MAC 进行编程!\n");
while (1)
{
}
}
//
//告诉用户我们现在正在做什么。
//
UARTprintf ("正在等待 IP.\n");
//
//将24/24拆分 MAC 地址从 NV RAM 转换为32/16拆分 MAC
//对硬件寄存器进行编程所需的地址,然后对 MAC 进行编程
//将地址输入以太网控制器寄存器。
//
pui8MACArray[0]=((ui32User0 >> 0)& 0xff);
pui8MACArray[1]=((ui32User0 >> 8)& 0xff);
pui8MACArray[2]=((ui32User0 >> 16)& 0xff);
pui8MACArray[3]=((ui32User1 >> 0)& 0xff);
pui8MACArray[4]=((ui32User1 >> 8)& 0xff);
pui8MACArray[5]=((ui32User1 >> 16)& 0xff);
//
//使用 DHCP 初始化 lwIP 库。
//
lwIPInit (g_ui32SysClock、pui8MACArray、0、0、0、 ipaddr_use_dhcp);
//
//设置设备定位服务。
//
echo_init();
//
//设置中断优先级。 我们将 SysTick 中断设置为更高的值
//优先级比以太网中断高,以确保文件系统
如果 SysTick 在以太网处理程序运行时发生、则处理// tick
//已处理。 这很可能是因为所有 TCP/IP 和 HTTP 工作都是
//在以太网中断上下文中完成。
//
MAP_IntPrioritySet (INT_EMAC0、ETHERNET_INT_PRIORITY);
MAP_IntPrioritySet (FAULT_SysTick、SysTK_INT_PRIORITY);
//
//循环永久、处理 LED 闪烁。 所有工作都在中完成
//中断处理程序。
//
while (1)
{
//
//等待 SysTick 中断指示更改的状态
// LED。
//
while (g_bled == false)
{
}
//
//清除标志。
//
G_bled = false;
//
//切换 LED。
//
MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、
(MAP_GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1)^
GPIO_PIN_1);
}
}
char tcp_buffer[4096]={0};
静态 void close_conn (struct tcp_pcb *pcb)
{
tcp_arg (PCB、NULL);
tcp_sent (PCB、NULL);
tcp_recv (PCB、NULL);
tcp_close (pcb);
}
static err_t echo_recv (void *arg、struct tcp_pcb * pcb、struct pbuf * p、err_t err)
{
int i;
int len;
char *p;
如果(err =ERR_OK && p != NULL)
{
tcp_recved( pcb,p->t_t_len );
PC =(char *) p->payload;
len =p->t_t_len;
for (i=0;i tcp_sndbuf( PCB ))
len = tcp_sndbuf( pcb );
tcp_write( pcb、tcp_buffer、len、0 );
tcp_sent( pcb,NULL );
}
其他
{
pbuf_free (p);
}
if (err =ERR_OK && p =NULL)
{
close_conn( PCB );
}
返回 ERR_OK;
}
静态 ERR_t ECHO_ACCEPT (void *arg、struct tcp_pcb * pcb、err_t err)
{
//此宏可避免在构建时发出警告
LWIP_unused_arG( arg );
LWIP_unused_arG( err );
tcp_setprio( pcb、tcp_prio_min );
tcp_recv( pcb、eco_recv );
tcp_err( pcb,NULL );
tcp_poll (PCB,NULL,10);
返回 ERR_OK;
}
void echo_init( void ){
struct tcp_pcb *tcp_pcb;
//创建新的 TCP 连接标识符(PCB)。
tcp_pcb = tcp_new();
tcp_bind (tcp_pcb、ip_ADDR_any、23);
tcp_pcb = tcp_listen ( tcp_pcb );
tcp_accept ( tcp_pcb、echo_accept );
}