今天无操作系统基于回调函数的lwip遇到个问题,常量字符串tcp_write+tcp_output能发出去,但是变量字符型数组或指针就没法发送出去,似乎被阻塞了,不知道大家有没有遇到过这个情况
好像不能发变量,而是打包成一数据包,这个包么应是UCHAR型的
http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
回复 沙发 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()死活没反应啊,我以前可以的啊
把局部变量变成全局变量,发送结果就可以了,难道是编程空间不足
问题原因也许是由于LWIP的回调函数操作I2C控制器引起的。也许你的程序中,网络收到的命令有的会要求从I2C设备中读取数据,其它任务也可能会操作同一个I2C设备。当I2C操作正在进行时,如果来了一个网络请求也要操作该I2C设备,就有可能会把原来的I2C操作进程打断,插入新的操作,从而导致总线异常。同样道理,操作需要独占的外设的时候也有可能会出现这样的问题。尝试重新初始化I2C控制器,用I2C控制器发起START和STOP和用IO口产生冗余SCL时钟等方法也不能使这些错误标志复位。芯片的系统控制库里找到了可以单独重启I2C模块的函数SysCtlPeripheralReset( SYSCTL_PERIPH_I2C0 )。在检测到I2C控制器错误标志后,先发起START和STOP来释放总线,然后重启并重新初始化MCU的I2C模块,再进行读写操作。这样即使I2C控制器死掉也可以正常操作了。
回复 5楼 zjd0608 的帖子
我也遇到了相同的问题,我想原因可能是这样的:tcp_write不阻塞,并且不做数据拷贝,当使用临时变量时,函数返回,临时变量失效,发送是失败。当使用全局变量时,函数返回,变量仍可使用,后台的发送成功。