原创 RL-TCPnet实现RS485转TCP/IP--小结

2010-12-6 14:02 6121 4 14 分类: MCU/ 嵌入式

最近做了一个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以后,就表示数据已经完全发送出去了,从而可以成功发送命令。


就这么一句话,找的我好辛苦啊!

PARTNER CONTENT

文章评论10条评论)

登录后参与讨论

用户377235 2014-11-22 18:02

给我发个RL-arm实时库中的net_config.h吧,找了n久没找到 zhuhaiyuanfei@163.com 谢谢了 还有,请问我的keil软件中 Keil\ARM\RL\ 下面没有TCPnet 文件夹.怎么才能有? 我的keil版本是 mdk413a

用户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

2314460425@qq.com发我一份吧

用户377235 2012-4-14 18:27

最近在做相关方面的毕业设计 您能不能帮帮忙?

748546332@qq 基于RL-TCPnet的远程监控系统设计与实现(CGI程序设计)

用户345526 2011-12-22 23:22

同求rlarm实时库。 linyoung828@163.com

用户377235 2011-12-22 23:21

同求rl—arm实时库。

用户114193 2011-2-16 09:08

给我发个RL-arm实时库中的net_config.h吧,找了n久没找到 che216@163.com 谢谢了 还有,请问我的keil软件中 Keil\ARM\RL\ 下面没有TCPnet 文件夹.怎么才能有? 我的keil版本是 mdk413a

用户522488 2010-12-9 14:04

已发

用户46937 2010-12-8 11:19

给我发个RL-arm实时库吧,找了n久没找到 the.force@163.com 谢谢了
相关推荐阅读
用户522488 2011-01-06 15:37
从人生的视角来解读linux内核(调度)!!!
这篇文章写得真好,看了好东西大家一起分享! Linux内核是一个无比复杂的系统,要想看清大致的脉络也非易事。其实,可以把运行中的Linux想像成一个人类的社会,当中的进程就是社会中的人。人有生老病死,...
用户522488 2011-01-03 21:08
LabView采集加速度传感器sca3000数据 有点意思!
最近玩了下加速度传感器,发现这玩意的用途还蛮广的:振动检测,自由落体检测,(IBM的笔记本就是利用一个加速度传感器检测到笔记本自由落体运动的时候就关闭硬盘,避免硬盘数据的损坏)陀螺仪,测倾角等等。手上...
用户522488 2010-11-29 16:17
利用strstr和sscanf解析GPS信息
考察C程序员是否合格的一个重要标准就是看他操作字符串的能力,一个合格的C程序员应该可以熟练的对字符串进行拆分、组合、格式转换以及搜索定位,从一堆数据中提取出有效信息。比如说我们要做一个GPS导航的项目...
用户522488 2010-11-29 16:09
对LPC2103串口的一些理解
LPC2103含有个相互独立的通用异步串行接口 (UART0 UART1),其特点是具有16字节的接收和发送FIFO,符合550工业标准(我对这个标准不了解),接收触发可以设置为1字节、4字节、8字节...
用户522488 2010-11-29 16:08
转载sim300的一些知识点
simcom从2010年10月开始用sim900代替sim300,sim900和sim300用法差不多!如果你的结果是仅仅返回OK,我会说这远远不够的,因为这只是说你的指令格式是正确的,你必须at+c...
我要评论
10
4
关闭 站长推荐上一条 /3 下一条