我想通過藍牙發送我的測量數據(溫度,溼度和壓力),它必須是連續的,所以我使用線程,但對我來說太複雜了。使用線程的連續藍牙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 ***
我說得對,我需要使用互斥鎖來鎖定數據嗎?
謝謝你的回覆! 是否有任何其他方式來處理這種情況,因爲valgrind並不明顯在arm架構上工作。我得到這個錯誤:valgrind:無法啓動平臺'arm-linux'的工具'memcheck':沒有這樣的文件或目錄 - 編輯:似乎也有樹莓派的valgrind。 – jakeheik90 2014-10-10 13:34:12