我正在尝试通过COM端口发送AT命令,但只重新发送了相同的命令。
package SerialConnections; import jssc.SerialPort; import jssc.SerialPortEvent; import jssc.SerialPortEventListener; import jssc.SerialPortException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static ru.telemetria.qa.utils.Utilities.waitTime; public class M234Serial { private static Logger log = LoggerFactory.getLogger(M234Serial.class); private SerialPort serialPort; private byte[] receivedData; private boolean isReceived; public M234Serial() throws Exception { serialPort = new SerialPort("COM55"); } public void sendCommand() throws Exception { open(); String command = "AT^SCFG?"; serialPort.writeBytes(command.getBytes()); log.debug("Send request: " + command); while (!isReceived) {} close(); } private void open() throws Exception { serialPort.openPort(); serialPort.setParams(SerialPort.BAUDRATE_115200, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); serialPort.addEventListener(new SerialPortEventListener() { @Override public void serialEvent(SerialPortEvent serialPortEvent) { try { waitTime(System.currentTimeMillis(), 2000); receivedData = serialPort.readBytes(); log.debug("Received message: " + StringUtils.asciiToString(receivedData)); isReceived = true; serialPort.removeEventListener(); } catch (SerialPortException spe) { spe.printStackTrace(); } } }); } private void close() throws Exception { serialPort.closePort(); } public static void main(String[] args) throws Exception { log.debug("Create instance.."); M234Serial serial = new M234Serial(); serial.sendCommand(); log.debug("End"); } }
日志:
16:19:21.910 [main]调试SerialConnections.M234Serial-创建实例。
16:19:21.974 [main]调试SerialConnections.M234Serial-发送请求:AT ^ SCFG?
16:19:23.976 [EventThread COM55]调试SerialConnections.M234Serial-收到的消息:AT ^ SCFG?
16:19:23.977 [main]调试SerialConnections.M234Serial-结束
我在做什么错,我该如何解决?
像这样的繁忙等待while (!isReceived) {}将产生可怕的性能,因此,如果保留该结构,则应将变量从布尔值更改为互斥量/信号量或类似的东西。但是您不应该保留它,因此我仅出于参考目的而提及它。
while (!isReceived) {}
首先,获取V.250调制解调器标准的副本,并至少阅读第5章的全部内容。这将教给您许多基本的AT命令处理,例如AT命令行应以终止\r。
\r
AT ^ SCFG命令显然是专有的制造商特定命令,因此我没有文档参考。3GPP标准化的大多数与手机相关的AT命令在27.007中给出,尽管某些(与SMS相关)在27.005中给出
如开头所述,结构需要更改。你应该 永远,永远,永远,永远 使用waitTime,sleep或任何类似的等待从调制解调器的响应。它就像踢狗挡在您的路上以让它们移动一样有用。是的,您可能很幸运,有时它确实可以工作,但是在某些时候,您会为采用这种方法感到遗憾…
waitTime
sleep
唯一可靠的方法是执行类似于
serialPort.openPort(); ... // start sending AT^SCFG? serialPort.writeBytes("AT^SCFG?\r"); do { line = readLine(serialPort); } while (! is_final_result_code(line)) // Sending of AT^SCFG? command finished (successfully or not) ... serialPort.closePort();
该readLine函数从串行端口读取一个字节和一个字节,直到它接收到以结尾的完整行\r\n,然后返回该行。
readLine
\r\n
你可以看一下代码为atinout针对的一个例子is_final_result_code功能(也可以比较isFinalResponseError,并isFinalResponseSuccess在ST- Ericsson的U300 RIL,但请注意,CONNECT不是最终结果代码,它是一个中间结果码,故得名isFinalResponseSuccess是严格来说不是100%正确)。
is_final_result_code
isFinalResponseError
isFinalResponseSuccess
CONNECT
命令发送被接收回的问题与调制解调器回显该命令有关。可以使用ATE命令禁用此功能,但是使用上述适当的解析结构通常并不重要,因为您只需将echoed命令读为将被忽略的行即可。
ATE