这两天主要做的是把Keller 30X系列工业用压力变送器的RS485接口和STM32单片机联通,并将数据通过USB口转发到PC上。
我首先直接使用Keller 30X连接电脑的RS485接口,这自然没有问题,用Keller自带的小软件直接就能看到结果。
其次让STM32的RS485接口和电脑连接,这步调试整整用了1天半,遇到了几个比较棘手的问题:
发送时,由于RS485为半双工模式,发送时需要处理收发转换。发送前将T/NR线拉高,然后用串口发送一个字节的数据。发送完之后不能马上把T/NR线拉低,需要等待一会儿(大约发送1~2位的时间,视波特率而定),等接收方确认收到停止位后,再把T/NR拉低进入接收模式。
接收时和发送同理,电脑向单片机发送数据时停止位起码要有2位,以保证单片机收到停止位,否则连续发送时会把后一位数据中的1->0跳变认作起始位,导致传输错误
芯片选择方面,要认清MAX3485和MAX485的区别。MAX3485是CMOS电平的,用3.3V供电。MAX485是TTL电平的,用5V供电。STM32单片机的IO都是CMOS电平,所以理应使用MAX3485芯片。如果一定要做TTL和CMOS的电平转换,记住CMOS可以驱动TTL,而TTL驱动CMOS时需要上拉电阻。如果电平搞错了,最明显的状况就是发送正常而接收乱码。
RS485的终端电阻不要乱接。RS485的终端电阻是接在总线最末端防止电波反射的,如果线很短干脆就不要接了,否则反而容易把差分信号拉小,使信噪比降低
RS485的AB线上的上下拉电阻个人认为没有必要接。首先MAX3485内部有上下拉电路,本身就能够把AB线钳位在