26.05.2025, 12:30
Update the function once more, it won't spam the log with empty messages.
Post your logs when SMS does not reach the recipient.
Code:
function AT:read(timeout)
local char, err, timeout, deftimeout, line
-- default timeout is 2 seconds, converted to 0.1 sec ticks
timeout = tonumber(timeout) or 2
timeout = timeout * 10
deftimeout = timeout
-- read until got one line or timeout occured
while timeout > 0 do
-- read 1 char
char, err = self.port:read(1, 0.1)
-- got data
if char then
-- got LF, end of line
if char == '\n' then
-- convert to string and empty buffer
line = table.concat(self.buffer)
self.buffer = {}
line = line:trim()
-- return only lines with data
if #line > 0 then
log('read line', line)
return line
-- reset timeout
else
timeout = deftimeout
end
-- ignore CR
elseif char ~= '\r' then
table.insert(self.buffer, char)
end
-- read timeout
elseif err == 'timeout' then
timeout = timeout - 1
-- other error
else
break
end
end
line = table.concat(self.buffer)
if #line > 0 then
log('read timeout', line)
end
return nil, err
end
Post your logs when SMS does not reach the recipient.