|
本帖最后由 wohuole 于 2014-4-7 22:08 编辑
硬件环境:
stm32f103 + enc28j60;
软件:
lwip + rt thread ;
功能:
串口接收数据后,透传给web服务器;
做法:
application.c 中,串口线程不断检测是否有可读数据。一旦检测到,立刻做socket通信,将数据上传到服务器。上传 频率 可能是 毫秒 级别。
socket 采用的非阻塞方式。
问题:
1.刚开始,常常蛮正常的。
到后面,程序貌似卡死了。仿佛内存里面积攒了很多数据;即使reset ,也不能清空。
2.有的时候,甚至报串口线程 硬件错误之类的。。。
出现过一次TCP错误。这里不能贴出具体错误提示,没保存,见谅。
3.我是使用socket 实现http请求的。采用非阻塞方式,用法不知道对不对:
如下:
sock = socket(AF_INET, SOCK_STREAM, 0)) ;
ioctlsocket(sock, FIONBIO, ¶1); //开启非阻塞模式,para = 1;
lwip_setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval)); //这个貌似是设置重复使用上次的socket连接,不知道对不对;
// 连接到服务器
ret = lwip_connect(sock, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) ;
4.求教,非阻塞接受socket数据是怎么回事? 是在上面代码下直接跟 recv();么? 还是需要开新线程 专门接受? 哪一种方法好?
求教:
求大侠指导,小弟做法有什么欠缺之处,有没有改进之处?
串口线程如下:(使用了互斥量)
static void uart_thread(void *arg)
{
char cmd[128];
int len1;
fd_set readset;
int ret,i,j;
struct timeval timeout;
extern struct rt_device uart1_device;
while(1)
{
len1 = rt_device_read(&uart1_device,0,rx_buf,256);
if(len1 > 0)
{
rx_buf[len1] = '\0';
rt_mutex_take(&socket_data_buf_mutex,RT_WAITING_FOREVER);
//rt_kprintf("receive data from usart is : %s\r\n",rx_buf);
for(i=0;i<len1;i++){
httpreq_id(rx_buf,j);
rt_thread_delay(5);
}
rt_mutex_release(&socket_data_buf_mutex);
memset(rx_buf, '\0', 256);
}
rt_thread_delay(10);
}
}
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|