我试图运行一个串行通信示例,以便将数据从Arduino发送到可提供的代码http://playground.arduino.cc/Interfacing/Cocoa(IOKit/ioctl方法)中的可可应用程序。它可以工作,但是一旦启动,我无法停止接收器线程。如何关闭可可后台线程中的串行通信
我已经实现了一个开关按钮(开始/停止),其在启动时打开串行端口并启动接收器线程:
- (IBAction) startButton: (NSButton *) btn {
(…)
error = [self openSerialPort: [SelectPort titleOfSelectedItem] baud:[Baud intValue]];
(…)
[self refreshSerialList:[SelectPort titleOfSelectedItem]];
[self performSelectorInBackground:@selector(incomingTextUpdateThread:) withObject:[NSThread currentThread]];
(…)
}
线程代码实际上是相同的如示例中,除了我所包含的代码从接收缓冲区重建串行数据包并将其保存到一个SQLite数据库:
- (void)incomingTextUpdateThread: (NSThread *) parentThread {
// mark that the thread is running
readThreadRunning = TRUE;
const int BUFFER_SIZE = 100;
char byte_buffer[BUFFER_SIZE]; // buffer for holding incoming data
int numBytes=0; // number of bytes read during read
(…)
// assign a high priority to this thread
[NSThread setThreadPriority:1.0];
// this will loop until the serial port closes
while(TRUE) {
// read() blocks until some data is available or the port is closed
numBytes = (int) read(serialFileDescriptor, byte_buffer, BUFFER_SIZE); // read up to the size of the buffer
if(numBytes>0) {
// format serial data into packets, but first append at start the end of last read
buffer = [[NSMutableString alloc] initWithBytes:byte_buffer length:numBytes encoding:NSASCIIStringEncoding];
if (status == 1 && [ipacket length] != 0) {
[buffer insertString:ipacket atIndex:0];
numBytes = (int) [buffer length];
}
ipacket = [self processSerialData:buffer length:numBytes]; // Recompose data and save to database.
} else {
break; // Stop the thread if there is an error
}
}
// make sure the serial port is closed
if (serialFileDescriptor != -1) {
close(serialFileDescriptor);
serialFileDescriptor = -1;
}
// mark that the thread has quit
readThreadRunning = FALSE;
}
我尝试关闭该端口在主线程中使用此代码,也startButton选择的一部分,遵循提供的示例:
if (serialFileDescriptor != -1) {
[self appendToIncomingText:@"Trying to close the serial port...\n"];
close(serialFileDescriptor);
serialFileDescriptor = -1;
// Revisar... crec que el thread no s'adona que s'ha tancat el file descriptor...
// wait for the reading thread to die
while(readThreadRunning);
// re-opening the same port REALLY fast will fail spectacularly... better to sleep a sec
sleep(0.5);
//[btn setTitle:@"Start"];
[Start setTitle:@"Start"];
}
但似乎接收线程不知道全局变量serialFileDescriptor中的状态变化。
它是否向您发送人类可读的纯文本或某种二进制数据? NSString及其后代只能用于前者;如果你正在阅读后者,你应该使用NSMutableData。 – 2013-02-19 20:39:24
此外,假设你的'buffer' /'ipacket'舞蹈是为了做我认为正在做的事情,还有更有效的方法来做到这一点。看看'appendString:'或'appendData:'。 – 2013-02-19 20:46:04