写入/读取时,Redpark RS232未返回所需数据

时间:2017-01-19 16:27:01

标签: ios swift serial-port redpark

我已经在这个问题上坚持了好几天了(我正在为一家美国公司工作,并且无法在现场进行调试)。

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

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

HAAS configuration for RS232 Port

然后我在我的应用中将此配置映射到:

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的串行电缆发送了一条消息,我使用HAAS配置中所述的\r\n。我唯一担心的是writeString(redparks写方法)附加一个空终止字节,我认为空终止字节可能会导致消息在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会回复类似的内容(这就是我写的旧应用程序会显示响应的方式):

old app response

相反,我得到的答案如下:

Return message from HAAS

在咨询HAAS Q Code documentation时,这让我相信我可能会从机器上得到回复而且它只是不理解这条消息。

  

如果控制正忙,则输出Status,Busy。如果无法识别请求,控件会输出未知并显示新提示>

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

我读回了回复:

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读取。

有没有人对我可能做错了什么有任何想法?我的串口配置是否与第一张图片中的配置不匹配,或者我是否错误地写了我的字符串/读取错误。我已经被困在这几天了,觉得我无处可去。

0 个答案:

没有答案