我从串口切断的rfids接收到,我发现在这种情况下,匹配到新行的模式不起作用,因为在每个接收到的数据之后是“\ n”。
问题是如何连接即将到来的字符串,直到状态变量字符串将等于16长度?我已经在Ruby中测试了它,并且连接的输出字符串将是"\u00027A005AFA518B\r\n\u0003"
,我假设匹配的字符串长度将等于16,最终我想提取所需的rfid:7A005AFA518B
。我可以用于此模式匹配吗?
当前数据处理程序:
def handle_info({:elixir_serial, serial, data}, state) do
[head | _tail] = String.split(data, "\r\n")
Logger.debug "head " <> head
Logger.debug "tail #{_tail}"
{:noreply, [data | state]}
end
使用rfid卡的双重检查记录:
[debug] 7A005
[debug] tail
[debug] AFA518B
[debug] tail
[debug] 7
[debug] tail
[debug] A005AFA518B
[debug] tail
答案 0 :(得分:3)
您可以简单地检查字符串的大小。由于它是十六进制,您可以使用byte_size/1(对于unicode字符串也有String.length/1):
def handle_info({:elixir_serial, serial, data}, state) do
[head | _tail] = String.split(data, "\r\n")
new_state = state <> data
case new_state do
rfid when byte_size(rfid) == 12 ->
#do something with RFID
{:noreply, ""}
_ ->
{:noreply, new_state}
end
end
确保在init函数中将初始状态设置为空字符串。