2014-10-09 34 views
0

我想通過藍牙發送我的測量數據(溫度,溼度和壓力),它必須是連續的,所以我使用線程,但對我來說太複雜了。使用線程的連續藍牙C程序

這裏是藍牙客戶端代碼:

#include "defines.h" 

    void L2CAP_client(char *b_addr, float *temp, float *humi, float *pressure) 
    { 
     struct sockaddr_l2 addr = { 0 }; 

     struct Measurement_Data *Thread_Data = malloc(sizeof(struct Measurement_Data)); 
     int s, status; 
     char dest[18]; 

     pthread_t Measurement_data_thread = 0; 
     int iret = 0; 
     pthread_t Thread_id; 

     strncpy(dest, b_addr, 18); 

     // allocate a socket 
     s = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); 
     Thread_Data->s_ptr = s; 

     // set the connection parameters (who to connect to) 
     addr.l2_family = AF_BLUETOOTH; 
     addr.l2_psm = htobs(0x1001); 
     str2ba(dest, &addr.l2_bdaddr); 

     // connect to server 
     status = connect(s, (struct sockaddr *)&addr, sizeof(addr)); 

     Thread_Data->temp = *temp; 
     Thread_Data->humi = *humi; 
     Thread_Data->pressure = *pressure; 

     // send a message 
     if(status == 0) { 

      iret = pthread_create(&Measurement_data_thread, NULL, &Thread_Function, (void*) &Thread_Data); 
     if(iret != 0){ 
     perror("Thread creation failed\n"); 
     } 
    Thread_id = pthread_self(); 
    printf("ID of Temp_thread is: %u\n", (unsigned int)Thread_id); 

} 

    if(status < 0) perror("uh oh"); 

    printf("Thread 1 returns: %d\n",iret); 

    pthread_join(Measurement_data_thread, NULL); 


    close(s); 
} 

void *Thread_Function(void* Measurement_Data) 
{ 
    int s = 0; 
    struct Measurement_Data *Thread_Data = (struct Measurement_Data*) Measurement_Data; 

    s = Thread_Data->s_ptr; 
    send(s, &Thread_Data, sizeof(Thread_Data), 0); 
    free(Thread_Data); 

    //return 0; 
} 

這裏是藍牙服務器代碼:

#include "defines.h" 

struct Measurement_Data *L2CAP_server(void) 
{ 
    struct sockaddr_l2 loc_addr = { 0 }, rem_addr = { 0 }; 
    char buf[256] = { 0 }; 
    int s, client, bytes_read; 
    int opt = sizeof(rem_addr); 
    static struct Measurement_Data Data; 
    struct Measurement_Data *Thread_Data = malloc(sizeof(struct Measurement_Data)); 

    pthread_t Measurement_data_thread = 0; 
    int iret = 0; 
    pthread_t Thread_id; 

    // allocate socket 
    s = socket(AF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_L2CAP); 

    // bind socket to port 0x1001 of the first available 
    // bluetooth adapter 
    loc_addr.l2_family = AF_BLUETOOTH; 
    loc_addr.l2_bdaddr = *BDADDR_ANY; 
    loc_addr.l2_psm = htobs(0x1001); 

    bind(s, (struct sockaddr *)&loc_addr, sizeof(loc_addr)); 

    // put socket into listening mode 
    listen(s, 1); 

    // accept one connection 
    client = accept(s, (struct sockaddr *)&rem_addr, &opt); 
    Thread_Data->c_ptr = client; 

    ba2str(&rem_addr.l2_bdaddr, buf); 
    fprintf(stderr, "accepted connection from %s\n", buf); 

    memset(buf, 0, sizeof(buf)); 

    iret = pthread_create(&Measurement_data_thread, NULL, &Thread_Function, (void*) &Thread_Data); 
    if(iret != 0){ 
     perror("Thread creation failed\n"); 
    } 
    Thread_id = pthread_self(); 
    printf("ID of Temp_thread is: %u\n", (unsigned int)Thread_id); 


    printf("Thread 1 returns: %d\n",iret); 

    pthread_join(Measurement_data_thread, NULL); 

    // close connection 
    close(client); 
    close(s); 

    return (&Data); 

} 
void *Thread_Function(void* Measurement_Data) 
{ 
    int c = 0; 
    struct Measurement_Data *Thread_Data = (struct Measurement_Data*) Measurement_Data; 

    c = Thread_Data->c_ptr; 
    recv(c, &Thread_Data, sizeof(Thread_Data), 0); 
    printf("Temp: %0.1f\n", Thread_Data->temp); 
    printf("Humi: %0.1f\n", Thread_Data->humi); 
    printf("Pres: %0.1f\n", Thread_Data->pressure); 
    free(Thread_Data); 

    //return 0; 
} 

它僅發送零,我也收到此錯誤:* glibc的檢測* ./anturi_luku:munmap_chunk():無效指針:0xbef48738 ***

我說得對,我需要使用互斥鎖來鎖定數據嗎?

回答

0

Valgrind在這種情況下是一個非常有用的工具。你能使用Valgrind嗎?你能分享valgrind報告嗎?

確保使用'db-attach'選項,因爲Valgrind將在顯示的每個錯誤後暫停並打印該行。通過用您的文件名替換a.out來嘗試使用以下命令。

$ Valgrind的--tool = MEMCHECK --db-附加= YES ./a.out

+0

謝謝你的回覆! 是否有任何其他方式來處理這種情況,因爲valgrind並不明顯在arm架構上工作。我得到這個錯誤:valgrind:無法啓動平臺'arm-linux'的工具'memcheck':沒有這樣的文件或目錄 - 編輯:似乎也有樹莓派的valgrind。 – jakeheik90 2014-10-10 13:34:12

0

下面是來自客戶端的Valgrind的報告:

==2157== Memcheck, a memory error detector 
==2157== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. 
==2157== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info 
==2157== Command: ./anturi_luku 
==2157== 
Temperature: 22.7C 
Humidity: 61.7% 
Temperature: 22.7C 
Humidity: 61.7% 
pressure= 0, 0, 0 
Pressure: 0.0 Pa 
ID of Temp_thread is: 67241968 
Thread 1 returns: 0 
==2157== Thread 2: 
==2157== Invalid free()/delete/delete[]/realloc() 
==2157== at 0x48348B8: free (vg_replace_malloc.c:427) 
==2157== by 0x8C0B: Thread_Function (L2CAP_client.c:89) 
==2157== by 0x485FBFB: start_thread (pthread_create.c:306) 
==2157== by 0x4962967: ??? (clone.S:116) 
==2157== Address 0xbde575e8 is on thread 1's stack 
==2157== 
==2157== 
==2157== ---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ---- n 
==2157== 
==2157== HEAP SUMMARY: 
==2157==  in use at exit: 16 bytes in 1 blocks 
==2157== total heap usage: 2 allocs, 2 frees, 152 bytes allocated 
==2157== 
==2157== LEAK SUMMARY: 
==2157== definitely lost: 16 bytes in 1 blocks 
==2157== indirectly lost: 0 bytes in 0 blocks 
==2157==  possibly lost: 0 bytes in 0 blocks 
==2157== still reachable: 0 bytes in 0 blocks 
==2157==   suppressed: 0 bytes in 0 blocks 
==2157== Rerun with --leak-check=full to see details of leaked memory 
==2157== 
==2157== For counts of detected and suppressed errors, rerun with: -v 
==2157== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 17 from 6) 
0

很高興你能通過ARM以C語言獲取藍牙L2CAP客戶端的Valgrind報告。

正如你所看到的,當第一個錯誤發生時,你會被問到以下幾點。

----附加到調試器? --- [Return/N/n/Y/y/C/c] ----

按下Ret或N Ret或n Ret,將導致Valgrind不會爲此錯誤啓動調試器。

按下Y Ret或y Ret將導致Valgrind在此時啓動程序的調試器。

從日誌中可以看出'n'被使用。你能用'Y'來嘗試嗎?

此外,從日誌看來,它似乎表示無效的自由完成。內聯到它,似乎free()被稱爲未分配的內存。覈實。

+0

這很奇怪,因爲我分配了兩次內存,並且我可以從代碼中看到兩次釋放內存。那麼我是否在分配或釋放錯誤? – jakeheik90 2014-10-12 10:19:00

0

現在我得到該錯誤消息消失。這是pthread_create函數的第四個參數。我刪除了&字符。現在函數如下所示:pthread_create(& Measurement_data_thread,NULL,& Thread_Function,(void *)Thread_Data);

但它並沒有發送或接收任何數據。當我使用printf來檢查發送端發送的數據值thread_function時,它們很好。但在接受結束時,它有時只打印零,有時甚至沒有打印。

現在是否需要互斥鎖來鎖定數據?