转载:关于linux的串口

 转自:http://putstar.21ic.org/user1/1505/archives/2008/54316.html

 

linux的串口总感觉有些怪异, 首先是只支持七位数据,不支持8O1/8E1这样的数据格式;另外在使用中还发现收到的0x0D都变成了0x0A(8O1,raw mode)。下面是一些可以参考的链接:

user1/2613/archives/2008/48341.html

经查是串口参数设置的问题, 不过我在确定错误的时候弄错了一点:不是0x0c而是0x0d被映射成了0x0A(要是早知道是0x0d就没这么麻烦了,看来以后要更仔细才行).循着0x0d(CR)->0x0a(NL)的映射一找,就找到了错误所在.把代码贴出来分享吧:
    tcgetattr( fd, &Opt );
    Opt.c_cflag   =    (PARENB | PARODD | CS8 | CREAD | CLOCAL);
    Opt.c_cflag   &= ~CRTSCTS;    /* disable hw flow ctrl */
    Opt.c_cflag   &= ~CSTOPB;        /* 1 stop bit */
    Opt.c_iflag   &= ~(IXON | IXOFF | IXANY); // Disable sw flow ctrl
    Opt.c_iflag   |=   INPCK;        /* enable parity checking */
    Opt.c_iflag   &= ~ISTRIP;        /* don't strip bit7 */
    Opt.c_iflag   &= ~(ICRNL | PARMRK | IGNCR | IUCLC);        /* don't map CR to NL */

    cfsetispeed( &Opt, B38400 );    /* 设置为 38400 bps */
    cfsetospeed( &Opt, B38400 );    /* 只有很少的硬件支持输入/输出波特率不同 */
    tcflush( fd, TCIOFLUSH );
    Opt.c_cc[VTIME]  =   5;        /* 设置超时 500 ms */
    Opt.c_cc[VMIN]   =   0;
    /* for raw mode */
    Opt.c_lflag   &=   ~( ICANON | ECHO | ECHOE | ISIG );   /* Input */
    Opt.c_oflag   &=   ~OPOST;   /* Output */

程序中的红字是解决这一问题的关键。修改后程序收发数据完全正常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值