文章归档友情连接

TL720N路由器OPENWRT串口通信的实现

分类:电子设计  作者:rming  时间:2013-06-20

串口设置

 

串口名称(不同机型不同)

开机启动信息可以看到串口的名称,例如以下串口启动信息:

 

Serial: 8250/16550 driver, 1 ports, IRQ sharing disabled
ar933x-uart: ttyATH0 at MMIO 0x18020000 (irq = 11) is a AR933X UART
console [ttyATH0] enabled, bootconsole disabled

 

可以看到串口的名称为ttyATH0,此时可以ls /dev/查看确认。

stty 串口波特率设置

 

opkg update  //更新软件列表
opkg install coreutils-stty //安装stty
stty -F /dev/ttyATH0 raw speed 9600  //设置ttyATH0串口的波特率为9600
echo "hello" > /dev/ttyACM0  //向串口输出字符"hello"
cat /dev/ttyATH0  //读取串口

 

屏蔽串口的系统显示(消除乱码和串口BusyBox 影响)

编辑文件:vi /etc/inittab

 

::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
ttyS0::askfirst:/bin/ash --login
#ttyATH0::askfirst:/bin/ash --login  #注释此行

 

将串口波特率设置添加到开机启动

编辑文件:vi /etc/init.d/usart

文件属性:chmod 777 /etc/init.d/usart

 

#!/bin/sh /etc/rc.common
#/etc/init.d/usart
START=80
start() {
/usr/bin/stty -F /dev/ttyS0 raw speed 9600
}
stop(){
killall usart
}

 

启用开机启动:/etc/init.d/usart enable

 

UHTTP配置修改

 

配置lua有效路径、默认访问端口、页面位置
编辑文件:vi /etc/config/uhttpd

 

list 'listen_http' '0.0.0.0:80'      // 默认端口设置
list 'listen_https' '0.0.0.0:443'  // 通过https访问,端口设定
option 'home' '/www'               // 页面所在的位置
option 'cert' '/etc/uhttpd.crt'    // https访问对应的证书
option 'key' '/etc/uhttpd.key'   // 和上面的cert有关系
option 'cgi_prefix' '/cgi-bin'      //cgi有效路径,相对于home

 

/etc/init.d/uhttpd restart //重启uhttpd加载新的配置文件

 

LUA操作系统库

 

函数os.exit终止一个程序的执行。函数os.getenv得到“环境变量”的值。以“变量名”作为参数,返回该变量值的字符串:

 

print(os.getenv("HOME"))    --> /home/rming

 

如果没有该环境变量则返回nil。函数os.execute执行一个系统命令(和C中的system函数等价)。该函数获取一个命令字符串,返回一个错误代码。例如在Unix系统里都可以执行如下代码创建一个新目录:

 

function createDir (dirname)
    os.execute("mkdir " .. dirname)
end

 

os.execute函数较为强大,同时也更加倚赖于计算机系统。

 

典型代码

 

从web调用GET方式输出到到串口

路由器开机输出过多字符串,需要在路由器和单片机中添加命令标志位。

 

可以web调用,url/lua/output?1
eg:php调用file_get_content('http://url/output?1')

 

#!/usr/bin/lua
ser_out=io.output("/dev/ttyATH0")
io.write("codecommond")
io.write(os.getenv("QUERY_STRING"))
ser_out:close()
print [[
Content-Type: text/plain
]]

 

监听串口接收下位机上传的数据(开机后台运行)

单片机发起:

 

单片机发送指令,路由器接收指令,执行指令

 

单片机可以发起的动作有:

 

1、存储数据到路由器  指令形式:1:key,value/r/n
2、访问互联网网络    指令形式:2:url/r/n
3、执行指令      指令形式  3:code/r/n

 

#!/usr/bin/lua
#!/usr/bin/lua
ser_in=io.input("/dev/ttyATH0")
while 1
do
ser_char=io.read(1)
if ser_char=="1" then
do
print("1")
end
elseif ser_char=="2" then
do
print("2")
end
elseif ser_char=="3" then
do
print("3")
end
else
print("others")
end
end

 

PHP请求http(file_get_content)

 

1.GET方式请求

 

 <?php

       $data = array('sParam1'=>'test1','sParam2'=>101,'isAuto'=>1);  //定义参数

       $data = @http_build_query($data);  //把参数转换成URL数据

       $aContext = array('http' => array('method' => 'GET',

                                                                 'header'  => 'Content-type: application/x-www-form-urlencoded',

                                                                 'content' => $data ));

       $cxContext  = stream_context_create($aContext);

       $sUrl = 'http://www.mytest.com/test.php'; //此处必须为完整路径

       $d = @file_get_contents($sUrl,false,$cxContext);

       print_r($d);

?>

 

2.POST方式请求


 <?php

       $data = array('sParam1'=>'test1','sParam2'=>101,'isAuto'=>1);  //定义参数

       $data = @http_build_query($data);  //把参数转换成URL数据

       $aContext = array('http' => array('method' => 'POST',

                                                                 'header'  => 'Content-type: application/x-www-form-urlencoded',

                                                                 'content' => $data ));

       $cxContext  = stream_context_create($aContext);

       $sUrl = 'http://www.mytest.com/test.php'; //此处必须为完整路径

       $d = @file_get_contents($sUrl,false,$cxContext);

       print_r($d);

?>

 

文章参考:


OpenWrt与Arduino的USB直接通信 By 船长@第一次的硬软件结合 :http://www.sl088.com/voyage/2012/03/3411.slboat

LUA操作系统库:http://www.cnblogs.com/hwblog/articles/2080721.html

WR703N 开发集锦(亲测成功) :http://blog.chinaunix.net/uid-27194309-id-3287712.html

 PHP请求http(file_get_content): http://blog.csdn.net/loveruguo/article/details/6737635

网页控制Openwrt串口:http://see.sl088.com/wiki/%E7%BD%91%E9%A1%B5%E6%8E%A7%E5%88%B6Openwrt%E4%B8%B2%E5%8F%A3

 

 

openwrt-php-U盘安装说明.pdf



  1. 图腾 图腾

    好文章,一直在想怎么实现openwrt与单片机的通信,等有考试过去了在好好搞搞。

  2. 51stm32 51stm32

    通过你的文章我用自己的路由器841n,普中的hc6800em3单片机开发箱,实现了在android手机或手提电脑上通过wifi来控制hc6800em3上的那8个led灯的亮灭
    过程中碰到些问题和疑问,另外也在想通过你的这种办法来实现wifi监控小车……
    可不可以留个QQ或msn之类有机会探讨下?

    1. @51stm32可以参考下http://www.guokr.com/article/319356/ 通常是用ser2net实现的,我只是随便写写

  3. ki-Ra ki-Ra

    楼主,路由器通过串口接收下位机命令那部分代码能不能详细解释下,我测试时候过不去

    1. 好久不玩,忘记了啊

提交评论