1

我正在用 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);
4

1 回答 1

0

您正在侦听套接字上设置 O_NONBLOCK 。请尝试在实际从中读取的接受套接字(客户端)上。

于 2014-12-12T00:10:37.913 回答