AT指令发送网络数据的两种方式比较

使用联网模块进行应用程序开发中,比较常使用到的联网模块,如4G模块,Wi-Fi模块等,使用AT指令方式发送数据时,查看数据手册,发现一般都支持两种数据发送方式。
1:指定数据长度。AT+CIPSEND=0,n。其中n代表本次发送的数据长度。
2:不指定数据长度。AT+CIPSEND=0, 发送该指令后等待模块返回 “>”字符,再发送数据,并在数据发送完成后,发送<ctrl+z>字符,即十六进制中的0x1a.
使用两种数据发送方式都可以实现发送指定数据到连接端的功能,但基于不同的应用场景,使用不同的方式发送数据会有不同的抗干扰性效果。
假设在某个场景中,服务端(即数据接收端)使用固定结束标志符作为判断一次数据接收完成的方法。4G模块等与MCU使用串口方式连接,而在串口通信中,有可能会存在一些干扰,使得4G模块在接收MCU的数据时会收收到一些无效字符(这些字符并不是MCU发送的,可能是串口在通信过程中的一些干扰产生的无效数据,通常是'\0'字符),使用第一种数据发送方式的话,由于指定了数据长度,因此4G模块会因为计算了收到的无效字符而多计算了实际的数据长度,出现少发实际字符的情况,导致最后的数据结束符不完整。因此本次发送到服务端的数据服务端不会判断为一次完成的数据,会继续接收。在下一次发送数据时,原本是一次正常的数据发送,但服务端因为上一次数据还没有接收完成,因此会把本次数据和上次发送的无效数据重叠在一起,产生“数据叠包”现象。如果服务端的程序没有做相关的处理,可能会认为这收到的是无效数据,跳过处理。
使用第二种数据发送方式,即使在第一次发送数据时出现了数据干扰,但由于模块会等待到MCU发送0x1a后再把数据发送出去。因此可以保证每一次数据发送都是完全的,至少不会出现少发字符的情况。也因此可以避免由于服务端使用结束符判断接收完成的方法而产生的“数据叠包”现象。
发布了54 篇原创文章 · 获赞 62 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/u013053268/article/details/103727046