我是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, p.TCSANOW, saved_tcattr )
rserial:close()

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

关于file-io - 如何从lua中的串行端口读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25204242/

10-16 16:21
查看更多