我正在编写通过交换 ASCII 命令连接外部设备的软件。示例:
POS? 1 2
=>1=-1158.4405
=>2=+0000.0000
上面我们要求电动显微镜台的第一轴和第二轴的位置。它以 um 中的位置进行响应。更多 details and examples .
我的问题:是否有一个库可以轻松解析此类字符串输出,和/或帮助生成查询? 否则,使用 Java/Scala 解析和与硬件通信的最佳实践是什么?
最佳答案
尝试处理以下语法(请参阅12.1 格式
):
Reply syntax:
[<argument>[{SP<argument>}]"="]<value>LF
Multi-line reply syntax:
{[<argument>[{SP<argument>}]"="]<value>SP LF}
[<argument>[{SP<argument>}]"="]<value>LF for the last line!
这是我的代码:
import scala.util.parsing.combinator._
case class Result(argument: String, value: Float)
class ReplyParser extends RegexParsers{
override def skipWhitespace = false
private def floatingPointNumber: Parser[String] =
"""(-|\+)?(\d+(\.\d*)?|\d*\.\d+)""".r
private def value: Parser[Float] = floatingPointNumber ^^ (_.toFloat)
private def argument: Parser[String] = "[^= \n]+".r
private def arguments: Parser[List[String]] = rep1sep(argument," ") <~ "="
private def result: Parser[List[Result]] = arguments.? ~ value ^^ {
case arguments ~ value =>
arguments.getOrElse(List("")).map {
Result(_,value)
}
}
def reply: Parser[List[Result]] = rep1sep(result, " \n".r) <~ " " ^^ {
case result => result.flatten
}
}
object Parsing extends ReplyParser {
def main(args: Array[String]) {
val result = parseAll(reply,"a=+000.123 \nc d=-999.567 \n789 ")
println(s"$result")
}
}
关于java - 使用 Java/Scala 解析与硬件的 ASCII 通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31280761/