OPENWRT串口通信的实现

串口设置

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

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

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

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

#!/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

你可能感兴趣的:(OPENWRT串口通信的实现)