当前位置: 技术问答>linux和unix
请教一个串口读写问题
来源: 互联网 发布时间:2016-12-13
本文导语: 我想用ARM去控制一个GPRS模块,他们之间通过串口通信 控制器发送字符AT,模块会响应AT OK 现在问题是: 我发送了AT后,模块需要时间相应指令 如果马上read,就会出现没有读完全响应内容的情况 请问该怎样处理这种...
我想用ARM去控制一个GPRS模块,他们之间通过串口通信
控制器发送字符AT,模块会响应AT OK
现在问题是:
我发送了AT后,模块需要时间相应指令
如果马上read,就会出现没有读完全响应内容的情况
请问该怎样处理这种情况?最好不要用延时解决
控制器发送字符AT,模块会响应AT OK
现在问题是:
我发送了AT后,模块需要时间相应指令
如果马上read,就会出现没有读完全响应内容的情况
请问该怎样处理这种情况?最好不要用延时解决
|
因为AT指令有很多,是变长的,如果指定过小会漏掉后面的内容,如果过大就会不停等待
------------------
果然困难啊
read总是一个阻塞方法吧,你也需要在read的参数里给出你需要得到的字节个数吧
你的read是怎么写的呢?
------------------
果然困难啊
read总是一个阻塞方法吧,你也需要在read的参数里给出你需要得到的字节个数吧
你的read是怎么写的呢?
|
不用延时,是否可以用中断呢?
串口收到数据即产生消息,
再用一个超时处理,超过一定时间没有收到正确的数据即认为没有回复
串口收到数据即产生消息,
再用一个超时处理,超过一定时间没有收到正确的数据即认为没有回复
|
通过struct termios结构体设置它的每次最少读取的字符数
这样就能一直阻塞到足够的响应数据了
http://blog.csdn.net/againyuan/archive/2009/02/18/3905380.aspx
大概就是下面的流程:
struct oldtio,newtio;
/*将目前终端机的结构保存至oldtio结构*/
tcgetattr(fd,&oldtio);
/*开始新的设置,首先借鉴旧的*/
tcgetattr(fd,&newtio);
newio.c_cc[VMIN]=1; 指定每次至少读1个byte ,随你便
..............//进行其他设置
/*清除所有队列在串口的输入*/
tcflush(fd,TCIFLUSH);
/*新的termios的结构作为通信端口的参数*/
tcsetattr(fd,TCSANOW,&newtio);
这样就能一直阻塞到足够的响应数据了
http://blog.csdn.net/againyuan/archive/2009/02/18/3905380.aspx
大概就是下面的流程:
struct oldtio,newtio;
/*将目前终端机的结构保存至oldtio结构*/
tcgetattr(fd,&oldtio);
/*开始新的设置,首先借鉴旧的*/
tcgetattr(fd,&newtio);
newio.c_cc[VMIN]=1; 指定每次至少读1个byte ,随你便
..............//进行其他设置
/*清除所有队列在串口的输入*/
tcflush(fd,TCIFLUSH);
/*新的termios的结构作为通信端口的参数*/
tcsetattr(fd,TCSANOW,&newtio);
|
中断可没必要 那就你等于自己写串口驱动了
|
不知道开辟两个进程可以么?
----------
那还不是解决不了延时问题
至少,你的设备只要有了响应,应该是一次就准备好了要返回的全部数据,否则就一直是空
所以我刚才说的设置
newio.c_cc[VMIN]=1; 指定每次至少读1个byte
可以防止设备完全没有准备好的时候,read提前返回
你先试试看行不行
----------
那还不是解决不了延时问题
至少,你的设备只要有了响应,应该是一次就准备好了要返回的全部数据,否则就一直是空
所以我刚才说的设置
newio.c_cc[VMIN]=1; 指定每次至少读1个byte
可以防止设备完全没有准备好的时候,read提前返回
你先试试看行不行
|
波特率改大一点,试试,看行不行。
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。