1

我已经被这个问题困扰了好几天了(我在美国的一家公司远程工作,无法进行现场调试)。

我正在编写的应用程序使用 Redpark RS232 串行电缆,它使用 Q Codes与 HAAS CNC 机器通信。几个月前我写了一个 Node.js 应用程序,它使用了一个单独的 RS232 设备(MOXA RS232 Wi-fi 设备),它工作得几乎完美,但不幸的是,现场的 Wi-Fi 并不总是稳定的,所以 Node 服务器已经停止使用,取而代之的是当网络连接可用时,可以将机器状态保存到云的 iOS 应用程序。

首先,HAAS 机器的配置如下(这些设置用于旧的 RS232 设备 + 服务器应用程序):

RS232 端口的 HAAS 配置

然后我将这个配置映射到我的应用程序中:

func updateRS232Configuration() {
    if let _ = RS232Manager {
        settings.setNewValues(baudRate: 9600, dataBits: settings.DEFAULT_DATA_BITS, parity: settings.DEFAULT_PARITY, stopBits: settings.DEFAULT_STOP_BITS, rts: 1, cts: 1, DEBUG: true, ShowTxRx: true)

        RS232Manager?.setBaud(settings.baudRate!)     // 9600
        RS232Manager?.setDataSize(settings.dataBits!) // 7
        RS232Manager?.setParity(settings.parity!)     // Even
        RS232Manager?.setStopBits(settings.stopBits!) // 1

        var portConfig = serialPortConfig()
        RS232Manager?.getPortConfig(&portConfig)
        portConfig.rxFlowControl = settings.rts! // 0 (does this need to be enabled?)
        portConfig.txFlowControl = settings.cts! // 0
        portConfig.xonChar = 1
        portConfig.xoffChar = 1

        RS232Manager?.setPortConfig(&portConfig, requestStatus: false)

        self.performSelector(onMainThread: #selector(updateTextView), with: "Set the port configuration to: \(settings.toString())", waitUntilDone: false)
    }
}

每当cableConnected触发回调时都会调用此方法(现在我正在对值进行硬编码,但这些最终将是可配置的)。

当电缆连接并配置串行端口时,我向串行电缆发送了一条消息,其中包含Q100\r\n我使用\r\nHAAS 配置中所述的。我唯一担心的是writeString(redparks write 方法)附加了一个空终止字节,我认为空终止字节可能会导致消息在 HAAS 上被误解,所以我设置了两个写入一个之后其他:

func testWrite() {
        let str = commands.Q100
        let bytesToWrite = str.characters.count
        for index in 0...bytesToWrite-1 {
            let i = str.index(str.startIndex, offsetBy: index)
            txBuffer[index] = Array(String(str[i]).utf8)[0]
        }

        RS232Manager?.write(&txBuffer, length: UInt32(bytesToWrite))

        DispatchQueue.main.asyncAfter(deadline: .now() + 0.7, execute: {
            self.RS232Manager?.write("Q100\r\n")
        })
}  

通常我希望 HAAS 回复类似的内容(这是我编写的旧应用程序显示响应的方式):

旧应用响应

相反,我得到如下回应:

来自 HAAS 的返回消息

在查阅HAAS Q 代码文档时,这让我相信我可能会从机器得到响应,但它只是不理解该消息。

如果控件忙,则输出 Status, Busy。如果请求未被识别,则控件输出Unknown和新提示>

从上面的屏幕截图中我们可以看到一个>附加到了终端,但我没有看到一个未知字符串,这让我相信这不是一个格式错误的请求。

我读了回复:

func readBytesAvailable(_ length: UInt32) {
    if let bytesRead = RS232Manager?.read(&rxBuffer, length: length) {
        let byteStream : [UInt8] = Array(rxBuffer[0...Int(bytesRead)])
        if let resultString = String(bytes: byteStream, encoding: String.Encoding.ascii) {
            self.performSelector(onMainThread: #selector(updateTextView), with: "Got string: \(resultString)", waitUntilDone: false)
        } else {
            self.performSelector(onMainThread: #selector(updateTextView), with: "No string, got stream: \(byteStream)", waitUntilDone: false)
        }
    } else {
        self.performSelector(onMainThread: #selector(updateTextView), with: "No bytes available from host.", waitUntilDone: false)
    }
}

我也尝试过使用getStringFromBytesAvailable,但这会产生相同的输出,我上面的读取方法直接从rxBuffer.

有没有人知道我可能做错了什么?我的串口配置与第一张图片中的配置不匹配,还是我的字符串写入不正确/读取不正确。我已经坚持了好几天了,感觉我无处可去。

4

0 回答 0