前段时间一直在调试lwip协议栈的问题,在stm32F107上实现一个C/S 架构的通信程序。项目初期的时候设计的是B/S架构的控制,然后在使用过程中发现了些限制,因为芯片自身的RAM有限,所以跑B/S的server端略显压力,为了处理类似动态网页内容,开辟一个5K的缓冲区,然后一次tcp_write就可以将内容发送给浏览器了,当然网页内容也是比较简单,考虑到后续可能会有更多的数据处理,故决定开发一个C/S架构的控制。
上位机client倒是没什么太多可说的,自己封装下基本的winsock操作。考虑到用TCP协议传输简单地封装了下数据封包和拆包的协议,然后MFC作为图形界面。在stm32端主要采用lwip的RAW API,然后利用callback的方式处理接收上位机命令、数据后的处理,初始化服务器的代码如下:
void Server_init(void)
{
struct tcp_pcb *pcb;
pcb = tcp_new(); // 动态创建一个pcb
tcp_bind(pcb, IP_ADDR_ANY, 8082); // 绑定端口8082
pcb = tcp_listen(pcb); // 开始监听
tcp_accept(pcb, Server_accept); // accept成功时的回调函数
}
然后在Server_accept中也主要是初始化一些回调函数,
static err_t Server_accept(void *arg, struct tcp_pcb *pcb, err_t err)
{
tcp_err(pcb, Server_conn_err); // 错误时的回调函数