- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
亲爱的 StackOverflowers,
我正在开展一个项目,使用 Microchip 的 TCP/IP 堆栈在我的自定义(和测试)板上的 PIC18F87J60 上实现一些东西。作为测试,我编写了一些代码来设置连接,将其保持 x 秒,然后优雅地关闭它。我已经将它实现为一个有限状态机。我还没有添加发送和接收数据。
但是,我的程序无法建立连接。使用 Wireshark 我注意到我的设备通过 DHCP 成功接收到 IP 地址并且 ARP 解析正确完成。我现在省略了 DNS,因为这也会出错,但我稍后会解决这个问题。我还看到第一个 SYN 数据包由我的设备发送并由服务器回复,但 3 次握手中的 3e 步骤出错了。确认号只是一个随机数,因此服务器会感到困惑并使用 RST 数据包重置连接。然后我的设备使用带有另一个随机序列号的 ACK 数据包确认重置,并且服务器以某种方式接受该数据包。然后服务器尝试使用 SYN 数据包再次建立连接,但我的代码不监听传入连接,因此连接结束。
这是我的代码:
#define THIS_IS_STACK_APPLICATION
#include "TCPIP.h"
APP_CONFIG AppConfig;
ROM char serverAddress[] = "data.zienu.eu"; //unused in this codefile: DNS doesn't work yet
ROM char serverIP[] = "80.69.92.56";
short authenticationPort = 5588;
typedef enum _SOCKET_STATE {
SOCKET_DONE = 0,
SETUP_CONNECTION,
CONNECTING,
CONNECTED,
AWAITING_ANSWER,
SENDING_DATA,
CLOSE_CONNECTION,
DISCONNECTING,
DISCONNECTED
} SOCKET_STATE;
typedef struct _CONNECTION {
TCP_SOCKET socketID;
SOCKET_INFO* remoteInfo;
const char* remoteHostName;
WORD remotePort;
SOCKET_STATE state, previousState;
DWORD timeOut;
BYTE purpose;
} CONNECTION;
void InitHardware();
void AuthenticateTask();
void FTPDownloadTask();
void HandleTCPConnection(CONNECTION* connection);
ROM BYTE SerializedMACAddress[6] = {MY_DEFAULT_MAC_BYTE1, MY_DEFAULT_MAC_BYTE2, MY_DEFAULT_MAC_BYTE3, MY_DEFAULT_MAC_BYTE4, MY_DEFAULT_MAC_BYTE5, MY_DEFAULT_MAC_BYTE6};
void InitAppConfig(void) {
AppConfig.Flags.bIsDHCPEnabled = TRUE;
AppConfig.Flags.bInConfigMode = TRUE;
memcpypgm2ram((void*)&AppConfig.MyMACAddr, (ROM void*)SerializedMACAddress, sizeof(AppConfig.MyMACAddr));
AppConfig.MyIPAddr.Val = MY_DEFAULT_IP_ADDR_BYTE1 | MY_DEFAULT_IP_ADDR_BYTE2<<8ul | MY_DEFAULT_IP_ADDR_BYTE3<<16ul | MY_DEFAULT_IP_ADDR_BYTE4<<24ul;
AppConfig.DefaultIPAddr.Val = AppConfig.MyIPAddr.Val;
AppConfig.MyMask.Val = MY_DEFAULT_MASK_BYTE1 | MY_DEFAULT_MASK_BYTE2<<8ul | MY_DEFAULT_MASK_BYTE3<<16ul | MY_DEFAULT_MASK_BYTE4<<24ul;
AppConfig.DefaultMask.Val = AppConfig.MyMask.Val;
AppConfig.MyGateway.Val = MY_DEFAULT_GATE_BYTE1 | MY_DEFAULT_GATE_BYTE2<<8ul | MY_DEFAULT_GATE_BYTE3<<16ul | MY_DEFAULT_GATE_BYTE4<<24ul;
AppConfig.PrimaryDNSServer.Val = MY_DEFAULT_PRIMARY_DNS_BYTE1 | MY_DEFAULT_PRIMARY_DNS_BYTE2<<8ul | MY_DEFAULT_PRIMARY_DNS_BYTE3<<16ul | MY_DEFAULT_PRIMARY_DNS_BYTE4<<24ul;
AppConfig.SecondaryDNSServer.Val = MY_DEFAULT_SECONDARY_DNS_BYTE1 | MY_DEFAULT_SECONDARY_DNS_BYTE2<<8ul | MY_DEFAULT_SECONDARY_DNS_BYTE3<<16ul | MY_DEFAULT_SECONDARY_DNS_BYTE4<<24ul;
// Load the default NetBIOS Host Name
memcpypgm2ram(AppConfig.NetBIOSName, (ROM void*)MY_DEFAULT_HOST_NAME, 10);
FormatNetBIOSName(AppConfig.NetBIOSName);
}
void InitHardware() {
/** \var isBoot (LATH0_bit) tells the boot-interrupt handler that boot is busy */
LATHbits.LATH0 = 1;
ADCON1 |= 0x0f; // adc pins as I/0
CMCON |= 7; // Disable comperator
OSCCON = 0x04;
OSCTUNE = 0x40; //41 MHz
/******************************************************************/
// init========
// Het TRISA en TRISF register moeten goed zijn ingesteld voor de analoge input:
PORTA = 0x00;
TRISA = 0x20; /* Bit 1 and 2 are used by ethernet LEDS */
PORTB = 0x00;
TRISB = 0x00; /* output mode */
PORTC = 0x03; /* LED R en G off */
TRISC = 0xc0; /* Bit 6 and 7 are used by UART 1 */
PORTD = 0x00; /* used to display ethernetsecond_timer in DEBUG mode*/
TRISD = 0x00; /* output mode */
PORTE = 0x00;
TRISE = 0x00; /* output mode */
PORTF = 0x00;
TRISF = 0x0E; /* output mode */
PORTG = 0x00;
TRISG = 0x00;
PORTH = 0x00;
TRISH = 0x00;
/* interrupt priorities are possible with microC */
IPR1bits.ADIP = 0; //give ADC LOW interrupt priority
RCONbits.IPEN = 1; //Enable interrupt priorities
INTCON2bits.RBPU = 1; // Disable internal PORTB pull-ups
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 1;
}
void interrupt low_priority LowISR(void) {
TickUpdate();
}
void interrupt HighISR(void) {
}
void HandleTCPConnection(CONNECTION* connection) {
switch(connection->state) {
case SETUP_CONNECTION:
if(!AppConfig.Flags.bInConfigMode) {
connection->socketID = TCPOpen((DWORD) (PTR_BASE)&serverIP[0], TCP_OPEN_ROM_HOST, connection->remotePort, connection->purpose);
connection->timeOut = TickGet() + TICK_SECOND * 15;
connection->previousState = SETUP_CONNECTION;
connection->state = CONNECTING;
TCPWasReset(connection->socketID);
}
break;
case CONNECTING:
if(TCPIsConnected(connection->socketID)) {
connection->previousState = CONNECTING;
connection->state = CONNECTED;
connection->remoteInfo = TCPGetRemoteInfo(connection->socketID);
connection->timeOut = TickGet() + TICK_SECOND * 10;
}
else if(TickGet() >= connection->timeOut) {
connection->previousState = CONNECTING;
connection->state = CLOSE_CONNECTION;
}
break;
case CONNECTED:
if(TickGet() >= connection->timeOut) {
connection->previousState = CONNECTED;
connection->state = CLOSE_CONNECTION;
}
else if(TCPWasReset(connection->socketID)) {
connection->previousState = CONNECTED;
connection->state = CLOSE_CONNECTION;
}
break;
case CLOSE_CONNECTION:
connection->previousState = CLOSE_CONNECTION;
connection->state = DISCONNECTING;
TCPDisconnect(connection->socketID); //Send a TCP FIN packet
connection->timeOut = TickGet() + TICK_SECOND * 5;
break;
case DISCONNECTING:
if(TCPIsConnected(connection->socketID)) {
connection->previousState = DISCONNECTING;
connection->state = DISCONNECTED;
}
else if(TickGet() >= connection->timeOut) {
TCPDisconnect(connection->socketID);
TCPDisconnect(connection->socketID); //Time out: Send a RST packet and proceed
connection->previousState = DISCONNECTING;
connection->state = DISCONNECTED;
}
break;
case DISCONNECTED:
connection->previousState = DISCONNECTED;
connection->state = SOCKET_DONE;
break;
case SOCKET_DONE:
break;
default:
break;
}
}
void main() {
InitHardware();
TickInit();
InitAppConfig();
StackInit();
CONNECTION connection;
connection.purpose = TCP_PURPOSE_CUSTOM_FTP_CMD;
connection.remoteHostName = serverIP;
connection.remotePort = authenticationPort;
connection.previousState = SOCKET_DONE;
connection.state = SETUP_CONNECTION;
while(TRUE) {
HandleTCPConnection(&connection);
StackTask();
StackApplications();
}
}
这是 Wireshark logs 的屏幕截图.
提前致谢,比特垃圾
编辑:这是 wireshark dumpfile .我过滤了 MAC 地址,因此此转储中未显示部分 DHCP 过程。
最佳答案
我解决了这个问题。我认为 TCPIP 堆栈与高科技编译器兼容,但似乎并非如此。 C18 和 XC8 编译器与我发布的代码完美配合。
问候 BitJunky
关于tcp - Microchip TCP/IP 堆栈 PIC18F 无效数据包序列号/确认号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13685790/
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
让我们快速回顾一下以下案例: 不将动态链接与位置无关代码相结合。我可能敢说这是一个不可能的案例,但当我深入探讨这个主题时,我不太确定。 将静态链接与位置无关代码相结合。我相信这作为一个有效的组合是完全
我正在将一个线程局部变量添加到几个始终直接链接到可执行文件的目标文件中。这些对象永远不会包含在共享库中(并且可以安全地假设这在可预见的 future 会成立)。这意味着这些对象不需要 -fPIcfla
这个问题与this one有关以及它的答案。 我刚刚在我正在处理的构建中发现了一些丑陋之处。情况看起来有点像下面(用gmake格式写的);请注意,这特别适用于 sparc 和 x86 硬件上的 32
我在 PIC 的 mikroC 中实现基于定时器的中断时遇到问题。 如果 PORTC.F0 处有按键,我想切换端口引脚 8 次,并且切换之间应该有 100 毫秒的延迟。 通常使用延迟函数这会很容易 f
我试图通过 SPI 通信让 PIC1 成为主机,PIC2 成为从机。我想从 PIC1(master)发送命令到 PIC2(slave),然后让它做一些事情。但是,我也想通过 SPI 通信建立从 PIC
我正在使用 cvSplit() 来分离 RGB channel 并将它们打印在 3 个不同的图像中,显示颜色 r、g 和 b。但我只有黑白照片的 BW 图像。这是使用 cvSplit() 时的正确输出
初始化以下变量时: 01 BATCH-REC. 03 BATCH-VERSION PIC X(2). 03 BATCH-FIELDS
当我在学习 javafx 教程并尝试为 ImageView 创建一个新的 Image 实例以将其用于 TreeView 时,我注意到导师曾经创建一个 ImageView:new ImageView(n
我正在研究 PIC16F887,我的任务主要基于 adc 读数(8 位)。有 10 个不同的模拟输入,因此逐个读取它们需要相当长的时间。时钟为 20Mhz,adc 唯一允许的设备频率为 Fosc/32
我有一 block 带有特殊 UEXT connector 的 Olimex A20 板它可以连接 SPI、I2C 和 RS 232。我喜欢使用 Olimex 的 MOD Zigbee 模块直接通过
有没有办法在不使用pickit型编程器的情况下编程(闪存)裸(尚未使用引导加载程序闪存)pic32芯片? 例如,是否有任何正在进行的 JTAG 项目? 最佳答案 建议您引用Microchip PIC3
阅读时this blogpost , 当作者试图证明共享库需要 PIC 时,我遇到了以下情况。 If your shared library is built to only work when lo
我是 PIC mcu 的新手。我使用 pic12f675 MPLAB 和 XC8 来制作 LED 多次闪烁模式。 我有按钮问题(经过审查,它调用了 Bounce 和 Debounce)。 有时当我按下
是否有用于不可屏蔽中断的独立通信总线绕过可编程中断 Controller ? 或者 PIC 是否管理所有中断,但按照约定传递所有不可屏蔽中断? 这是否取决于架构,或者是否有特定的理由选择其中一种而不是
我想问一下如何在PIC C编译器中为PIC18f4620编写代码,以便在模拟输入之一为1时传输日期 最佳答案 对于这个网站来说,这个问题实在是太宽泛了。如何编写代码取决于您使用的 PIC C 编译
我是 PIC 编程新手,正在使用 MPLAb。我有一个关于中断的问题..所以我想做的是,当我按下按钮时,我想打开 LED 0,如果我松开按钮,则打开 LED 1。我认为我编写的代码有意义,但它不起作用
我想用我的PIC18F4550、蓝牙模块HC-06和电脑做一个简单的测试。我的意思是,我想使用蓝牙模块将一个简单的字符从 PIC 发送到 PC。 它应该在终端中出现一个“A”,但出现的是十六进制的 F
所以我使用的微型芯片是 PIC 18F。 如果设置了Alarm_Status.bits.b3(本质上只是一个开关),则会创建警报。第一个代码片段按其应有的方式工作 BS(TRISB,7);
经过大量的试错和堆砌,我(我们)设法让两张图片以一种非常特殊的方式重叠: 这是这样实现的: .container { width: 900px; margin: auto; } .center
我是一名优秀的程序员,十分优秀!