我正在用 C 语言编写一个在 Intel Edison 上运行的“竞赛盒”。它可以通过基于蓝牙聊天的 Android 应用程序发送或接收蓝牙数据。一切正常。我可以发送和接收。我可能会失去连接并重新获取连接,然后连接又回来了,数据从 C 程序流向 Android 应用程序。一切都很好,除非我重新连接后无法再将数据从 C 发送到 Android。我已经将此追溯到 read 语句,并且我认为它永远不会返回值,因为它永远不会退出 while 循环。具体来说,这一行:
while(bluetooth_up == 1 && (read(client, &aa, 1) == -1) ){
即使我知道 bluetooth_up == 0 也不会退出(另一个线程 fprints bluetooth_up 并且当蓝牙关闭时它为 0)。我的结论是 read 被阻塞了,所以我试图用这条线来解决这个问题
fcntl(s, F_SETFL,sock_flags|O_NONBLOCK);
蓝牙连接在蓝牙写入线程中。但是就像我说的,除了当 bluetooth_up 为 0 时,这个 while 循环不会退出之外,一切都正常。
我能弄清楚的是读取被阻塞了,我无法弄清楚如何让它不阻塞,所以它会返回-1,while循环可以看到bluetooth_up == 0并退出。
这是bluetooth_up的全局定义
volatile int bluetooth_up = 0;
我会很感激这方面的帮助,因为它需要很强大,我不想要求人们重新启动竞赛盒以使蓝牙再次工作,尽管这确实有效。
void *blueRead(void *arg){
blue_read_up = 1;
char aa;
char buffer[500];
int idx = 0;
printf("\nBlue Read started\n");
fcntl(s, F_SETFL,sock_flags|O_NONBLOCK);
while(bluetooth_up == 1){
if (new_blue_read_sentence == 0 && bluetooth_up == 1){
while(bluetooth_up == 1 && (read(client, &aa, 1) == -1) ){
if(bluetooth_up == 0){
printf("\nExiting blue read\n");
blue_read_up = 0;
return NULL;
}
}
printf("%i",aa);
if(aa != '\n')
{
buffer[idx++] = aa;
}
else
{
buffer[idx] = '\n';
buffer[idx + 1] = '\0';
idx = 0;
strcpy( blue_read_buffer, buffer);
new_blue_read_sentence = 1;
}
}
}
printf("\nExiting blue read 2\n");
blue_read_up = 0;
return NULL;
}
我认为蓝牙连接代码非常标准,但在这里
// allocate socket
s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
printf("\nsocket = %i\n", s);
// bind socket to port 1 of the first available local bluetooth adapter
loc_addr.rc_family = AF_BLUETOOTH;
loc_addr.rc_bdaddr = *BDADDR_ANY;
loc_addr.rc_channel = (uint8_t)1;
retval = bind(s, (struct sockaddr*)&loc_addr, sizeof(loc_addr));
printf("\nbind = %i\n", retval);
// put socket into listening mode
//listen(s, 1);
retval = listen(s, 1);
printf("\nlisten = %i\n", retval);
// accept one connection
client = accept(s, (struct sockaddr*)&rem_addr, &opt);
sock_flags = fcntl(s,F_GETFL,0);
fcntl(s, F_SETFL,sock_flags|O_NONBLOCK);
printf("\n1 - client connect = %i socket %i\n", client, s);