一、实现框架
使用的STM32H5开发板接有W800模块,原理图为:
我们可以编写一个STM32H5的程序,它在PC和W800之间实现传输数据的中转,硬件
框图为:
STM32H5 的程序有如下功能:
- 它模拟出一个USB串口
- 它把PC发来的数据,直接通过UART1发给W800
- 它把W800发来的数据,直接通过USB串口发给PC
需要注意在CubeMX使能UART1引脚时将引脚改成PA9、PA10
上机实验:
二、参考资料
AT命令参考文档:
W800支持的AT+指令非常的多,这里仅展现几个常用的指令。
三、连接AP
示例命令如下:
//设置工作模式为STA
AT+WPRT=0
//列出AP名
AT+WSCAN
//设置需要加入的AP名称如Programmers
AT+SSID="Programmers"
//设置需要加入的AP的无线密钥100asktech
//参数1:密钥格式,0表示HEX,1表示ASCII
//参数2:index:密钥索引号,1~4用于WEP加密密钥,其它加密方式固定为0
//参数3:无线密钥。例如:12345678
AT+KEY=1,0,"100asktech"
//启用DHCP
AT+NIP=0
//保存参数到spi flash
AT+PMTF
//加入无线网络WinnerMicro
AT+WJOIN
//查询本端网络连接状态
AT+LKSTT
//ping
AT+PING=www.100ask.net,10,2,1
//域名解析
AT+SKGHBN=www.100ask.net
//断开无线网络
AT_WLEAV
四、用作TCP Client
命令解析如下:
//1.在sscom里启动server
//2.在W800建立socket连接
//AT+SKCT=[protocol],[cs],[host_timeout],<remote_port>,<local_port><CR>
//protocol:0-TCP, 1-UDP
//cs: 0-Client, 1-Server
//host_timeout:作为client时写入目的服务器名称或IP;作为TCP Sserver时写入超时时间(单位:秒,
0表示永不超时)
//超时时间的含义:连接到本服务器的客户端超过本时间不发送任何数据后即被自动踢掉
//remote_port:远程端口号
//local_port:本地端口号
//返回:+OK=<socket><CR><LF><CR><LF>
AT+SKCT=0,0,"192.168.1.29",777,888
+OK=1 // socket为1
//3.发送数据:AT+SKSND=<socket>,<size><CR>
AT+SKSND=1,10
//接收数据:AT+SKRCV=<socket>,<maxsize><CR>
//返回:没有收到数据也会马上返回(size为0)
//+OK=<size><CR><LF><CR><LF>
//[data stream]
//4.在sscom里接收到了数据
//5. sscom里发送数据
//6.读取数据
AT+SKRCV=1,1000
//关闭socket: AT+SKCLS=<socket><CR>
AT+SKCLS=1
按照下图顺序进行上机实验:
这部分为 client 向 server 发送数据:
这部分为 server 向 client 发送数据:
注意:发送W800的AT命令时只需要在末尾发送回车字符,不需要换行字符。但是“安信可串口调试助手”会发送回车、换行2个字符。这导致在使用“AT_SKSND”命令发送数据时,换行符(ASCII值为0x0a)被当做第1个数据。这使得:上图里“4.2”发送了“1234567890”十个字符,但是“5”那里只显示“123456789”九个字符。实际上sscom已经接收到了十个字符:先接收到换行符,再接收到“123456789”九个字符。
“安信可串口调试助手”可以记录历史命令,比较好用,所以本课程使用它。缺点就是勾选“发送新行”时发送的是2个字符:回车、换行,无法只发送回车符。
五、用作TCP Server
命令解析如下:
// 1. 建立socket
// AT+SKCT=[protocol],[cs],[host_timeout],<remote_port>,<local_port><CR>
// protocol: 0-TCP, 1-UDP
// cs: 0-Client, 1-Server
// host_timeout: 作为client时写入目的服务器名称或IP;作为TCP Sserver时写入超时时间(单位:秒,
0表示永不超时)
// 超时时间的含义:连接到本服务器的客户端超过本时间不发送任何数据后即被自动踢掉
// remote_port: 远程端口号
// local_port: 本地端口号
// 返回:+OK=<socket><CR><LF><CR><LF>
AT+SKCT=0,1,0,0,555
+OK=1 // socket为1
// 2. 列出W800的IP
AT+LKSTT
+OK=1,1,”192.168.1.74”,0,555,0
2,2,"192.168.1.29",63131,555,0
// 3. 在sscom里连接W800
//4. 列出连接的socket:
AT+SKSTT=1
+OK=1,1,"192.168.1.74",0,555,0
2,2,"192.168.1.29",63131,555,0
// 5. 发送数据:
// 5.1 先发命令:AT+SKSND=2,10
// 5.2 再发数据: 1234567890
// 6. 在sscom里可以看到数据
// 7. 再sscom里发送数据
// 8. 接收数据:
AT+SKRCV=2,1000
// 关闭socket: AT+SKCLS=<socket><CR>
AT+SKCLS=1
按照下图顺序进行上机实验:
注意:发送W800的AT命令时只需要在末尾发送回车字符,不需要换行字符。但是“安信可串口调试助手”会发送回车、换行2个字符。这导致在使用“AT_SKSND”命令发送数据时,换行符(ASCII值为0x0a)被当做第1个数据。这使得:上图里“4.2”发送了“1234567890”十个字符,但是“5”那里只显示“123456789”九个字符。实际上sscom已经接收到了十个字符:先接收到换行符,再接收到“123456789”九个字符。
“安信可串口调试助手”可以记录历史命令,比较好用,所以本课程使用它。缺点就是勾选“发送新行”时发送的是2个字符:回车、换行,无法只发送回车符。
六、用作UDP
UDP传输里,没有server、client的角色。
命令解析如下:
//1.在sscom里启动UDP
//2.在W800建立socket连接
//AT+SKCT=[protocol],[cs],[host_timeout],<remote_port>,<local_port><CR>
//protocol: 0-TCP, 1-UDP
//cs: 0-Client, 1-Server
//host_timeout:作为client时写入目的服务器名称或IP;作为TCP Sserver时写入超时时间(单位:秒,
0表示永不超时)
//超时时间的含义:连接到本服务器的客户端超过本时间不发送任何数据后即被自动踢掉
//remote_port:远程端口号
//local_port:本地端口号
//返回:+OK=<socket><CR><LF><CR><LF>
AT+SKCT=1,0,"192.168.1.29",777,888
+OK=1 // socket为1
//3.发送数据:AT+SKSND=<socket>,<size><CR>
AT+SKSND=1,10
//4.在sscom里接收到了数据
//5. sscom里发送数据
//6.读取数据
//接收数据:AT+SKRCV=<socket>,<maxsize><CR>
//返回:没有收到数据也会马上返回(size为0)
//+OK=<size><CR><LF><CR><LF>
//[data stream]
AT+SKRCV=1,1000
//关闭socket: AT+SKCLS=<socket><CR>
AT+SKCLS=1
按照下图顺序进行上机实验:
注意:发送W800的AT命令时只需要在末尾发送回车字符,不需要换行字符。但是“安信可串口调试助手”会发送回车、换行2个字符。这导致在使用“AT_SKSND”命令发送数据时,换行符(ASCII值为0x0a)被当做第1个数据。这使得:上图里“4.2”发送了“1234567890”十个字符,但是“5”那里只显示“123456789”九个字符。实际上sscom已经接收到了十个字符:先接收到换行符,再接收到“123456789”九个字符。
“安信可串口调试助手”可以记录历史命令,比较好用,所以本课程使用它。缺点就是勾选“发送新行”时发送的是2个字符:回车、换行,无法只发送回车符。
六、主动上报
要接收数据时,前面的例子都是执行如下命令:
AT+SKRCV=<socket>,<maxsize><CR>
如果没有数据的话,会返回:
+OK=0<CR><LF><CR><LF>
如果有数据,则返回:
+OK=<size><CR><LF><CR><LF>
[data stream]
能否让W800接收到数据后主动上报数据?可以。启动“主动上报”的功能即可:
// mode: 0-关闭主动上报功能,1-打开
AT+SKRPTM=[?]<mode><CR>
主动上报的数据格式为:
+SKTRPT=<socket>,<size>,<remote_ip>,<remote_port><CR><LF><CR><LF>
<data stream>