我已经在这个问题上坚持了好几天了(我正在为一家美国公司工作,并且无法在现场进行调试)。
我正在编写的应用程序使用Redpark RS232串行电缆与HAAS CNC机器using Q Codes对话。几个月前我写了一个Node.js应用程序,它使用了一个单独的RS232设备(MOXA RS232 Wi-fi设备),它几乎完美地工作但不幸的是Wi-Fi在现场并不总是稳定所以节点服务器已经停止支持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
的串行电缆发送了一条消息,我使用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会回复类似的内容(这就是我写的旧应用程序会显示响应的方式):
相反,我得到的答案如下:
在咨询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
读取。
有没有人对我可能做错了什么有任何想法?我的串口配置是否与第一张图片中的配置不匹配,或者我是否错误地写了我的字符串/读取错误。我已经被困在这几天了,觉得我无处可去。