+ -
当前位置:首页 → 问答吧 → 有关串口乱码的问题

有关串口乱码的问题

时间:2010-11-26

来源:互联网

最近在串口通信上遇到了问题,我的串口配置程序如下:
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 时,解受到的数据就出现乱码的现象!
真的不知道,原因出现在哪里!
希望高手们,大虾们,帮我解决下这个问题!
谢谢……

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

作者: 永福1986   发布时间: 2010-11-26

遇到过乱码问题,修改波特率(驱动中DLH,DLL两个寄存器的值,改大或改小点试试)可能修正问题,但也不一定。

作者: EZWORD   发布时间: 2010-11-26

热门下载

更多