我公司有一客户是做楼宇控制的,他们有一项目用的是S7-300的系统,要求与YORK的中央空调主机通讯,采用340模块读取相关信息,协议还是比较简单的,340发一个字节,然后YORK主机返回约5000个字节的数据(客户要求这么多,没办法),客户编程,调试,调用FB2接收数据,可客户发现每次接收完成后,查看接收数据块,都是发送数据的最后800多个字节,前面的数据都被覆盖了。客户咨询我公司,我们首先想到的是接收缓冲区,打开硬件组态,查看CP340的硬件缓冲区设置为250,最大也只能设到250。而客户已经接收了800多个字节,应该不是这个问题。那CP340一次最多可以接收多少数据呢?
带着这个疑问,我们决定在公司实验室做通讯实验。我们采用PC和MOXA 232转485转换器与CP340连接,使用串口调试助手发送一个1K字节左右的文件。CP340接收没有问题,经过不断的实验,最终我们确定CP340一次最大只能接收1024个字节的数据(9.6k波特率)。这个可能是硬件的限制。
总结一下,当340接收的数据小于1024时,当340检测到线路空闲时间大于硬件组态中定义的字符间隔时间就认为一帧结束,FB2置NDR=1。当接收的数据大于1024时,不管一帧是否结束,都会置NDR=1,然后继续接收直到一帧结束。
这样我们就可以加一条判断,当NDR=1 时,把接收到的长度赋给接收数据块的起始地址即可。程序代码如下:
CALL "P_RCV" , DB3//调用接收块
EN_R :=M20.0
R :=M20.1
LADDR :=256
DB_NO :=1
DBB_NO:=MW512//接收块起始地址
NDR :=M21.0
ERROR :=M21.1
LEN :=MW22//接收到的数据长度
STATUS:=MW24
A M 21.0
FP M 300.2
JNB _001
L MW 22
T MW 512
_001: NOP 0