打印

关于imx28系列串口 unhandled status 500180

[复制链接]
2568|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
孙少卿|  楼主 | 2015-11-23 11:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
mxs-auart mxs-auart.2:Unhandled status 500180
mxs-auart mxs-auart.2:Unhandled status 500400
ttySP2:    1  input  overrun(s)
这个问题怎么解决,我在进行串口调试的时候出的问题,波特率硬件设置为38400,偶校验,软件也是这么设置的,跟模拟流量计通讯。求解答 。。。。。。。。。。

相关帖子

沙发
阿南| | 2015-11-24 11:10 | 只看该作者
你把完整的信息帖出来看看

使用特权

评论回复
板凳
孙少卿|  楼主 | 2015-11-25 09:50 | 只看该作者
阿南 发表于 2015-11-24 11:10
你把完整的信息帖出来看看

我找到了,500400这个问题是串口长期工作,没能及时把数据取走,我每次在发送完命令和接收完数据后就把串口清空,这个问题算是解决了。
但是500180是代表奇偶校验错误以及侦错误,这个应该是误码率造成的。
我现在是跟流量计通信,我发完命令后流量计接收到命令就给我返回数据,然后我来接收。
使能电平置高开始发送,置低接收数据。我现在的问题是怎么来控制发送的时间,让它发送完命令后接着接收。
我现在只是找个一个临界点来控制发送。我的代码是这个样子的:
ioctl(fd,DRIVER_UART2_WRON);//使能线电平置高
len=write(fd,buf,8);
usleep(2300);//延时确保命令发送完成
ioctl(fd,DRIVER_UART2_WROFF);//使能线电平置低

我的接收是另外起了一个线程。
现在就是这个确保命令发送完成这个延时,有没有更好的办法来控制?
谢谢回答!!

使用特权

评论回复
地板
孙少卿|  楼主 | 2015-11-25 09:58 | 只看该作者
另外贴上我的串口属性配置,求大神帮忙看看有没有错误的地方:

static int UART2_Init(void)
{
    struct termios opt; //属性描述
    fdUart2 = open(DEV_UART2, O_RDWR | O_NOCTTY);            
    if(fdUart2 < 0)
    {
        perror(DEV_UART2);
        return -1;
    }

    tcgetattr(fdUart2, &opt);     //获取串口属性结构体对象
    cfsetispeed(&opt, B38400);     //设置输入波特率
    cfsetospeed(&opt, B38400);     //设置输出波特率

    /* raw mode */   //偶校验

    opt.c_lflag   &=   ~(ECHO | ICANON | IEXTEN |ISIG); //设置本地标志:不进行回送,关闭规范输入,关闭扩充输入字符处理,关闭终端产生的信号
    opt.c_iflag   &=  ~(IXON | ISTRIP);       // 关闭输出流控制, 不剥除第8位
    opt.c_iflag   |= (ICRNL | BRKINT | INPCK);// 将输入的CR转换为NL,使得输入和输出队列被刷新 ,打开奇偶校验
    opt.c_oflag   &=   ~(OPOST);              // 设置输出标志:不执行输出处理
    opt.c_cflag   &=   ~(PARODD | CSIZE);     // 关闭输入输出是奇校验 ,使用屏蔽位
    opt.c_cflag   |=   (CS8 | CLOCAL | CREAD | PARENB);//8位数据位,保证程序不会占用串口,能够从串口读取输入数据,允许输出产生奇偶信息以及输入的奇偶校验

    /*'DATA_LEN' bytes can be read by serial*/

    opt.c_cc[VMIN]   =   DATA_LEN;   //读取字符的最少个数                                   
    opt.c_cc[VTIME]  =   1;        //读取一个字符等待1*(1/10)s
   
    tcflush(fdUart2,TCIOFLUSH);  //清空所有正在发生的IO数据
   
    if (tcsetattr(fdUart2, TCSANOW, &opt) < 0) //激活配置(将修改后的termios数据设置到串口)
    {
        return   -1;
    }

    return fdUart2;
}

使用特权

评论回复
5
阿南| | 2015-11-25 10:44 | 只看该作者
孙少卿 发表于 2015-11-25 09:50
我找到了,500400这个问题是串口长期工作,没能及时把数据取走,我每次在发送完命令和接收完数据后就把串 ...

串口是全双工的,发送和接收分别有中断的,不需要控制吧

使用特权

评论回复
6
孙少卿|  楼主 | 2015-11-25 14:28 | 只看该作者
阿南 发表于 2015-11-25 10:44
串口是全双工的,发送和接收分别有中断的,不需要控制吧

不行啊,我如果不加那个延时的话,它发送的命令是发不完的,不加延时,每次只能发送一个字节。。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

4

帖子

0

粉丝