该命令在27.007中定义,语法为
+CUSD=[<n>[,<str>[,<dcs>]]]
所以实际上所有参数都是可选的,使用 0、1、2 或 3 个参数调用命令是有效的。
关于<dsc> 值,据我所知,其指定的默认值 0 映射到具有德语的 GSM 7 位默认字母表,值 15 是没有任何特定语言的 GSM 7 位默认字母表 23.038。它还说
GSM 7 位默认字母表的实现是强制性的。是否支持其他字符集是可选的。
因此,如果诺基亚设备出现AT+CUSD=1,"*123#" 错误,我会解释为它没有任何德语支持,因此会失败。至于索尼爱立信手机,如果给定任何值的<dcs> 参数,我不能说它为什么会失败(当然会有几个值它会失败,但它应该支持 15)。尝试迭代语言,看看是否有任何收获(例如是否支持英语?)。
您可以尝试以其他方式指定 GSM 7 位,例如32(或者可能通过探索Any reserved codings shall be assumed to be the GSM 7 bit default alphabet (the same as codepoint 00001111) by a receiving entity.,尽管这可能不适用于所有手机)。
由于您正在检查您在任何情况下发出的任何 AT 命令的最终结果代码(您是,对吗?),实现回退算法并没有太多额外的工作:
- 首先尝试使用 dcs = 15 调用
- 如果失败,则使用 dcs = 32 调用
- 最后,如果以上都失败了,请尝试不使用 dcs。
这应该是在大量手机上调用AT+CUSD 的最便携方式。
顺便说一下,请注意 <n> 的 0 值在 27.007 规范中带有下划线。这有点微妙,但它意味着它是一个默认值,没有明确说明(例如为<dsc> 完成)。所以AT+CUSD= 与AT+CUSD=0 相同(实际上您甚至可以调用AT+CUSD=,"*123#" 与AT+CUSD=0,"*123#" 相同,尽管您可能会遇到无法正确解析的手机。索尼爱立信早期生产的所有手机/调制解调器,而且几乎都是后来生产的,所有基于ST-Ericsson平台的手机都会正确解析这个)。
如果您想自动化测试,您可以使用我的
atinout 程序,例如:
echo ATE1 | atinout - /dev/ttyACM0 -
for i in $(seq 0 15) 32; \
do \
echo AT+CUSD=1,"xxxx",$i; \
done | atinout - /dev/ttyACM0 -
如果您的调制解调器设备是 /dev/ttyASM0。
更新:您为字符串选择的字符集很可能是这里的问题,如this answer 中所述。尝试运行AT+CSCS="GSM" 看看是否有帮助。