工具/软件:Code Composer Studio
你(们)好
我正在寻找一个在 Tiva C 微控制器中使用 LWIP 堆栈的示例、我浏览了工作簿示例 enet_lwip、 但我不知道如何修改它、我能够从 ADC 读取一些数据、我想通过以太网发送它。
如果有人为我提供了一个起点或一个指南、我可以按照该指南在 Code Composer 中实施 lwip 堆栈、我只想了解如何通过 TCP 发送数据包
提前感谢
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.
工具/软件:Code Composer Studio
你(们)好
我正在寻找一个在 Tiva C 微控制器中使用 LWIP 堆栈的示例、我浏览了工作簿示例 enet_lwip、 但我不知道如何修改它、我能够从 ADC 读取一些数据、我想通过以太网发送它。
如果有人为我提供了一个起点或一个指南、我可以按照该指南在 Code Composer 中实施 lwip 堆栈、我只想了解如何通过 TCP 发送数据包
提前感谢
尊敬的 Charles、感谢您的回答
按照您分享的链接中的说明、我尝试修改 enet_lwip、但我没有成功、我可以 ping 到板、但看不到正在发送数据包(我尝试在 PuTTy 和浏览器中打开原始连接)、 我使用 UART 消息来了解正在发生的情况、似乎无法进入"connectedCallback"并发送数据包。
这是我的代码、如果你能给它一个外观就好了
#include
#include
#include
#include
include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "driverlib/flash.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "drivers/rtc
out_util.h"
#include "drivers/truni.pnech #include "out_out_trintrune.h"#include "tctruni_utils/tude/tpintrinh #include "out_utils/tex"#include "out_trintrintrun.ld/tudes.h"#include "out_utils/tpinh #include "out.ld/truni_utils"#include "#tex"#tpintrintrintrintrintru.h"
ERR_t ECHO_POLL (void *arg、struct tcp_pcb);
void ECHO_ERROR (void *arg、ERR_t err);
err_t ECHO_SENT (void *arg、 struct tcp_pcb * tpcb、u16_t len);
err_t err;
uint32_t tcp_send_packet (void);
static struct tcp_pcb * testpcb;//pcb 全局
#define SYSTICKHZ 100
#define SYSTICKMS (1000/SYSTICKHZ)
#define SysTK_INT_PRIORITY 0x80
#define ETHERNET_INT_PRIORITY 0xC0
uINT32_t g_ui32IPAddress;
uINT32_t g_ui32SysClock;
volatile bg_bled;
//*********
//驱动程序库遇到错误时调用的错误例程。
//
#ifdef debug
void
__error__(char *pcFilename、uint32_t ui32Line)
{
#endif
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;
ui32NewIPAddress = lwIPLocalIPAddrGet ();//获取当前 IP 地址。
if (ui32NewIPAddress!= g_ui32IPAddress)//查看 IP 地址是否已更改。
{
if (ui32NewIPAddress == 0xffffffff)
{
UARTprintf ("正在等待链接。\n");
}
否则、如果(ui32NewIPAddress =0)
{
UARTprintf ("正在等待 IP 地址。\n");
}
其他
{
UARTprintf ("IP 地址:");
DisplayIPAddress (ui32NewIPAddress);
UARTprintf ("\n 打开浏览器并输入 IP 地址。\n");
}
G_ui32IPAddress = ui32NewIPAddress;
}
if ((ui32NewIPAddress =0)||(ui32NewIPAddress =0xffffffff))
{
//
//不执行任何操作并继续等待。
//
}
}
//*********
// SysTick 中断的中断处理程序。
//
void
SysTickIntHandler (void)
{
lwIPTimer (SYSTICKMS);
G_bled = true;
}
//*********
ERR_t tcpRecvCallback (void *arg、struct tcp_pcb、struct pbuf *p、err_t err)
{
UARTprintf ("接收到的数据。\n");
if (p = NULL){
UARTprintf ("远程主机关闭了连接。\n");
UARTprintf ("正在关闭连接。\n");
tcp_close (testpcb);
返回 ERR_ABRT;
} 否则{
UARTprintf (" pbufs %d\n"、pbuf_clen (p)的数量);
UARTprintf (" pbuf %s\n"的内容、(char *) p->payload);
}
返回0;
}
uint32_t tcp_send_packet (void)
{
char *字符串="head /process.php?data1=12&data2=5 HTTP/1.0\r\n 主机:mywebsite.com\r\n\r\n ";
uint32_t len = strlen (string);
ERR = tcp_write (testpcb、string、strlen (string)、tcp_write_flag_copy);
如果(err){
UARTprintf ("错误:代码:%d (tcp_send_packet::tcp_write)\n"、错误);
返回1;
}
/*现在发送*/
ERR = tcp_output (testpcb);
如果(err){
UARTprintf ("错误:代码:%d (tcp_send_packet::tcp_output)\n"、错误);
返回1;
}
返回0;
}
ERR_t connectCallback (void *arg、struct tcp_pcb、err_t err)
{
UARTprintf ("连接已建立。\n");
UARTprintf ("发送数据包\n");
tcp_send_packet();
返回0;
}
void tcp_setup (void)
{
uint32_t data = 0xdeadf牛肉;
/*创建 IP */
struct ip_addr ip;
IP4_ADDR (&IP、192、168、0、4);计算机的/IP
/*创建控制块*/
testpcb = tcp_new();//testpcb 是一个全局结构 tcp_pcb
tcp_arg (testpcb、&data);
tcp_err (testpcb、echo_error);
tcp_recv (testpcb、tcpRecvCallback);
tcp_sent (testpcb、echo_sent);
/*现在连接*/
tcp_connect (testpcb、&IP、80、connectCallback);
UARTprintf ("PCB created n");
}
int
main (void)
{
uint32_t ui32User0、ui32User1;
uint8_t pui8MACArray[8];
SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ);
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_480)、120000000);
PinoutSet (true、false);
UARTStdioConfig (0、115200、g_ui32SysClock);
UARTprintf ("\033[2J\033[H");
UARTprintf ("以太网 lwIP 示例\n\n");
MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1);
MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、~GPIO_PIN_1);
MAP_SysTickPeriodSet (g_ui32SysClock / SYSTICKHZ);
map_SysTickEnable();
map_SysTickIntEnable();
map_FlashUserGet (&ui32User0、&ui32User1);
if ((ui32User0 == 0xffffffff)||(ui32User1 == 0xffffffff)
{
UARTprintf ("未对 MAC 进行编程!\n");
while (1)
{
}
}
UARTprintf ("正在等待 IP.\n");
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);
lwIPInit (g_ui32SysClock、pui8MACArray、0、0、0、 ipaddr_use_dhcp);
//
//设置设备定位服务。
//
LocatorInit();
LocatorMACAddrSet (pui8MACArray);
LocatorAppTitleSet ("EK-TM4C1294XL enet_IO");
//初始化示例 httpd 服务器。
//
// httpd_init();
echo_init();
tcp_setup();
MAP_IntPrioritySet (INT_EMAC0、ETHERNET_INT_PRIORITY);
MAP_IntPrioritySet (FAULT_SysTick、SysTK_INT_PRIORITY);
//
//循环永久、处理 LED 闪烁。 所有工作都在中完成
//中断处理程序。
//
while (1)
{
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);
}
}
我还在第三方文件夹中添加了来自 LWIP 的 TCP 应用程序
我将电路板连接到路由器、COM 端口会发送此消息
在我的计算机中、我只获得拒绝连接
我怀疑我缺少一些明显的东西、如果有任何帮助、我将不胜感激
最好
当然、这里是我使用的文件。 此致