最近做了一个485转以太网的项目,用的是AT91sam7x256处理器,tcp/ip协议是用的keil的实时库:RL-arm的RL- tcp,这个tcp协议移植起来比较方便。算是实现数据量不是太大的一个不错的选择,在装MDK的同时还要安装一个RL-arm实时库,还有一个中文的操作说明,网上找不到的留个邮箱,(博客:http://blog.ednchina.com/qink2008/)哥发给你。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以后,就表示数据已经完全发送出去了,从而可以成功发送命令。
就这么一句话,找的我好辛苦啊!
用户377235 2014-11-22 18:02
用户377235 2013-6-3 15:31
大哥好,我也想要一份关于RL-ARM-TCP的中文操作说明,感谢。
用户377235 2012-6-4 17:02
大哥,发我一份rl-arm吧,510559254@qq.com 谢谢
用户1646713 2012-5-16 21:25
用户377235 2012-4-14 18:27
最近在做相关方面的毕业设计 您能不能帮帮忙?
748546332@qq 基于RL-TCPnet的远程监控系统设计与实现(CGI程序设计)
用户345526 2011-12-22 23:22
用户377235 2011-12-22 23:21
用户114193 2011-2-16 09:08
用户522488 2010-12-9 14:04
用户46937 2010-12-8 11:19