加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

file-io – 如何从lua中的串口读取

发布时间:2020-12-14 21:49:56 所属栏目:大数据 来源:网络整理
导读:我是lua的新手,我正在尝试从端口接收数据,ttyACM0,我可以通过以下方式写入端口: wserial = io.open("/dev/ttyACM0","w")wserial:write("hellloooo")wserial:flush() 我想,因为我可以用与写入文件相同的方式写入它,我可以像读取文件一样读取它.但是当我尝试
我是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?

解决方法

这里有两种行缓冲:一种在C库中,你可以避免使用:read(1)就像评论中提到的@Advert,另一种是终端驱动本身.您可以使用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,saved_tcattr )
rserial:close()

还有一个specialized C module用于处理Lua中的串行端口,最新发布的LuaSocket版本具有处理串行端口的代码(但在默认版本中禁用它).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读