繁体   English   中英

当C中的蓝牙连接丢失时,蓝牙读取线程不会退出

[英]bluetooth read thread will not exit when bluetooth connection lost in c

我正在用C编写一个在英特尔Edison上运行的“赛车盒”。 它可以使用基于蓝牙聊天的Android应用发送或接收蓝牙数据。 一切正常。 我可以发送和接收。 我可能会失去连接并重新获取,连接恢复,并且数据从C程序流向Android应用程序。 一切都很好,除非我重新连接后就无法再将数据从C发送到Android。 我已经将其追溯到read语句,并且我假设它永远不会返回值,因为它永远不会退出while循环。 具体来说,此行:

while(bluetooth_up == 1 && (read(client, &aa, 1) == -1) ){

即使我知道bluetooth_up == 0也不会退出(另一个线程fprints bluetooth_up,当蓝牙关闭时它为0)。 我的结论是阅读受阻,所以我试图用这种方式解决

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);

您正在侦听套接字上设置O_NONBLOCK。 尝试改用accept套接字(客户端),该套接字实际上是从中读取的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM