|
@@ -16,19 +16,17 @@
|
|
|
|
|
|
|
|
#define MAX_SIZE 4096
|
|
#define MAX_SIZE 4096
|
|
|
|
|
|
|
|
-#define SEND_SIZE 5*1024
|
|
|
|
|
-
|
|
|
|
|
-static unsigned char send_data[SEND_SIZE];
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
static err_t tcp_accept_handle(void *arg, struct tcp_pcb *pcb, err_t err);
|
|
static err_t tcp_accept_handle(void *arg, struct tcp_pcb *pcb, err_t err);
|
|
|
static err_t tcp_recv_handle(void *arg, struct tcp_pcb *pcb, struct pbuf *p,
|
|
static err_t tcp_recv_handle(void *arg, struct tcp_pcb *pcb, struct pbuf *p,
|
|
|
err_t err);
|
|
err_t err);
|
|
|
static void tcp_close_conn(struct tcp_pcb *pcb);
|
|
static void tcp_close_conn(struct tcp_pcb *pcb);
|
|
|
err_t tcp_send_data(struct tcp_pcb *pcb, struct pbuf *p);
|
|
err_t tcp_send_data(struct tcp_pcb *pcb, struct pbuf *p);
|
|
|
-err_t usb_send_data(struct pbuf *p);
|
|
|
|
|
|
|
+err_t queue_send_data(struct pbuf *p);
|
|
|
|
|
|
|
|
static struct udp_pcb *gui_udp_pcb;
|
|
static struct udp_pcb *gui_udp_pcb;
|
|
|
|
|
+static struct tcp_pcb *tcp_server_pcb ;
|
|
|
|
|
+static struct tcp_pcb *cur_conn = NULL; // 当前连接
|
|
|
|
|
|
|
|
void lwip_device_init(void)
|
|
void lwip_device_init(void)
|
|
|
{
|
|
{
|
|
@@ -62,27 +60,41 @@ void lwip_device_init(void)
|
|
|
/**
|
|
/**
|
|
|
* tcp 服务初始化
|
|
* tcp 服务初始化
|
|
|
*/
|
|
*/
|
|
|
-void lwip_tcp_init(int port)
|
|
|
|
|
|
|
+err_t lwip_tcp_init(int port)
|
|
|
{
|
|
{
|
|
|
- struct tcp_pcb *pcb;
|
|
|
|
|
|
|
+ err_t err;
|
|
|
|
|
+ //struct tcp_pcb *pcb;
|
|
|
|
|
|
|
|
- pcb = tcp_new();
|
|
|
|
|
- tcp_bind(pcb, IP_ADDR_ANY, port);
|
|
|
|
|
- pcb = tcp_listen(pcb);
|
|
|
|
|
|
|
+ tcp_server_pcb = tcp_new();
|
|
|
|
|
+ if (tcp_server_pcb == NULL) {
|
|
|
|
|
+ ConsolePuts("tcp new 空间不足", -1);
|
|
|
|
|
+ return ERR_MEM; // 内存不足
|
|
|
|
|
+ }
|
|
|
|
|
+ err = tcp_bind(tcp_server_pcb , IP_ADDR_ANY, port);
|
|
|
|
|
+ if (err != ERR_OK) {
|
|
|
|
|
+ ConsolePuts("tcp 绑定断开失败", -1);
|
|
|
|
|
+ return err;
|
|
|
|
|
+ }
|
|
|
|
|
+ tcp_server_pcb = tcp_listen(tcp_server_pcb );
|
|
|
|
|
+ if(tcp_server_pcb == NULL)
|
|
|
|
|
+ {
|
|
|
|
|
+ ConsolePuts("tcp 监听失败", -1);
|
|
|
|
|
+ }
|
|
|
/* initialize callback arg and accept callback */
|
|
/* initialize callback arg and accept callback */
|
|
|
- tcp_arg(pcb, pcb);
|
|
|
|
|
- tcp_accept(pcb, tcp_accept_handle);
|
|
|
|
|
|
|
+ tcp_arg(tcp_server_pcb , NULL);
|
|
|
|
|
+ tcp_accept(tcp_server_pcb , tcp_accept_handle);
|
|
|
|
|
+ return ERR_OK;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 链接监听函数.
|
|
* 链接监听函数.
|
|
|
*/
|
|
*/
|
|
|
static err_t tcp_accept_handle(void *arg, struct tcp_pcb *pcb, err_t err)
|
|
static err_t tcp_accept_handle(void *arg, struct tcp_pcb *pcb, err_t err)
|
|
|
{
|
|
{
|
|
|
LWIP_UNUSED_ARG(err);
|
|
LWIP_UNUSED_ARG(err);
|
|
|
-
|
|
|
|
|
- /* Decrease the listen backlog counter */
|
|
|
|
|
- tcp_accepted((struct tcp_pcb_listen*)arg);
|
|
|
|
|
|
|
+ LWIP_UNUSED_ARG(arg);
|
|
|
|
|
|
|
|
tcp_setprio(pcb, TCP_PRIO_MAX);
|
|
tcp_setprio(pcb, TCP_PRIO_MAX);
|
|
|
/* Set up the various callback functions */
|
|
/* Set up the various callback functions */
|
|
@@ -100,6 +112,8 @@ static err_t tcp_accept_handle(void *arg, struct tcp_pcb *pcb, err_t err)
|
|
|
static err_t tcp_recv_handle(void *arg, struct tcp_pcb *pcb, struct pbuf *p,
|
|
static err_t tcp_recv_handle(void *arg, struct tcp_pcb *pcb, struct pbuf *p,
|
|
|
err_t err)
|
|
err_t err)
|
|
|
{
|
|
{
|
|
|
|
|
+ LWIP_UNUSED_ARG(arg);
|
|
|
|
|
+ LWIP_UNUSED_ARG(err);
|
|
|
err_t err_send;
|
|
err_t err_send;
|
|
|
|
|
|
|
|
if (p != NULL)
|
|
if (p != NULL)
|
|
@@ -118,7 +132,9 @@ static err_t tcp_recv_handle(void *arg, struct tcp_pcb *pcb, struct pbuf *p,
|
|
|
tcp_close_conn(pcb);
|
|
tcp_close_conn(pcb);
|
|
|
return ERR_OK;
|
|
return ERR_OK;
|
|
|
}
|
|
}
|
|
|
- err_send = usb_send_data(p);
|
|
|
|
|
|
|
+ cur_conn = pcb;
|
|
|
|
|
+ //tcp_send_data(pcb ,p);
|
|
|
|
|
+ err_send = queue_send_data(p);
|
|
|
return err_send;
|
|
return err_send;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -158,9 +174,9 @@ err_t tcp_send_data(struct tcp_pcb *pcb, struct pbuf *p)
|
|
|
len = p->len;
|
|
len = p->len;
|
|
|
for (i = 0, j = 0; i < len; i++, j++, cnt++)
|
|
for (i = 0, j = 0; i < len; i++, j++, cnt++)
|
|
|
{
|
|
{
|
|
|
|
|
+ if(cnt>=MAX_SIZE) break;
|
|
|
mydata[cnt] = data[j];
|
|
mydata[cnt] = data[j];
|
|
|
}
|
|
}
|
|
|
- //ConsolePuts(data, len);
|
|
|
|
|
p = p->next;
|
|
p = p->next;
|
|
|
|
|
|
|
|
}
|
|
}
|
|
@@ -177,10 +193,16 @@ err_t tcp_send_data(struct tcp_pcb *pcb, struct pbuf *p)
|
|
|
return err;
|
|
return err;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void lwip_tcp_send_gui(unsigned char *data, int len)
|
|
|
|
|
+{
|
|
|
|
|
+ tcp_write(cur_conn, data, len , TCP_WRITE_FLAG_COPY);
|
|
|
|
|
+ tcp_output(cur_conn);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 发送数据到USB
|
|
* 发送数据到USB
|
|
|
*/
|
|
*/
|
|
|
-err_t usb_send_data(struct pbuf *p)
|
|
|
|
|
|
|
+err_t queue_send_data(struct pbuf *p)
|
|
|
{
|
|
{
|
|
|
struct pbuf *temp = p;
|
|
struct pbuf *temp = p;
|
|
|
unsigned int len = 0;
|
|
unsigned int len = 0;
|
|
@@ -188,6 +210,8 @@ err_t usb_send_data(struct pbuf *p)
|
|
|
{
|
|
{
|
|
|
char* data = (char*) p->payload;
|
|
char* data = (char*) p->payload;
|
|
|
len = p->len;
|
|
len = p->len;
|
|
|
|
|
+ ConsolePuts("\r\ntcp rec data:\r\n", -1);
|
|
|
|
|
+ ConsolePutsHexStr(data, len);
|
|
|
enqueueFromEthernet(data, len);
|
|
enqueueFromEthernet(data, len);
|
|
|
p = p->next;
|
|
p = p->next;
|
|
|
}
|
|
}
|
|
@@ -252,13 +276,12 @@ void lwip_udp_send_gui(unsigned char *data, int len)
|
|
|
*/
|
|
*/
|
|
|
void lwip_udp_send_gui_signal(float *data, int flen, char channelFlag)
|
|
void lwip_udp_send_gui_signal(float *data, int flen, char channelFlag)
|
|
|
{
|
|
{
|
|
|
- unsigned char head[7]={'T','R',0x1,0x31};
|
|
|
|
|
|
|
+ unsigned char head[8]={'T','R',1,3,1,1};
|
|
|
int clen = sizeof(float)*flen;
|
|
int clen = sizeof(float)*flen;
|
|
|
int head_len = sizeof(head);
|
|
int head_len = sizeof(head);
|
|
|
int total_len = head_len+1+clen;
|
|
int total_len = head_len+1+clen;
|
|
|
- head[4] = total_len;
|
|
|
|
|
- head[5] = total_len>>8;
|
|
|
|
|
- head[6] = 1;
|
|
|
|
|
|
|
+ head[6] = total_len>>8;
|
|
|
|
|
+ head[7] = total_len;
|
|
|
unsigned char* fdata = malloc(total_len);
|
|
unsigned char* fdata = malloc(total_len);
|
|
|
memcpy(fdata,&head,head_len);
|
|
memcpy(fdata,&head,head_len);
|
|
|
fdata[head_len] = channelFlag;
|
|
fdata[head_len] = channelFlag;
|
|
@@ -277,13 +300,12 @@ void lwip_udp_send_gui_signal(float *data, int flen, char channelFlag)
|
|
|
*/
|
|
*/
|
|
|
void lwip_udp_send_gui_signal2(float *data1,float *data2,float *data3,float *data4, int flen, char channelFlag)
|
|
void lwip_udp_send_gui_signal2(float *data1,float *data2,float *data3,float *data4, int flen, char channelFlag)
|
|
|
{
|
|
{
|
|
|
- unsigned char head[7]={'T','R',0x1,0x31};
|
|
|
|
|
|
|
+ unsigned char head[8]={'T','R',1,3,1,1};
|
|
|
int clen = sizeof(float)*flen;
|
|
int clen = sizeof(float)*flen;
|
|
|
int head_len = sizeof(head);
|
|
int head_len = sizeof(head);
|
|
|
int total_len = head_len+1+clen;
|
|
int total_len = head_len+1+clen;
|
|
|
- head[4] = total_len;
|
|
|
|
|
- head[5] = total_len>>8;
|
|
|
|
|
- head[6] = 1;
|
|
|
|
|
|
|
+ head[6] = total_len>>8;
|
|
|
|
|
+ head[7] = total_len;
|
|
|
unsigned char* fdata = malloc(total_len);
|
|
unsigned char* fdata = malloc(total_len);
|
|
|
memcpy(fdata,&head,head_len);
|
|
memcpy(fdata,&head,head_len);
|
|
|
fdata[head_len] = channelFlag;
|
|
fdata[head_len] = channelFlag;
|