如何处理单按键含双交替信号的遥控器?解决irsend报错问题
一、先解决"unknown remote: dishtv"错误
这个报错大概率是lircd服务没正确加载你的dishtv.lircd.conf配置文件,或者路径、权限出了问题,按以下步骤排查:
确认配置文件放置路径
多数Linux系统中,lircd默认从/etc/lirc/lircd.conf.d/目录加载配置。把你的配置文件复制到这个目录:sudo cp dishtv.lircd.conf /etc/lirc/lircd.conf.d/要是用的旧版lircd,可能路径是
/etc/lirc/remotes/,可以用lircd --help查看默认加载目录。重启lircd服务
新配置必须重启服务才能生效:sudo systemctl restart lircd # 若用sysvinit系统,执行下面的命令 sudo service lircd restart验证遥控器是否被识别
执行irsend LIST dishtv "",如果返回你的按键(比如ok),说明配置加载成功:irsend LIST dishtv ""要是仍报错,检查配置文件语法——你的现有结构是对的,但要确保
name dishtv的名称和你irsend命令里用的完全一致(比如irsend SEND_ONCE dishtv ok)。排查Input/output error
解决unknown remote后还出现这个错误,可能是硬件问题:- 确认红外发射器连接正确、驱动已加载
- 用
mode2测试硬件是否正常:
按遥控器按键能输出脉冲信号的话,说明硬件没问题;否则检查接线或驱动。mode2 -d /dev/lirc0
二、处理按键的交替信号问题
不少遥控器(比如采用NEC协议的)会为同一个按键发送两种交替的脉冲码(用来区分重复按键和新按键),直接用RAW_CODES会导致只有一种码能被识别,你可以用这两种方法处理:
方法1:在raw_codes中添加交替码
如果捕获到同一个按键的两种不同脉冲序列,把它们都加到对应按键的raw_codes下,比如:
begin raw_codes name ok # 第一种信号序列 868 802 1720 1646 1695 828 849 831 849 1674 1695 828 849 1674 849 831 849 831 849 831 1695 # 第二种交替信号序列 870 800 1718 1648 1693 830 851 829 851 1672 1693 830 851 1672 851 829 851 829 851 829 1693 end raw_codes
这样lircd会把两种序列都识别为ok按键。
方法2:使用标准协议代替RAW_CODES
如果你的遥控器用的是标准红外协议(比如NEC、RC5),别用RAW_CODES,直接指定协议,lircd会自动处理交替码。比如NEC协议的配置可以改成这样:
begin remote name dishtv flags NEC|CONST_LENGTH eps 30 aeps 100 header 9000 4500 one 560 1690 zero 560 560 gap 108000 toggle_bit_mask 0x80000000 begin codes ok 0x12345678 # 替换成你捕获的NEC码 # 其他按键... end codes end remote
你也可以用irrecord重新捕获,它会自动识别协议:
sudo irrecord -d /dev/lirc0 dishtv_new.conf
跟着提示操作,工具会帮你生成带正确协议的配置,自动处理交替信号。
内容的提问来源于stack exchange,提问作者Sahil Saxena

