我面临与命令相关的问题AT+CUSD
。在某些 Gsm 调制解调器上,此命令需要三个参数,而在其他调制解调器上,它只需要两个参数。此外,这些参数的值不同。
我想知道,如何配置Gsm调制解调器,以便该命令可以在大多数Gsm调制解调器上以统一的方式执行。
例如:在诺基亚 c6-01上,只有这样才能成功执行 cusd 命令:
AT+CUSD=1,"*123#",15
Run Code Online (Sandbox Code Playgroud)
而在索尼爱立信 K750 上:
AT+CUSD=1,"*123#"
Run Code Online (Sandbox Code Playgroud)
如果我给出第三个参数,它会出错。
该命令在27.007中定义,语法如下
+CUSD=[<n>[,<str>[,<dcs>]]]
Run Code Online (Sandbox Code Playgroud)
所以实际上所有参数都是可选的,并且使用 0、1、2 或 3 个参数调用命令都是有效的。
关于该值,据我所知<dsc>
,其指定的默认值 0 映射到带有德语的 GSM 7 位默认字母表,而值 15 是根据23.038没有任何特定语言的 GSM 7 位默认字母表。它还说
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 命令的最终结果代码(您是,对吧?),因此实现后备算法并不需要太多额外的工作:
AT+CUSD
这应该是在大量手机上调用的最便携的方式。
顺便说一下,请注意27.007 规范中0
的值带有下划线。<n>
这有点微妙,但这意味着它是一个默认值,没有明确说明(<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 -
Run Code Online (Sandbox Code Playgroud)
如果您的调制解调器设备是 /dev/ttyASM0。
更新:您为字符串选择的字符集很可能是这里的问题,如本答案中所述。尝试运行一下AT+CSCS="GSM"
,看看是否有帮助。