我的英语不太好,所以我会尽力为你清楚。 我目前正在开展一个多项目项目。 我编写了一个Arduino控制程序,它允许我通过命令管理传感器网络。例如,我可以通过输入命令“add”等来添加传感器......
我还为微控制器编写了一个用于传感器数据采集的Java API(适用于所有类型的微控制器),它能够将命令文件发送到我的微控制器,以获取接收的数据并将其存储到我选择的格式的文件(JSON,XML,PostScript,字节码...),也可以在http标头格式下发送到IP地址......
我有以下问题:
当我从Java程序向我的微控制器发送命令时,Java程序有时无法接收命令执行响应,导致它崩溃:
Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version = RXTX-2.1-7
Received line : I: Tab cleared.
Received line : I: Setup terminated
|MicroController.java->messageReceived|: recieved response : I: Setup terminated
Send : add t1 2 3
Received line : I:|Main loop| command received :add t1 2 3
Received line : I:|Main loop| command add t1 2 3 in execution ...
Received line : I:|Main loop| command add t1 2 3 executed.
Received line : I:|Main loop| return code 0 sent.
如您所见,微控制器发送了返回码“0”,但Java没有收到它。
我已经编写了自己的send()和receive()方法:
/**
* Send message.
*
* @param str String to send.
*
* @throws IOException IO error.
* @throws InterruptedException
*/
public void sendMessage(String str)
throws IOException, InterruptedException
{
System.out.println("Send : " + str);
// Send the command.
output.write(str.getBytes());
output.flush();
}
/**
* Handle input event on the serial port.
*
* @param oEvent Event receives.
*/
private synchronized void processReceivedEvent(SerialPortEvent oEvent)
{
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE)
{
try
{
// Wait input to be ready (mandatory, exception o/w).
while (!input.ready())
{
Thread.sleep(1);
}
String inputLine = input.readLine();
System.out.println("Received line : " + inputLine);
// Notify listener.
if ((listener != null) && (inputLine != null))
listener.messageReceived(inputLine);
}
catch (Exception e)
{
if (port != null)
e.printStackTrace();
}
}
}
也许我有一些同步错误,导致串行读取错误,但我很想知道我的发送和接收方法与串行librairie方法之间是否存在某种冲突......
感谢。
答案 0 :(得分:0)
我终于解决了这个问题。我的代码中有一个BufferedReader,它正在崩溃阻止程序。 由于串行链接和这个无用的BufferedReader(当然在我的程序中没用),微控制器发送的消息与Java程序接收的消息之间有太多层,所以它在大多数时间都处于超时状态。
我放了一个简单的InputStream,以避免图层,并开发自己的阅读方法。
但我也有一个长期存在的问题:
当微控制器设置完成后,它会向Java程序发送以下消息:“I:Setup terminated”。
如果Java程序没有收到此消息,它将进入超时状态。 但有时,Java程序收到“termI:Setup terminated”,在“I:”前面有一些字符。
我不知道从哪里来......如果你有任何线索,那就太好了。
谢谢!