我已经被这个问题困扰了好几天了(我在美国的一家公司远程工作,无法进行现场调试)。
我正在编写的应用程序使用 Redpark RS232 串行电缆,它使用 Q Codes与 HAAS CNC 机器通信。几个月前我写了一个 Node.js 应用程序,它使用了一个单独的 RS232 设备(MOXA RS232 Wi-fi 设备),它工作得几乎完美,但不幸的是,现场的 Wi-Fi 并不总是稳定的,所以 Node 服务器已经停止使用,取而代之的是当网络连接可用时,可以将机器状态保存到云的 iOS 应用程序。
首先,HAAS 机器的配置如下(这些设置用于旧的 RS232 设备 + 服务器应用程序):
然后我将这个配置映射到我的应用程序中:
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\n
HAAS 配置中所述的。我唯一担心的是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 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
.
有没有人知道我可能做错了什么?我的串口配置与第一张图片中的配置不匹配,还是我的字符串写入不正确/读取不正确。我已经坚持了好几天了,感觉我无处可去。