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.
大家好、
我的淘汰是使用 TCP/IP 协议栈将收集到的 ADC 数据从 TM4C1294NCPDT 控制器传输到特定网站、我在 这里的 TI 论坛上找到了一些示例代码、我只是按照 代码操作、键入 IP 时、会显示 Web 浏览器、 但 没有 TCP 数据包传输的症状。
注意:我只需将 TCB_BIND()与代码一起添加,但它对我来说仍然不起作用。 请任何人告诉我什么是问题、并指导我解决问题
我的计算机和电路板都连接到办公室 LAN 端口,这是我的代码。
//
//
// enet_lwip.c -使用 lwIP 的 WebServer 应用示例。
//
//版权所有(c) 2013-2017 Texas Instruments Incorporated。 保留所有权利。
//软件许可协议
//
//德州仪器(TI)仅提供和使用此软件
//专门用于 TI 的微控制器产品。 该软件归其所有
// TI 和/或其供应商、受适用版权保护
//法律。 您不能将此软件与"病毒"开源软件结合使用
//软件,以便形成一个更大的程序。
//
//此软件按“原样”提供,且存在所有故障。
//不作任何明示、暗示或法定的保证,包括但
//不限于对适销性和适用性的暗示保证
//此软件的特定用途。 TI 不得以任何方式进行
//情况,对特殊、偶然或从属事件负责
//任何原因造成的损害。
//
//这是 EK-TM4C1294XL 固件包版本2.1.4.178的一部分。
//
//
#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 "driverlib/rom_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/SysTick .h"
#include "utils/locator.h"
#include "utils/lwiplib.h"
#include "utils/ustdlib.h"
#include "utils/uartstdio.h"
#include "httpserver_raw/httpd.h"
#include "tcpecho_raw/echo.h"
#include "tcpecho_raw/echo.c"
#include "drivers/pinout.h"
#include "lwip/debug.h"
#include "lwip/stats.h"
#include "lwip/tcp.h"
#include "unit/lwipopts.h"
//
//
//! \addtogroup example_list
//!
//
//
extern void echo_init (void);
ERR_t ECHO_recv (void *arg、struct tcp_pcb、struct pbuf *p、err_t err);
ERR_t ECHO_POLL (void *arg、struct tcp_PCB *tpcb);
void echo_error (void *arg、err_t err);
ERR_t ECHO_SENT (void *arg、struct tcp_pcb、u16_t len);
ERR_t 错误;
//extern void lwip_init();
uint32_t tcp_send_packet (void);
静态结构 tcp_pcb *testpcb;//pcb 全局
//定义设置系统时钟。
//
//
#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;
//
//
//驱动程序库遇到错误时调用的错误例程。
//
//
#ifdef 调试
无效
_error__(char * pcFilename、uint32_t ui32Line)
{
}
#endif
//
//
//显示 lwIP 类型的 IP 地址。
//
//
无效
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 库支持任何与主机相关的计时器函数所需的。
//
//
无效
lwIPHostTimerHandler (空)
{
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 打开浏览器并输入 IP 地址。\n");
}
//
//保存新的 IP 地址。
//
G_ui32IPAddress = ui32NewIPAddress;
}
//
//如果没有 IP 地址。
//
if ((ui32NewIPAddress =0)||(ui32NewIPAddress =0xffffffff))
{
//
//不执行任何操作并继续等待。
//
}
}
//
//
// SysTick 中断的中断处理程序。
//
//
无效
SysTickIntHandler (空)
{
//
//调用 lwIP 计时器处理程序。
//
lwIPTimer (SYSTICKMS);
//
//告诉应用程序更改 LED 的状态(换句话说
//闪烁)。
//
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、70、106);计算机的/IP
/*创建控制块*/
testpcb = tcp_new();//testpcb 是一个全局结构 tcp_pcb
tcp_arg (testpcb、&data);
tcp_bind (testpcb、&ip、22);
tcp_err (testpcb、echo_error);
tcp_recv (testpcb、tcpRecvCallback);
tcp_sent (testpcb、echo_sent);
/*现在连接*/
tcp_connect (testpcb、&IP、22、connectCallback);
UARTprintf ("PCB created \n");
}
//
//
//此示例演示了以太网控制器的使用。
//
//
内部
main (空)
{
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 示例\n\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 库。
//
// lwip_init();
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();
//
//设置中断优先级。 我们将 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);
}
}
您好!
本应用手册中有一个客户端示例、用于将数据从客户端发送到服务器。 https://www.ti.com/lit/pdf/spna248