今天和大家聊聊CP341模块的一个热线故事
这个模块的使用问题很常见,如何接线,怎么组态,程序设置等等问题,一般按照手册使用入门一步步组态是不会有问题的,但是还是有一些细节是需要考虑的。
客户的问题是这样的:
客户:采用的是ASCII 串行通讯方式与伺服液位计通信,双方约定波特率 1200 bps ,数据位8 位, 1位奇校验,1位停止位,数据收不到,但是接收灯一直亮。
我:检查诊断缓冲区(这句话经常说)
客户:CP341报错说缓冲区已满。
我问了一下ASCII的设置,其使用的接收条件为字符延时时间结束方法,设置的参数为100ms。
我:建议修改到40ms,问题解决。
那为什么要改成40ms呢?接收参数到底如何设置?
详细说来接收数据的条件有三种:
1.字符延迟时间结束(On expiry of character delay time)
2.接收固定长度字符(On receipt of fixed number of characters)
3.接收文本结束字符(On receipt of end character)
第一种字符延迟时间作为结束标准,这种用的最多,客户使用的也是这个,定义两个连续接收到的字符间允许的最大间隔时间,当字符延迟时间结束时识别为消息帧结束, CPU 即可接收数据。
例如把字符延迟时间设置为400ms,
则一旦发送数据间隔大于400ms则认为第一帧结束。例如如下示波器捕捉报文显示:
这个时间怎么设置呢,这个时间是由两个参数决定一个是发送方间隔(send interval),这个发送方控制不由CP341决定,另一个参数是通信速率(transmission rate)。它们的关系如下图:
默认设置为传输4个字符需要的时间,比如通信速率是9600bps,则发送一个字符需要的时间为(1位起始位+8位数据位+1位停止位+1位校验位或者没有)/9600=1.04~1.1ms,默认参数为4ms。如果通信速率为9600,发送30个字节的数据根据上图公式,发送间隔不允许小于30+4 =34ms。客户使用的通信速率是1200bps,发送一个字符需要10ms,但是其发送间隔不确定(伺服液位计决定),由于其现象为缓冲区满,因此可以认为报文始终没有接收结束,字符延迟时间设置大于发送间隔,改小后可以解决,但是要注意不要过小。
第二种方式是固定帧长度作为结束标准, 顾名思义是指收到固定的字符数之后接收结束, CPU 接受 CP 所接收的数据。
如果发送的字符长度与设置不一致则需要考虑字符间隔时间,当长时间没有收到字符(大于字符间隔时间)则不足或超出的字符部分会被丢弃掉。
例如如下示波器捕捉报文显示:
第三种方式为判断消息帧的结束字符,必须确保用户数据中不存在指定的结束字符
在指定的字符延迟时间内没有收到结束字符,则被丢弃掉。
以上仅是对接收参数进行的简要描述,其他常见问题汇总 推荐大家有兴趣的话可以看一下:
串行通信模块常见问题集
http://www.ad.siemens.com.cn/download/searchResult.aspx?searchText=f0426