2016-07-31 138 views
0

我已經連接HC-05藍牙模塊到microZed板,並嘗試通過uart在Linux中發送和接收數據,現在發送代碼正在工作,當我從我的板發送數據它完美的作品下面給出的程序是我發送串行端口卡在讀取()數據

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <assert.h> 
#include <pthread.h> /* for threads */ 
#include <termios.h> /* uart */ 
#include <fcntl.h> /* uart */ 
#include <unistd.h> /* uart */ 
#define MODEMDEVICE "/dev/ttyPS1" 
int main() 
{ 
printf("Opening %s\n", MODEMDEVICE); 
int portfd = open(MODEMDEVICE, O_RDWR | O_NOCTTY); 
if (portfd < 0) { 
printf("ERROR coultn't open %s\n", MODEMDEVICE); 
return -1; 
} 
/* set terminal settings */ 
struct termios tty; 
tcgetattr(portfd, &tty); 

cfsetospeed(&tty, (speed_t)B9600); 
cfsetispeed(&tty, (speed_t)B9600); 
tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; 
tty.c_iflag = IGNBRK; 
tty.c_lflag = ICANON; 
tty.c_oflag = 0; 
tty.c_cflag |= CLOCAL | CREAD; 
tty.c_cc[VTIME] = 0; 
tty.c_cc[VMIN] = 1; 
tty.c_iflag &= ~(IXON | IXOFF | IXANY); 
tty.c_cflag &= ~(PARENB | PARODD); 
tty.c_cflag |= PARENB; 
tty.c_cflag &= ~CSTOPB; 
tcsetattr(portfd, TCSANOW, &tty); 
/* sleep a bit */ 
usleep(200000); 
/* flush possible characters in the input buffer */ 
tcflush(portfd, TCIOFLUSH); 
char buf; 

int i; 

while(1) { 

    buf++; 
    write(portfd, &buf, 1); 
    write(portfd, "\r\n", 2); 
    usleep(200000); 

} 
return 0; 
} 

現在,當我嘗試從應用程序將數據發送到藍牙模塊,有時程序停止並說「隨機非阻塞池初始化」或出現問題的代碼它被卡在i = read(portfd, buf, 20);在下面給出的代碼

#include <string.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <assert.h> 
#include <pthread.h> /* for threads */ 
#include <termios.h> /* uart */ 
#include <fcntl.h> /* uart */ 
#include <unistd.h> /* uart */ 
#define MODEMDEVICE "/dev/ttyPS1" 
int main() 
{ 
printf("Opening %s\n", MODEMDEVICE); 
int portfd = open(MODEMDEVICE, O_RDWR | O_NOCTTY); 
if (portfd < 0) { 
printf("ERROR coultn't open %s\n", MODEMDEVICE); 
return -1; 
} 

    printf("hello1\n\r"); 
/* set terminal settings */ 
struct termios tty; 
tcgetattr(portfd, &tty); 

cfsetospeed(&tty, (speed_t)B9600); 
cfsetispeed(&tty, (speed_t)B9600); 
tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; 
tty.c_iflag = IGNBRK; 
tty.c_lflag = ICANON; 
tty.c_oflag = 0; 
tty.c_cflag |= CLOCAL | CREAD; 
tty.c_cc[VTIME] = 0; 
tty.c_cc[VMIN] = 1; 
tty.c_iflag &= ~(IXON | IXOFF | IXANY); 
tty.c_cflag &= ~(PARENB | PARODD); 
tty.c_cflag |= PARENB; 
tty.c_cflag &= ~CSTOPB; 
tcsetattr(portfd, TCSANOW, &tty); 
/* sleep a bit */ 
    printf("hello2\n\r"); 
usleep(200000); 
/* flush possible characters in the input buffer */ 
tcflush(portfd, TCIOFLUSH); 
char buf[20]; 
     printf("hello3\n\r"); 
int i; 

while(1) { 
    i = read(portfd, buf, 20); 
     printf("hello\n\r"); 

    buf[i] = 0; 
    printf("%s", buf); 
    printf("\n\r"); 

} 
return 0; 
} 

任何建議如何解決這個問題?

+0

您是否期望第二個程序能夠讀取第一個程序發送的答案? – alk

+0

此外,發送代碼發送'buf'的未初始化內容。 – alk

+1

您需要更好地檢查所有系統調用的返回碼。你的termios設置不合理。首先你禁用PARENB,但然後恢復它。而沒有ISTRIP的PARENB是不尋常的。請參閱[正確設置終端模式](http://www.chemie.fu-berlin.de/chemnet/use/info/libc/libc_12.html#SEC237) 和[用於POSIX操作系統的串行編程指南](http: //www.cmrr.umn.edu/~strupp/serial.html)。你肯定收到的數據是規範的嗎? – sawdust

回答

0

我找到了解決辦法,第一個錯誤是由這個post指出的。 我應該設置時間等待字符讀爲大於0和字符的最小數量的閱讀零

tty.c_cc[VTIME] = 5; 
tty.c_cc[VMIN] = 0; 

,我需要的tty.c_lflag標誌設置爲0,使原始輸入,而不是規範的,現在代碼正在不斷讀取數據

+0

*「...我需要設置tty.c_lflag標誌爲0」* - 我從來沒有這樣建議。這是錯誤的代碼。請參閱http://stackoverflow.com/questions/37944461/linux-reading-data-from-uart/37956065#37956065 – sawdust