当前位置: 技术问答>linux和unix
请问如何判断往串口的写操作(write)已经完成???高分请教!!!
来源: 互联网 发布时间:2015-06-27
本文导语: 我想循环地往串口1和串口2写数据: while(1) { if(往串口1的写操作write已经完成) 则往串口2写; if(往串口2的写操作write已经完成) 结束本次循环; } 请问如何判断往串口的写操作(write)已经完成??? 用ioctl(fd,FION...
我想循环地往串口1和串口2写数据:
while(1)
{
if(往串口1的写操作write已经完成) 则往串口2写;
if(往串口2的写操作write已经完成) 结束本次循环;
}
请问如何判断往串口的写操作(write)已经完成???
用ioctl(fd,FIONREAD,&bytes);可以判断输入缓冲的字节数,
能否用类似的方法解决上面的问题?
while(1)
{
if(往串口1的写操作write已经完成) 则往串口2写;
if(往串口2的写操作write已经完成) 结束本次循环;
}
请问如何判断往串口的写操作(write)已经完成???
用ioctl(fd,FIONREAD,&bytes);可以判断输入缓冲的字节数,
能否用类似的方法解决上面的问题?
|
int ret;
fd_set w;
struct timeval tv;
while(数据未写完) { // 数据写完退出
FD_ZERO(&w);
FD_SET(fd,&w);
tv.tv_sec=0;
tv.tv_usec=100000; // 超时时间设置为100 毫秒
ret=select(fd+1,NULL,&w,NULL,&tv);
if(ret0) { // 已写完
if(FD_ISSET(fd,&w)) { // 恒为真
// 继续写剩余数据
}
}
// else if(ret==0); // 超时没写完,继续等待
}
这样就可以分批写数据(当然也可以一次写所有数据),反正当前数据写完则select将返回>0
fd_set w;
struct timeval tv;
while(数据未写完) { // 数据写完退出
FD_ZERO(&w);
FD_SET(fd,&w);
tv.tv_sec=0;
tv.tv_usec=100000; // 超时时间设置为100 毫秒
ret=select(fd+1,NULL,&w,NULL,&tv);
if(ret0) { // 已写完
if(FD_ISSET(fd,&w)) { // 恒为真
// 继续写剩余数据
}
}
// else if(ret==0); // 超时没写完,继续等待
}
这样就可以分批写数据(当然也可以一次写所有数据),反正当前数据写完则select将返回>0
|
(3)另外,用ioctl(fd ,FIONRESD ,&bytes); 可以检查接收缓冲的字节数,我的问题是:
利用怎样的延时(尽可能小,比如用9600的波特率)和检查接收缓冲的字节数才能判串口的接收已经完成?在判断接收完成后才用read(fd ,mybuff,bytes)把串口接收缓冲中字节串读到自己的字节缓冲mybuff中。
这个问题嘛?
你的想法是不是,让接受端在接受完数据之前,就知道发送端一次要发送多少数据?
如果是这样的话,我的做法是,发送的数据里面包括一次要发送的数据大小。接受端首先读取数据长度,然后循环读完所有数据。
利用怎样的延时(尽可能小,比如用9600的波特率)和检查接收缓冲的字节数才能判串口的接收已经完成?在判断接收完成后才用read(fd ,mybuff,bytes)把串口接收缓冲中字节串读到自己的字节缓冲mybuff中。
这个问题嘛?
你的想法是不是,让接受端在接受完数据之前,就知道发送端一次要发送多少数据?
如果是这样的话,我的做法是,发送的数据里面包括一次要发送的数据大小。接受端首先读取数据长度,然后循环读完所有数据。
|
我没有考虑那么多,如果写我是通过这么一个循环来做的
nwrite(int ttyfd,char *buf,int len){
int count;
int now=len;
do{
count =write(ttyfd,buf,now);
if (count==now) break;
now -=count;
buf +=count;
}while (ount==0);
}
再度的时候,先判断是否缓存中有一帧的内容。
int nread(int ttyfd,char *buf,int len){
int count,
if(ioctl(ttyfs,FIOREAD,&count)
nwrite(int ttyfd,char *buf,int len){
int count;
int now=len;
do{
count =write(ttyfd,buf,now);
if (count==now) break;
now -=count;
buf +=count;
}while (ount==0);
}
再度的时候,先判断是否缓存中有一帧的内容。
int nread(int ttyfd,char *buf,int len){
int count,
if(ioctl(ttyfs,FIOREAD,&count)