首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我在BeagleboneBlack Uart上遇到了大麻烦

我在BeagleboneBlack Uart上遇到了大麻烦
EN

Stack Overflow用户
提问于 2016-12-26 07:17:17
回答 1查看 66关注 0票数 0

我的beagleboneblack(我们称之为"BBB")运行3.8.13-bone 47,我已经被一个bug困扰了两个星期。

我的问题是:当我的BBB得到一个字符串,我的BBB将发送相同的字符串到另一个终端。

例如:我的带有Uart2USB桥的笔记本电脑发送了一个字符串"asd",然后BBB将得到"asd".But,而BBB将向我的laptop.And发送"asd“所有在BBB(Uart1,Uart2,Uart4)上的Uart模块都做了同样的事情。

顺便说一下,我通过使用两个Uart(一个用于TX,另一个用于RX).Fortunately来避免这个错误,但我仍然想知道原因和解决方案。

这是我的Uart.c、Uart.h和test.c:

代码语言:javascript
复制
/*====================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;
}
/*====================================*/

有人也遇到这种情况了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-26 09:16:52

你留下了回音

代码语言:javascript
复制
options.c_lflag &= ~(ICANON );

至少,把它更改为

代码语言:javascript
复制
options.c_lflag &= ~(ICANON | ECHO );

您将保留在它们原来的状态下的所有标志,而不是除了那个ICANON

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41327737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档