LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1325|回复: 2

linux下读串口设备(GSM)不能一次读完

[复制链接]
发表于 2007-2-1 05:36:53 | 显示全部楼层 |阅读模式
小弟最近在做一个通过串口收发短信的程序。目前遇到一个问题是,当通过串口向GSM模块发送
AT指令时,AT指令的回复有时能读到完整的回复,有时不能。比如读取一条短信时,AT+CMGR=<index>,GSM模块回复的短信通过串口只能读到前几个字节就返回了,而剩下的问题部分数据,在下次读取串口时才能返回。不知道是不是因为我的串口设置出了问题。串口设置代码如下,希望大家能帮帮忙。
int set_termio2(int fd)   
{   
    struct   termios   term_attr;
    tcgetattr(fd, &term_attr) ;
   
    // 9600bps, 8bit, no parity check, 1 stopbit
    term_attr.c_iflag &= ~(IXON|IXOFF|IXANY|INLCR|IGNCR|ICRNL|ISTRIP);   
    term_attr.c_lflag &= ~(ISIG|ECHO|ICANON|NOFLSH);   
    term_attr.c_cflag &= ~CBAUD;   
    term_attr.c_cflag |= B9600;
    term_attr.c_oflag &= ~(OPOST|ONLCR|OCRNL);   
    tcflush(fd, TCIOFLUSH) ;
   
    tcsetattr(fd, TCSANOW, &term_attr) ;
    return   0;   
}
发表于 2007-2-1 13:00:44 | 显示全部楼层
这是正常现象。读慢速设备或者网络时常有这样的情况发生,所以在程序设计时要有针对性地进行判断,就是说,设置合适的超时时间,并在必要的情况下连续重读(写的时候也往往需要连续重写)。另外要设置合适的传输速率。除了用 termio 设置外,我隐约记得有一条 AT 指令 AT+IPR 可以设置设备速度。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-2-1 16:46:54 | 显示全部楼层
原来是由于设备时间慢的原因啊。我想的话,可能要连续重读了。对于波特率而言,我是有设置的,两边设置的都是相同的9600。谢谢你的回复!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表