luohuawuhen

luohuawuhen

0个粉丝

9

问答

0

专栏

0

资料

luohuawuhen  发布于  2016-11-14 10:34:44
采纳率 0%
9个问答
7351

hi3516a串口uart1、uart2只能发送数据,不能接收

 
本帖最后由 luohuawuhen 于 2016-11-14 10:35 编辑

各位坛友,我修改了HI3516A的UART串口驱动,开出了ttyAMA2,测试程序中使用ttyAMA1、ttyAMA2都是可以向外发送数据,但是当PC机上的串口调试助手向板子的串口发送数据,串口的数据寄存器有值,但是这个值读取不出来,又发出去了,是不是发生了自环现象,UART1、2收到的数据又被发送出去了,这个怎么解决?
我来回答
回答7个
时间排序
认可量排序

luohuawuhen

0个粉丝

9

问答

0

专栏

0

资料

luohuawuhen 2016-11-19 16:01:22
认可0
已解决,程序配置有问题

vikeytwo

0个粉丝

0

问答

0

专栏

0

资料

vikeytwo 2016-11-22 18:15:50
认可0
相同问题,求指导

kennybluezy

0个粉丝

16

问答

0

专栏

0

资料

kennybluezy 2016-11-24 18:44:58
认可0
相同问题,求指导

flynnjiang

0个粉丝

14

问答

0

专栏

0

资料

flynnjiang 2016-12-05 20:16:22
认可0
同求,请楼主分享以下啊

fobyellow

0个粉丝

6

问答

0

专栏

0

资料

fobyellow 2016-12-06 11:04:31
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41523&ptid=13349]luohuawuhen 发表于 2016-11-19 16:01[/url]
已解决,程序配置有问题[/quote]

请教下问题,我们使用UART1做485的半双工接口,收发都没有问题,但是在发送的时候,无法判断是否已经发送完成,我们现在的处理办法是发送后延时一段时间后切换到接收状态,会遇到外设响应太快总线发生冲突的问题,求解决思路,谢谢!

chengyinbing

1个粉丝

5

问答

0

专栏

0

资料

chengyinbing 2017-04-06 15:19:07
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=41523&ptid=13349]luohuawuhen 发表于 2016-11-19 16:01[/url]
已解决,程序配置有问题[/quote]

我的问题跟你一样,请问程序配置,要注意什么地方呢?

chengyinbing

1个粉丝

5

问答

0

专栏

0

资料

chengyinbing 2017-04-06 17:00:38
认可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 );
}


或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

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

Markdown 语法

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

举报类型

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

详细说明

易百纳技术社区