mumuzhijia

mumuzhijia

0个粉丝

3

问答

0

专栏

0

资料

mumuzhijia  发布于  2016-07-22 17:03:23
采纳率 0%
3个问答
4304

HI3520D的UART1串口收发,只能发不能收的问题

 
HI3520D的UART1串口可以向外发,但是其他数据向串口发,串口的数据寄存器有值,但是这个值读取不出来,又发出去了,是不是发生了自环现象,UART1收到的数据又被发送出去了,这个怎么解决?需要改哪个寄存器配置吗
我来回答
回答10个
时间排序
认可量排序

vikeytwo

0个粉丝

0

问答

0

专栏

0

资料

vikeytwo 2016-11-23 18:19:51
认可0
相同问题,求指导

chengyinbing

1个粉丝

5

问答

0

专栏

0

资料

chengyinbing 2017-04-06 17:02:56
认可0
问题已解决,不是硬件问题,是参数设置问题:请参考以下代码
#include
#include
#include
#include

#define RS485_DEV                        "/dev/ttyAMA1"

CRS485::CRS485()
{
    hasRs485Inited = false;
    mFd = -1;
}

CRS485::~CRS485()
{
    DEBUG_INFO(DEV_MNG, "RS485 exit");
    if( mFd != -1 )
    {
        close( mFd );
    }
    hasRs485Inited = false;
}

int CRS485::setRS485(int band, int stopBit, int parity, int dataBit)
{
    int status = -1;

    struct termios options;
    tcgetattr( mFd, &options );
    tcflush( mFd, TCIOFLUSH ); // discard data written to RS485 that hasn't not been transmitted
    // set band rate
    switch( band )
    {
    case 1200:
        cfsetispeed( &options, B1200 );
        cfsetospeed( &options, B1200 );
        break;
    case 2400:
        cfsetispeed( &options, B2400 );
        cfsetospeed( &options, B2400 );
        break;
    case 4800:
        cfsetispeed( &options, B4800 );
        cfsetospeed( &options, B4800 );
        break;
    case 9600:
        cfsetispeed( &options, B9600 );
        cfsetospeed( &options, B9600 );
        break;
    case 19200:
        cfsetispeed( &options, B19200 );
        cfsetospeed( &options, B19200 );
        break;
    case 38400:
        cfsetispeed( &options, B38400 );
        cfsetospeed( &options, B38400 );
        break;
    case 57600:
        cfsetispeed( &options, B57600 );
        cfsetospeed( &options, B57600 );
        break;
    default:
        DEBUG_ERROR(DEV_MNG, "Band rate:%d is not supported, now use 9600", band);
        cfsetispeed( &options, B9600 );
        cfsetospeed( &options, B9600 );
        break;
    }
    status = tcsetattr( mFd, TCSANOW, &options );
    if( status != 0 )
    {
        DEBUG_API_ERROR( DEV_MNG, "tcsetattr(TCSANOW)");
        return -1;
    }
    tcflush( mFd, TCIOFLUSH );

    status = tcgetattr( mFd, &options );
    if( status < 0 )
    {
        DEBUG_API_ERROR( DEV_MNG, "tcgetattr()");
        return -1;
    }

    // set data bits
    options.c_cflag &= (~CSIZE);
    switch( dataBit )
    {
    case 5:
        options.c_cflag |= CS5;
        break;
    case 6:
        options.c_cflag |= CS6;
        break;
    case 7:
        options.c_cflag |= CS7;
        break;
    case 8:
        options.c_cflag |= CS8;
        break;
    default:
        DEBUG_ERROR(DEV_MNG, "Unsupported data bits(%d)", dataBit);
        return -1;
        break;
    }

    // set parity
    switch( parity )
    {
    case 0: // None
        options.c_cflag &= (~PARENB);
        options.c_iflag &= (~INPCK);
        break;
    case 1: // ODD
        options.c_cflag |= (PARODD | PARENB);
        options.c_iflag |= INPCK;
        break;
    case 2: // Even
        options.c_cflag |= PARENB;
        options.c_cflag &= (~PARODD);
        options.c_iflag |= INPCK;
        break;
    default:
        DEBUG_ERROR(DEV_MNG, "Unsupported parity type:%d", parity);
        return -1;
        break;
    }

    // set stop bits
    switch( stopBit )
    {
    case 1:
        options.c_cflag &= (~CSTOPB);
        break;
    case 2:
        options.c_cflag |= CSTOPB;
        break;
    default:
        DEBUG_ERROR(DEV_MNG, "Unsupported stop bits:%d", stopBit);
        return -1;
        break;
    }
    /* Set input parity option */
    if (parity != 0)
        options.c_iflag |= INPCK;
    /* Set Raw Mode */
    options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
    options.c_oflag  &= ~OPOST;   /*Output*/
    tcflush( mFd, TCIFLUSH );
    options.c_cc[VTIME] = 150;
    options.c_cc[VMIN] = 7;

    status = tcsetattr( mFd, TCSANOW, &options );
    if( status != 0 )
    {
        DEBUG_API_ERROR(DEV_MNG, "tcsetattr()");
        return -1;
    }

    return 0;
}

int CRS485::init(int band, int stopBit, int parity, int dataBit)
{
    if( hasRs485Inited )
    {
        DEBUG_ERROR(DEV_MNG, "RS485 has been inited");
        return -1;
    }

    int ret = -1;

    // open device
    mFd = open( RS485_DEV, O_RDWR );
    if( mFd < 0 )
    {
        DEBUG_API_ERROR(DEV_MNG, "open()");
        return -1;
    }

    ret = setRS485(band, stopBit, parity, dataBit);
    if(ret == -1)
        goto ERROR;

    // success
    hasRs485Inited = 1;
    DEBUG_INFO(DEV_MNG, "RS485 init success");
    return 0;

ERROR:
    close( mFd );
    return -1;
}

int CRS485::sendData(char *data, int dataLen)
{
    if( data == NULL )
        return -1;
    if( dataLen <= 0 )
        return -1;

    if( hasRs485Inited != 1 )
    {
        DEBUG_ERROR(DEV_MNG, "Can't send 485 data before inited");
        return -1;
    }

    return write( mFd, data, dataLen );
}

int CRS485::recvData(char *data, int dataLen, int maxWaitTime)
{
    if( data == NULL )
        return -1;
    if( dataLen <= 0 )
        return -1;

    if( hasRs485Inited != 1 )
    {
        DEBUG_ERROR(DEV_MNG, "Can't recv 485 data before inited");
        return -1;
    }

    int index = 0;
    int rc = 0;
    int rcnum = dataLen;
    struct timeval tv;
    fd_set readfd;
    tv.tv_sec = maxWaitTime / 1000;
    tv.tv_usec = maxWaitTime % 1000 * 1000;
    FD_ZERO(&readfd);
    FD_SET(mFd, &readfd);
    rc = select(mFd + 1, &readfd, NULL, NULL, &tv);
    if(rc > 0)
    {
        while(dataLen)
        {
            rc = read(mFd, &data[index], 1);
            if(rc > 0)
                index = index + 1;
            dataLen = dataLen - 1;
        }
        if(index != rcnum)
            return -1;
        return rcnum;
    }
    else
    {
        return -1;
    }
    return -1;

    //return read( mFd, data, dataLen );
}

fayfive

0个粉丝

13

问答

0

专栏

0

资料

fayfive 2017-04-06 20:42:15
认可0
应该设置哪一个?我也是遇到这样的问题,值读取不出来,又发出去了,是不是发生了自环现象

yangzi8000

0个粉丝

5

问答

0

专栏

0

资料

yangzi8000 2017-04-07 21:03:51
认可0
这个顶一下。。。。485

applepen

0个粉丝

11

问答

0

专栏

11

资料

applepen 2017-05-14 23:27:22
认可0
本帖最后由 applepen 于 2020-3-27 22:32 编辑

options.c_cflag &=~CRTSCTS;        //取消硬件流控
options.c_lflag = 0;

hero

0个粉丝

1

问答

0

专栏

0

资料

hero 2017-06-30 15:08:13
认可0

好,不错,mark啦

13915426184

0个粉丝

15

问答

0

专栏

0

资料

13915426184 2017-09-12 10:38:08
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41763&ptid=12051]vikeytwo 发表于 2016-11-23 18:19[/url]
相同问题,求指导[/quote]

你好,请问你后来是怎么解决的?我也遇到了这个问题

testforvc

0个粉丝

1

问答

0

专栏

0

资料

testforvc 2017-09-28 10:30:48
认可0
多谢分享 学习了

vikeytwo

0个粉丝

0

问答

0

专栏

0

资料

vikeytwo 2017-10-10 07:00:18
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=63864&ptid=12051]13915426184 发表于 2017-9-12 10:38[/url]
你好,请问你后来是怎么解决的?我也遇到了这个问题[/quote]

过了好久了,我也记不太清了,主要还是修改Flag

realdada

1个粉丝

12

问答

0

专栏

0

资料

realdada 2018-01-05 16:15:10
认可0
搞通了,加上下面这两句就可以了
/* Set Raw Mode */
    options.c_lflag  &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
    options.c_oflag  &= ~OPOST;   /*Output*/
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区