免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 11939 | 回复: 3

有关串口乱码的问题 [复制链接]

论坛徽章:
0
发表于 2010-11-26 16:48 |显示全部楼层
最近在串口通信上遇到了问题,我的串口配置程序如下:
int set_dev(int nfd, int nSpeed, int nBits, char nEvent, int nStop)
{
        struct termios newtio;
        if (tcgetattr(nfd, &newtio) != 0)
        {
                perror("SetupSerial 1");
                return -1;
        }
        bzero(&newtio, sizeof(newtio));

        /*激活选项*/
        newtio.c_cflag |= CLOCAL | CREAD;
        newtio.c_cflag &= ~CSIZE;

        /*设置数据位数*/
        switch (nBits)
        {
        case 7:
                newtio.c_cflag |= CS7;
                break;
        case 8:
                newtio.c_cflag |= CS8;
                break;
        default:
                newtio.c_cflag |= CS8;
                break;
        }

        /*设置效验类型位*/
        switch (nEvent)
        {
        case 'o':
        case 'O':
                newtio.c_cflag |= PARENB;
                newtio.c_cflag |= PARODD;
                newtio.c_iflag |= (INPCK | ISTRIP);
                break;
        case 'e':
        case 'E':
                newtio.c_cflag |= PARENB;
                newtio.c_cflag &= ~PARODD;
                newtio.c_iflag |= (INPCK | ISTRIP);
                break;
        case 'n':
        case 'N':
                newtio.c_cflag &= ~PARENB;
                newtio.c_iflag &= ~INPCK; /* Enable parity checking */
                break;
        default:
                newtio.c_cflag &= ~PARENB;
                newtio.c_iflag &= ~INPCK;
                break;
        }

        /*设置串口通信速率*/
        switch (nSpeed)
        {
        case 2400:
                cfsetispeed(&newtio, B2400);
                cfsetospeed(&newtio, B2400);
                break;
        case 4800:
                cfsetispeed(&newtio, B4800);
                cfsetospeed(&newtio, B4800);
                break;
        case 9600:
                cfsetispeed(&newtio, B9600);
                cfsetospeed(&newtio, B9600);
                break;
        case 38400:
                cfsetispeed(&newtio, B38400);
                cfsetospeed(&newtio, B38400);
                break;
        case 115200:
                cfsetispeed(&newtio, B115200);
                cfsetospeed(&newtio, B115200);
                break;
        default:
                cfsetispeed(&newtio, B115200);
                cfsetospeed(&newtio, B115200);
                break;
        }

        /* 设置停止位*/
        switch (nStop)
        {
        case 1:
                newtio.c_cflag &= ~CSTOPB;
                break;
        case 2:
                newtio.c_cflag |= CSTOPB;
                break;
        default:
                newtio.c_cflag &= ~CSTOPB;
                break;

        }

        /*设置最少字符和等待时间*/
        newtio.c_cc[VTIME] = 0;
        newtio.c_cc[VMIN] = 0;

        /*刷清输入输出队列*/
        tcflush(nfd, TCIOFLUSH);

        /*激活配置*/
        if ((tcsetattr(nfd, TCSANOW, &newtio)) != 0)
        {
                perror("com set error");
                return -1;
        }
        fprintf(stdout, "set done!\n");

        return 0;
}
在通信波特率为 38400 时,通信正常,arm 板上解受到的数据(ascII码)显示正常。
但是当波特率为 115200 时,解受到的数据就出现乱码的现象!
真的不知道,原因出现在哪里!
希望高手们,大虾们,帮我解决下这个问题!
谢谢……

另外:若这些设置没什么错的话,那那些情况会影响 数据的传输 ?

论坛徽章:
0
发表于 2010-11-26 19:39 |显示全部楼层
遇到过乱码问题,修改波特率(驱动中DLH,DLL两个寄存器的值,改大或改小点试试)可能修正问题,但也不一定。

论坛徽章:
0
发表于 2010-11-29 13:56 |显示全部楼层
波特率 已经同步了 ,问题依然 哦!
郁闷

论坛徽章:
0
发表于 2010-11-29 14:11 |显示全部楼层
示波器测试一下,每bit的实际宽度。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP