如何在lua中从串口读取数据
2014-8-14 12:57:36
收藏:0
阅读:275
评论:2
我是lua新手,我正在尝试从端口ttyACM0接收数据,我可以通过以下方式写入端口:
wserial = io.open("/dev/ttyACM0","w")
wserial:write("hellloooo")
wserial:flush()
我认为,既然我可以像写文件一样写入文件,那么我也可以像读文件一样读取它。但是当我尝试读取它时(使用下面的代码),我只会陷入无限循环。
rserial=io.open("/dev/ttyACM0","r")
while chaine==nil do
chaine=rserial:read()
rserial:flush()
end
print(chaine)
所以我的问题是我应该怎么做才能从端口ttyACM0中读取数据?
点赞
用户8785406
我不会回答你做错了什么,但根据 这里 的一个答案,我为 Windows 环境做了这个:
-- 您可以在运行时生成 PowerShell 脚本
local script = [[
$port= new-Object System.IO.Ports.SerialPort COM78,115200,None,8,one
$port.open()
$port.WriteLine('serialRequest')
$port.ReadLine() > 'c:\\temp\\serialResponse.txt'
$port.Close()
]]
-- 现在创建 power shell 进程并将脚本传递给它的 stdin
local pipe = io.popen("powershell -command -", "w")
pipe:write(script)
pipe:close()
不是很好的做法,因为必须从文件中获取响应,但它可行。
2020-10-16 11:20:32
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
这里涉及到两种行缓冲:一种在C库中,你可以像评论中@Advert提到的那样避免使用
:read(1);另一种在终端驱动程序本身中。你可以使用stty命令行实用程序(stty -F /dev/ttyACM0 -icanon)或者如luaposix所示的方式(未经测试的代码)禁用终端驱动程序中的输入行缓冲:local p = require( "posix" ) local rserial = assert( io.open( "/dev/ttyACM0", "r" ) ) local fd = assert( p.fileno( rserial ) ) local function table_copy( t ) local copy = {} for k,v in pairs( t ) do if type( v ) == "table" then copy[ k ] = table_copy( v ) else copy[ k ] = v end end return copy end -- get current settings local saved_tcattr = assert( p.tcgetattr( fd ) ) local raw_tcattr = table_copy( saved_tcattr ) -- clear ICANON bits from local flags using Lua 5.2 bit32 module raw_tcattr.lflag = bit32.band( raw_tcattr.lflag, bit32.bnot( p.ICANON ) ) -- apply modified settings assert( p.tcsetattr( fd, p.TCSANOW, raw_tcattr ) ) local c = rserial:read( 1 ) print( c ) -- restore default settings afterwards p.tcsetattr( fd, p.TCSANOW, saved_tcattr ) rserial:close()还有一个Lua串口处理的专门C模块,最新未发布版本的LuaSocket也有处理串口的代码(但默认构建中被禁用)。