当前位置: 技术问答>linux和unix
请教linux下串口编程的几个问题,高手相助!
来源: 互联网 发布时间:2015-03-19
本文导语: 1: 请问串口设置中c_cflag中的CRTSCTS这个参数,书上说是设置硬件流控的。 请问如果我设置了c_cflag|=CRTSCTS;有什么作用?它的硬件流控体现在哪里? 如果我取消硬件流控c_cflag&=~CRTSCTS,我还是可以通过 ioctl(fd,TIOCMGET,&sta...
1:
请问串口设置中c_cflag中的CRTSCTS这个参数,书上说是设置硬件流控的。
请问如果我设置了c_cflag|=CRTSCTS;有什么作用?它的硬件流控体现在哪里?
如果我取消硬件流控c_cflag&=~CRTSCTS,我还是可以通过
ioctl(fd,TIOCMGET,&status);
status|=TIOCM_RTS;
ioctl(fd,TIOCMSET,&status);
来设置RTS等信号的呀。给我的感觉是在c_cflag中设置CRTSCTS这个参数没有什么用。请教CRTSCTS到底有什么用,怎么用?
2:
怎样将向串口写数据的函数write设置成同步模式,即发完所有数据后才返回。
因为我的一个程序,write完,我就把RTS置为无效,结果发现modem根本没有收到数据,只能sleep一点时间后,等modem收到数据后,再把RTS置为无效。因此说明,write是异步的,它的返回不代表串口已经发完,只是说明已把数据放进了输入缓冲区。
我想要write变成同步模式,我就不用再sleep了,因为我不知道每次要sleep多长时间才能够发完。
请各位高手一定帮忙,小弟不胜感激!!!
请问串口设置中c_cflag中的CRTSCTS这个参数,书上说是设置硬件流控的。
请问如果我设置了c_cflag|=CRTSCTS;有什么作用?它的硬件流控体现在哪里?
如果我取消硬件流控c_cflag&=~CRTSCTS,我还是可以通过
ioctl(fd,TIOCMGET,&status);
status|=TIOCM_RTS;
ioctl(fd,TIOCMSET,&status);
来设置RTS等信号的呀。给我的感觉是在c_cflag中设置CRTSCTS这个参数没有什么用。请教CRTSCTS到底有什么用,怎么用?
2:
怎样将向串口写数据的函数write设置成同步模式,即发完所有数据后才返回。
因为我的一个程序,write完,我就把RTS置为无效,结果发现modem根本没有收到数据,只能sleep一点时间后,等modem收到数据后,再把RTS置为无效。因此说明,write是异步的,它的返回不代表串口已经发完,只是说明已把数据放进了输入缓冲区。
我想要write变成同步模式,我就不用再sleep了,因为我不知道每次要sleep多长时间才能够发完。
请各位高手一定帮忙,小弟不胜感激!!!
|
一样,呵呵
|
c_cflag|=CRTSCTS肯定是设置硬件流控。不过楼主,和MODEM通信好像不需要2、3交叉啊?你不是标准串口?
在设置c_cflag&=~CRTSCTS后我想一定可以通过ioctl重设,这其实可能是设置文件属性的两种方法吧,最终可能还是通过ioctl来实现。
还有你的第二个问题,我做的程序也是非诸塞模式下的串口读写,也需要控制RTS,应为我发送需要置高,接收需要置低,不过和MODEM通信,好像RTS置高就行了,不用置低的。
等数据发送完之后再返回,可能不好做到吧?write写到了文件缓冲区,但是串口自己还有fifo呢,不好控制吧?可能阻塞模式也实现不了。
在设置c_cflag&=~CRTSCTS后我想一定可以通过ioctl重设,这其实可能是设置文件属性的两种方法吧,最终可能还是通过ioctl来实现。
还有你的第二个问题,我做的程序也是非诸塞模式下的串口读写,也需要控制RTS,应为我发送需要置高,接收需要置低,不过和MODEM通信,好像RTS置高就行了,不用置低的。
等数据发送完之后再返回,可能不好做到吧?write写到了文件缓冲区,但是串口自己还有fifo呢,不好控制吧?可能阻塞模式也实现不了。
|
设置硬件流控时,就不需再控制RTS,由硬件自动控制了。