2016-12-26 118 views
0

我的beagleboneblack(我們稱之爲「BBB」)運行的是3.8.13-bone47,並且我一直在被一個bug困擾2周。BeagleboneBlack Uart遇到了很大的麻煩

我的問題是:當我的BBB得到一個字符串時,我的BBB會發送相同的字符串到另一個終端。例如:我的帶有Uart2USB橋接器的筆記本發送了一個字符串「asd」,然後BBB將得到「asd」。但同時,BBB會將「asd」發送到我的筆記本電腦。以及BBB上的所有Uart模塊(Uart1 ,Uart2,Uart4)做了同樣的事情。順便說一句,我試圖通過使用兩個Uart(一個用於TX,另一個用於RX)來避免這個錯誤。幸運的是,我做到了,但我仍然想知道原因和解決方案。

這裏是我的Uart.c,Uart.h和test.c的:

/*====================Uart.c================*/ 
#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <termios.h> 
#include <errno.h> 
#include <sys/time.h> 
#include <string.h> 
#include "Uart.h" 

#define TRUE 1 
#define FALSE -1 

int fd_uart; 

void set_speed(void) 
{ 
     int i; 
     int status; 
     int speed_arr = B38400; 

     struct termios Opt; 
     tcgetattr(fd_uart,&Opt); 

     tcflush(fd_uart, TCIOFLUSH); 

     cfsetispeed(&Opt, speed_arr); 
     cfsetospeed(&Opt, speed_arr); 

     status = tcsetattr(fd_uart, TCSANOW, &Opt); 

     if(status != 0) 
       perror("tcsetattr fd1"); 
} 

int set_Parity(void) 
{ 
     struct termios options; 
     if(tcgetattr(fd_uart,&options)!= 0) 
     { 
      perror("SetupSerial 1"); 
      return(FALSE); 
     } 

     options.c_cflag &= ~CSIZE; 

     options.c_cflag |= CS8; 

     options.c_cflag &= ~PARENB; /* Clear parity enable */ 
     options.c_iflag &= ~INPCK;  /* Enable parity checking */ 
     options.c_iflag &= ~(ICRNL|IGNCR); 
     options.c_lflag &= ~(ICANON); 

     options.c_cflag &= ~CSTOPB; 

     options.c_iflag |= INPCK; 

     options.c_cc[VTIME] = 150; // 15 seconds 
     options.c_cc[VMIN] = 0; 

     tcflush(fd_uart,TCIFLUSH); /* Update the options and do it NOW */ 

     if(tcsetattr(fd_uart,TCSANOW,&options) != 0) 
     { 
       perror("SetupSerial 3"); 
       return (FALSE); 
     } 
     return (TRUE); 
} 

void initUart(int argc, char **argv) 
{ 
     char devname_head[10] = "/dev/"; 
     char dev_name[20]; 

     if(argc < 2) 
     { 
       printf("Please input './test_uart ttyOx'\n"); 
       exit(1); 
     } else { 

       strcpy(dev_name, devname_head); 
       strcat(dev_name, argv[1]); 

       fd_uart = open(dev_name, O_RDWR); 
       if(fd_uart < 0) 
       { 
         perror("error to open /dev/ttyOx\n"); 
         exit(1); 
       } else if (fd_uart == 0) { 
         printf("Can't Open Serial Port!\n"); 
         exit(0); 
       } else { 
         //Setup 
         set_speed();     //baud:38400 
         if (set_Parity() == FALSE)  //8,1,n 
         { 
           printf("Set Parity Error\n"); 
           exit(1); 
         } 
       } 
     } 
} 

void writeUartString(char *buf) 
{ 
     if (write(fd_uart,buf,strlen(buf)) < 0) 
     { 
       printf("write error\n"); 
     } 
} 

void writeUartMsg(char *buf,int num) 
{ 
     if (write(fd_uart,buf,num) < 0) 
     { 
       printf("write error\n"); 
     } 
} 

int readUart(char *buf) 
{ 
     int num = 0, i = 0; 
     num = read(fd_uart,buf,sizeof(buf)); 
     if(num < 0){ 
       printf("read error\n"); 
     } 
     return num; 
} 

void closeUart(void) 
{ 
     close(fd_uart); 
} 
/*======================================================*/ 

/*==================Uart.h===================*/ 
#ifndef UART_H 
#define UART_H 

void set_speed(void); 
int set_Parity(void); 
void initUart(int argc, char **argv); 
void writeUartString(char *buf); 
void writeUartMsg(char *buf,int num); 
void closeUart(void); 

extern int fd_uart; 

#endif 
/*=======================================*/ 

/*================test.c=================*/ 
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "Uart.h" 

int main(int argc, char **argv) 
{ 
     int i = 0,temp = 0; 
     char buf[64] = {0}; 
     initUart(argc,argv); 
     while(1){ 
       writeUartString("waiting\n"); 
       printf("waiting\n"); 
       memset(buf,0,64); 
       temp = readUart(buf); 
       printf("readUart's return value = %d\n",temp); 
       if (temp > 0){ 
         printf("get something\n"); 
         printf("%s\n",buf); 
       } 
       sleep(1); 
     } 
     return 0; 
} 
/*====================================*/ 

沒有人得到這個情況呢?

回答

0

您與

options.c_lflag &= ~(ICANON); 

改變它,至少,以

options.c_lflag &= ~(ICANON | ECHO); 

離開呼應enableed隨着你在原來的狀態留給所有的標誌,而不是隻是ICANON