[求助] 基于回调函数的lwip

taosui720   2011-8-4 19:27 楼主
今天无操作系统基于回调函数的lwip遇到个问题,常量字符串tcp_write+tcp_output能发出去,但是变量字符型数组或指针就没法发送出去,似乎被阻塞了,不知道大家有没有遇到过这个情况

回复评论 (5)

好像不能发变量,而是打包成一数据包,这个包么应是UCHAR型的

http://shop34182318.taobao.com/ https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
点赞  2011-8-4 20:28

回复 沙发 ddllxxrr 的帖子

char RecivePcBuf[30];
char Filename[30];
char temp_data[30];
int i;
unsigned short usBytesRead;
char g_cTmpBuf[30];
//int flag_Cmd;
char SendPc[100];
FRESULT fresult;
   unsigned char FROK;
char *temp;
//File_Name[0]='\0';
temp_data[0]=0;
RecivePcBuf[0]=0;
g_cTmpBuf[0]=0;
strcpy(RecivePcBuf,p);
//RecivePcBuf=p;
RecivePcBuf[len]='\0';
if ((RecivePcBuf[0]=='l')&&(RecivePcBuf[1]=='s'))
{
//FROK=tcp_write(pcb,"su",strlen("su"),0);
SendPc[0]=0;
fresult = f_opendir(&g_sDirObject, g_cCwdBuf);
//
   // Check for error and return if there is a problem.
   //
   if(fresult != FR_OK)
   {
UARTprintf("openirfail!");
       return(fresult);
   }
for(;;)
{
//
       // Read an entry from the directory.
       //
       fresult = f_readdir(&g_sDirObject, &g_sFileInfo);
//
       // Check for error and return if there is a problem.
       //
       if(fresult != FR_OK)
       {
UARTprintf("readdirfail!");
           return(fresult);
       }
   //
       // If the file name is blank, then this is the end of the
       // listing.
       //
       if(!g_sFileInfo.fname[0])
       {
UARTprintf("blankname!");
           break;
       }
//
       // If the attribue is directory, then increment the directory count.
       //
       if(g_sFileInfo.fattrib & AM_DIR)
       {
strcat(SendPc,"D----   ");
}
else
{
if (g_sFileInfo.fattrib & AM_ARC)
{
strcat(SendPc,"----A   ");
}
}
strcat(SendPc,g_sFileInfo.fname);
strcat(SendPc,"\0");
}
strcat(SendPc,"\0");
UARTprintf(SendPc);
FROK=tcp_write(pcb,SendPc,strlen(SendPc),0);
if (FROK!=ERR_OK)
{
  UARTprintf("lstcpfail");
return 0;
}
FROK=tcp_output(pcb);
if (FROK!=ERR_OK)
{
return 0;
}

}
这个串口输出UARTprintf(SendPc)正常,tcp_write()死活没反应啊,我以前可以的啊
点赞  2011-8-4 20:37
把局部变量变成全局变量,发送结果就可以了,难道是编程空间不足
点赞  2011-8-5 15:22
问题原因也许是由于LWIP的回调函数操作I2C控制器引起的。也许你的程序中,网络收到的命令有的会要求从I2C设备中读取数据,其它任务也可能会操作同一个I2C设备。当I2C操作正在进行时,如果来了一个网络请求也要操作该I2C设备,就有可能会把原来的I2C操作进程打断,插入新的操作,从而导致总线异常。同样道理,操作需要独占的外设的时候也有可能会出现这样的问题。尝试重新初始化I2C控制器,用I2C控制器发起START和STOP和用IO口产生冗余SCL时钟等方法也不能使这些错误标志复位。芯片的系统控制库里找到了可以单独重启I2C模块的函数SysCtlPeripheralReset( SYSCTL_PERIPH_I2C0 )。在检测到I2C控制器错误标志后,先发起START和STOP来释放总线,然后重启并重新初始化MCU的I2C模块,再进行读写操作。这样即使I2C控制器死掉也可以正常操作了。
点赞  2011-10-14 17:19

回复 5楼 zjd0608 的帖子

我也遇到了相同的问题,我想原因可能是这样的:tcp_write不阻塞,并且不做数据拷贝,当使用临时变量时,函数返回,临时变量失效,发送是失败。当使用全局变量时,函数返回,变量仍可使用,后台的发送成功。
点赞  2012-5-4 18:14
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复