原创
RL-TCPnet实现RS485转TCP/IP--小结
最近做了一个485转以太网的项目,用的是AT91sam7x256处理器,tcp/ip协议是用的keil的实时库:RL-arm的RL- tcp,这个tcp协议移植起来比较方便。算是实现数据量不是太大的一个不错的选择,在装MDK的同时还要安装一个RL-arm实时库,还有一个中文的操作说明,网上找不到的留个邮箱,(博客:qink2008.21ic.org)哥发给你。keil公司的rl-arm官方英文说明:http://www.keil.com/rl-arm/rl-tcpnet.asp RL-tcp使用起来也比较容易,拿UDP来说吧初始化:init_TcpNet (); 分配一个UDP套接字:udp_soc = udp_get_socket (0, UDP_OPT_SEND_CS | UDP_OPT_CHK_CS, udp_callback); 打开UDP:udp_open (udp_soc, 0); 发送UDP数据:udp_send (udp_soc, rem_IP, 1000, sendbuf, 512); 接收UDP数据是通过函数:U16 udp_callback (U8 socket, U8 *remip, U16 port, U8 *buf, U16 len) 来实现的,返回远程的ip和端口port,数据指针和数据长度。只要一收到数据,RL-tcp就会自动调用udp_callback函数,在udp_callback函数中最好用状态机来实现其他的操作,不要写太长的处理代码。意思就是,设一个全局变量flag,在udp_callback中置位flag,这样在主函数while(1)循环中检测到flag置位就可以进行相关的操作了。我在RS485的收发选择这里纠结了一段时间,在给采集片发送传送命令后,马上将485收发选择RE/DE为接收,但怎么也收不到数据,说明命令发送失败。把485收发选择RE/DE这句去掉,用示波器观察,命令发送成功。折磨了我一段时间后发现可能是at91的串口发送有问题,原来的发送函数是 int sendchar (int ch) { while (!(pUSART->US_CSR & AT91C_US_TXRDY)); return (pUSART->US_THR = ch); } 我把它改为 int sendchar (int ch) { while (!(pUSART->US_CSR & AT91C_US_TXEMPTY)); return (pUSART->US_THR = ch); } US_CSR 中标志位TXRDY和TXEMPTY的区别在于,TXRDY表示US_THR中有数据,准备传送到移位寄存器中去发送;TXEMPTY表示US_THR和移位寄存器中都没有数据,已经都发送出去了。我在调用sendchar()函数后,马上就将RE/DE清零,准备接收。可能sendchar()函数发出去的数据还没完全发送出去,而RE /DE已经不是发送片选了,从而导致命令没有发送成功。改成TXEMPTY以后,就表示数据已经完全发送出去了,从而可以成功发送命令。就这么一句话,找的我好辛苦啊!
文章评论(0条评论)
登录后参与讨论